我正在为FPGA设计解码器。 Verilog代码可以编译,但是开关不执行任何操作。我仔细检查了一下引脚分配,它们是正确的,所以我猜我的代码存在一些逻辑问题。
/ *真值表是:
enable p a1 a0 y0 y1 y2 y3
0 0 0 0 1 0 0 0
0 0 0 1 0 1 0 0
0 0 1 0 0 0 1 0
0 0 1 1 0 0 0 1
0 1 0 0 0 1 1 1
0 1 0 1 1 0 1 1
0 1 1 0 1 1 0 1
0 1 1 1 1 1 1 0
1 x x x x z z z
这是我的代码:
*/
module decoder2x4(
input enable,
input p,
input [1:0] a,
output [3:0] y
);
assign y[0] = (( ~p & ~a[1] & ~a[0]) | (~a[1] & a[0]) |(a[1] & ~a[0]) | ( p & a[1] & a[0]) ) & ~enable;
assign y[1] = (( ~p & ~a[1] & a[0]) | ( p & ~a[1] & ~a[0]) |( p & a[1] & ~a[0])| ( p & a[1] & a[0])) & ~enable;
assign y[2] = (( ~p & a[1] & ~a[0]) | ( p & ~a[1] & ~a[0]) |( p & ~a[1] & a[0])| ( p & a[1] & a[0])) & ~enable;
assign y[3] = (( ~p & a[1] & a[0]) | ( p & ~a[1] & ~a[0]) |( p & ~a[1] & a[0])| ( p & a[1] & ~a[0])) & ~enable;
endmodule
除非是学校作业,否则这不是您使用HDL代码的方式。
我已将Pierre.Vriens的作品复制到这张桌子上:
enable p a1 a0 y0 y1 y2 y3
0 0 0 0 1 0 0 0
0 0 0 1 0 1 0 0
0 0 1 0 0 0 1 0
0 0 1 1 0 0 0 1
0 1 0 0 0 1 1 1
0 1 0 1 1 0 1 1
0 1 1 0 1 1 0 1
0 1 1 1 1 1 1 0
1 x x x x z z z <<< Probably a typo here
底线有点特殊,因此我使用if
。我们可以在情况下设置重置:
always @( * )
begin
if (enable)
{y0, y1, y2, y3} = 4'hz; // **
else
case ( {p, a1, a0 } )
3'b000 : {y0, y1, y2, y3} = 4'b1000;
3'b001 : {y0, y1, y2, y3} = 4'b0100;
3'b010 : {y0, y1, y2, y3} = 4'b0010;
3'b011 : {y0, y1, y2, y3} = 4'b0001;
3'b100 : {y0, y1, y2, y3} = 4'b0111;
3'b101 : {y0, y1, y2, y3} = 4'b1011;
3'b110 : {y0, y1, y2, y3} = 4'b1101;
3'b111 : {y0, y1, y2, y3} = 4'b1110;
endcase
end // always
请注意,这会尽可能多地复制原始表,从而减少了出错的可能性。具有列编辑功能的编辑器有很大帮助!
**我假设您希望所有输出均为'z'。在您的表中有xzzz。