这个代码结构是否朝着正确的方向发展?

时间:2016-02-02 22:40:58

标签: verilog quartus

我正在尝试使用7段显示器。我写了一个模块,我想采取4个输入并更改十六进制输出。 unpacked / packed数组似乎存在问题,我真的不知道我在做什么。任何帮助非常感谢。

module hexDisplay(hex, c0, c1, c2, c3);
    input c0;
    input c1;
    input c2;
    input c3;      
    output hex[6:0];       
    reg out[6:0];

    always@(*)
    begin
        case({c3, c2, c1, c0})
            4'b0000:out [5:0] = 1;
            // 0001-1111 go here
            //...
            default:out [6:0] = 0;
         endcase
      assign hex = out;
     end

endmodule

错误:

  

错误(10773):lab2pre.v上的Verilog HDL错误(55):使用解压缩的数组类型声明模块端口或函数参数需要SystemVerilog扩展   错误(10133):lab2pre.v上的Verilog HDL表达式错误(61):解压缩数组的非法部分选择“out”

     

错误(10133):lab2pre.v上的Verilog HDL表达式错误(62):解包数组的非法部分选择“out”

     

错误(10048):lab2pre.v(64)中的Verilog HDL错误:无法将值直接分配给数组“hex”的全部或部分 - 必须仅对单个元素进行分配

     

错误(10137):lab2pre.v上的Verilog HDL程序分配错误(64):赋值左侧的对象“hex”必须具有可变数据类型

     

错误(10044):lab2pre.v上的Verilog HDL错误(64):表达式无法引用整个数组“out”

     

错误:Quartus II 64位分析&合成不成功。 6个错误,1个警告       错误:峰值虚拟内存:959兆字节       错误:处理已结束:2016年2月2日星期二17:33:35       错误:已用时间:00:00:15       错误:总CPU时间(在所有处理器上):00:00:46

     

错误(293001):Quartus II完全编译失败。 8个错误,1个警告

3 个答案:

答案 0 :(得分:1)

尝试这样的事情。将范围说明符([6:0])移动到信号名称的左侧,并将assign移到always块之外。

module hexDisplay(hex, c0, c1, c2, c3);
    input c0;
    input c1;
    input c2;
    input c3;      
    output [6:0] hex;
    reg [6:0] out;

    always@(*)
    begin
        case({c3, c2, c1, c0})
            4'b0000:out [5:0] = 1;
            // 0001-1111 go here
            //...
            default:out [6:0] = 0;
         endcase
     end
     assign hex = out;

endmodule

答案 1 :(得分:1)

2个错误:

  • 你需要拥有"打包"数组而不是" unpacked"数组 "列" &安培; "十六进制"网。

      

    SystemVerilog支持打包数组和解压缩数据数组。   术语打包数组用于指代声明的维度   在数据标识符名称之前。术语解压缩数组用于   请参阅数据标识符名称后声明的维度。

    位[7:0] c1; //压缩标量位类型的数组    真实的你[7:0]; //解包的真实数组

      

    打包数组是一种将矢量细分为子场的机制,   可以方便地作为数组元素访问。因此,a   packed数组保证被表示为一组连续的   位。

         

    解压缩的数组可能会也可能不会如此表示。一个打包的数组   与打包数组的不同之处在于,打包数组显示为   一个主要的,它被视为一个单一的向量。

    因此,在代码中,您需要 out&十六进制用作连续的 位向量,然后应该打包数组,而不是解压缩 阵列。

    请参阅Systemverilog LRM的主题7.4。

  • 将语句赋值为十六进制,不能与always块一起使用。因为一个 assign语句仅用于对组合逻辑及其进行建模 连续执行。因此调用assign语句 '连续作业声明'因为没有敏感列表。

    所以它不能在always块中,这是按照执行的 敏感度清单。

所以你的最终工作代码如下:

module hexDisplay(hex, c0, c1, c2, c3);
    input c0;
    input c1;
    input c2;
    input c3;      
    output [6:0] hex;       
    reg [6:0] out;

    always@(*)
    begin
        case({c3, c2, c1, c0})
            4'b0000:out [5:0] = 1;
            // 0001-1111 go here
            //...
            default:out [6:0] = 0;
         endcase
     end

    assign hex = out;
endmodule

答案 2 :(得分:0)

总是块中的任何变量必须是reg,这里你总是指定hex,这是默认的wire,所以如果你总是在外面指定hex,你将获得免费编译代码。