【问题标题】:4-to-1 Multiplexer that implements addition, inversion, AND, OR gates on Verilog在 Verilog 上实现加法、反转、与、或门的 4 对 1 多路复用器
【发布时间】:2016-05-06 17:01:44
【问题描述】:

我这个学期刚开始学习 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 (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:语法错误

【问题讨论】:

  • 请同时提供错误信息。
  • 终端输出 8:语法错误 10:错误:无法理解的大小写表达式。 11:语法错误 19:错误:无法理解的大小写表达式。 19:语法错误 22:错误:无法理解的大小写表达式。 22: 语法错误
  • 请编辑您的问题以包含此内容。我不知道 Verilog,但是您收到的错误消息相当清楚。语法错误意味着代码编写不正确,查看你在做什么,看看你是否能发现差异。难以理解的 case 表达式意味着 Verilog 期望您的代码的方式也不正确。我打赌删除冒号前的空格,1 : 变为 1:
  • 我已经尝试过了,当我将“1:”更改为“1:”时,它似乎没有任何区别。 @ToothlessRebel

标签: verilog


【解决方案1】:

两大问题:

首先,对于 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 样式的标头混合在一起,我将 fovf 声明为端口列表中的连线,然后是单个位 reg。选择一种语法:

  • ANSI:(注意output <b>reg</b>

    module eightbit_palu( input[7:0] a, input[7:0] b, 
      input[1:0] sel, output reg [7:0] f, output reg ovf );
    
  • 非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; 
    

建议的改进:

  • always @ (a , b, sel)always @*

    • 自 2001 年以来,Verilog 支持组合逻辑块的通配符敏感度列表。这有助于防止代理 RTL 与综合门行为不匹配,并且是 Verilog 中首选的编码风格。只有严格遵循 1995 版标准时,才需要手动定义灵敏度。
  • 您可以将条件 1、2 和 3 简化为按位运算:(例如,1 : f = ~b;2 : f = a &amp; b;3 : f = a | b;)。 For 循环是另一种选择

  • ovf 是一个推断锁存器。闩锁不一定是坏事,但你需要知道你在用它们做什么。建议您仅在必要时使用 then。 What is inferred latch and how it is created when it is missing else statement in if condition.can anybody explain briefly?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多