在Verilog上实现加法、求逆和或门的4对1多路复用器
这学期我刚开始学习Verilog,我刚刚被一项任务困住了,那就是创建一个Verilog模块,它使用多路复用对2个8位输入执行不同的操作。下面是我写的Verilog代码,我收到了几个我不理解的错误。请帮忙在Verilog上实现加法、求逆和或门的4对1多路复用器,verilog,Verilog,这学期我刚开始学习Verilog,我刚刚被一项任务困住了,那就是创建一个Verilog模块,它使用多路复用对2个8位输入执行不同的操作。下面是我写的Verilog代码,我收到了几个我不理解的错误。请帮忙 module eightbit_palu( input[7:0] a, input[7:0] b, input[1:0] sel, output[7:0] f, output ovf ); reg f, ovf; always @ (a , b, sel) case (s
module eightbit_palu( input[7:0] a, input[7:0] b, input[1:0] sel, output[7:0] f, output ovf );
reg f, ovf;
always @ (a , b, sel)
case (sel)
0 : f = a + b;
ovf = f[8]^f[7];
1 : f[0] = ~b[0];
f[1] = ~b[1];
f[2] = ~b[2];
f[3] = ~b[3];
f[4] = ~b[4];
f[5] = ~b[5];
f[6] = ~b[6];
f[7] = ~b[7];
2 : f[0] = a[0]&b[0]; f[1] = a[1]&b[1]; f[2] = a[2]&b[2]; f[3] = a[3]&b[3]; f[4] = a[4]&b[4];
f[5] = a[5]&b[5]; f[6] = a[6]&b[6]; f[7] = a[7]&b[7];
3 : f[0] = a[0]|b[0]; f[1] = a[1]|b[1]; f[2] = a[2]|b[2]; f[3] = a[3]|b[3]; f[4] = a[4]|b[4];
f[5] = a[5]|b[5]; f[6] = a[6]|b[6]; f[7] = a[7]|b[7];
endcase
endmodule
模拟器显示的错误有:
8:语法错误10:错误:无法理解的大小写表达式。
11:语法错误
19:错误:无法理解的大小写表达式。
19:语法错误
22:错误:无法理解的大小写表达式。
22:语法错误 两个主要问题: 首先,对于Verilog,一系列过程语句必须由
begin
-end
关键字包围
always @ (*) begin
case (sel)
0 : begin
f = a + b;
ovf = f[8]^f[7];
end
1 : begin
f[0] = ~b[0];
...
end
...
endcase
end
其次,您混合了ANSI和非ANSI样式的头文件,在端口列表中将f
和ovf
声明为连接,然后在端口列表中声明为单位reg。选择一种语法:
- ANSI:(注意
)输出寄存器
- 非ANSI标准:
module eightbit_palu( a, b, sel, f, ovf ); input[7:0] a; input[7:0] b; input[1:0] sel; output [7:0] f; output ovf; reg [7:0] f; reg ovf;
建议的改进:
到始终@(a、b、sel)
始终@*
- 自2001年以来,Verilog支持组合逻辑块的通配符敏感度列表。这有助于防止代理RTL与合成门的行为不匹配,并且是Verilog中首选的编码样式。仅当严格遵循1995年版标准时,才需要手动定义灵敏度
- 您可以将条件1、2和3简化为按位操作:(例如,
,1:f=~b;
,2:f=a&b;
)。For循环是另一个选项3:f=a | b;
是一个推断锁存器。闩锁不一定是坏的,但是你需要知道你在用它们做什么。建议您仅在必要时使用ovf
begin
-end
关键字包围
always @ (*) begin
case (sel)
0 : begin
f = a + b;
ovf = f[8]^f[7];
end
1 : begin
f[0] = ~b[0];
...
end
...
endcase
end
其次,您混合了ANSI和非ANSI样式的头文件,在端口列表中将f
和ovf
声明为连接,然后在端口列表中声明为单位reg。选择一种语法:
- ANSI:(注意
)输出寄存器
- 非ANSI标准:
module eightbit_palu( a, b, sel, f, ovf ); input[7:0] a; input[7:0] b; input[1:0] sel; output [7:0] f; output ovf; reg [7:0] f; reg ovf;
建议的改进:
到始终@(a、b、sel)
始终@*
- 自2001年以来,Verilog支持组合逻辑块的通配符敏感度列表。这有助于防止代理RTL与合成门的行为不匹配,并且是Verilog中首选的编码样式。仅当严格遵循1995年版标准时,才需要手动定义灵敏度
- 您可以将条件1、2和3简化为按位操作:(例如,
,1:f=~b;
,2:f=a&b;
)。For循环是另一个选项3:f=a | b;
是一个推断锁存器。闩锁不一定是坏的,但是你需要知道你在用它们做什么。建议您仅在必要时使用ovf
1:
变为1:
。我已经尝试过了,当我将“1:”更改为“1:”时,似乎没有任何区别@无齿标签请同时提供错误。终端输出8:语法错误10:错误:不可理解的大小写表达式。11:语法错误19:错误:不可理解的大小写表达式。19:语法错误22:错误:不可理解的大小写表达式。22:语法错误请编辑您的问题,将其包括在内。我不知道Verilog,但您收到的错误消息相当清楚。语法错误意味着代码编写不正确,请查看您正在执行的操作,看看是否可以发现差异。不可理解的case表达式意味着Verilog期望您的代码也是不正确的。我打赌删除冒号之前的空格,1:
变为1:
。我已经尝试过了,当我将“1:”更改为“1:”时,似乎没有任何区别@无牙舌