我正在尝试使用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个警告
答案 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,你将获得免费编译代码。