Verilog数组元素赋值

时间:2017-06-28 21:16:25

标签: arrays verilog

我正在尝试学习Verilog(我尝试实现的第一个模块是7段显示驱动程序),我遇到数组元素分配不起作用的问题。这是verilog中数组的有效使用吗?

reg [6:0] digits_7seg [0:10];
reg [6:0] segmap;

initial begin
 digits_7seg[0] = 7'b1111110;
 digits_7seg[1] = 7'b0110000;
 digits_7seg[2] = 7'b1101101;
 digits_7seg[3] = 7'b1111001;
 digits_7seg[4] = 7'b0110011;
 digits_7seg[5] = 7'b1011011;
 digits_7seg[6] = 7'b1011111;
 digits_7seg[7] = 7'b1110000;
 digits_7seg[8] = 7'b1111111;
 digits_7seg[9] = 7'b1111011;
end

稍后在always @(posedge refresh_clk_in)块中的某处:

segmap = digits_7seg[ones_in];

问题是将数组元素分配给segmap寄存器似乎失败了。例如,如果我尝试:

segmap = digits_7seg[1];

我在显示屏上什么都没有(segmap似乎包含7'b0000000)。但是,如果我使用直接位图分配,如:

segmap = 7'b0110000;

然后在显示屏上打开适当的段(显示数字1)。这个简单的数组元素赋值有什么问题?

2 个答案:

答案 0 :(得分:0)

模块中没有可以切换时钟的代码。您必须从另一个执行此操作的模块中实例化它,或者在代码中添加以下内容:

always 
    #1 refresh_clk_in = ~refresh_clk_in;

不要忘记在经过多次模拟循环后或某些条件下退出模拟。

关于非阻止分配。在边缘触发的始终块的所有输出上使用非阻塞分配是业界广泛的做法。你最好从一开始就做好。但是,您不需要在中间结果上执行此操作。

答案 1 :(得分:0)

“关于阻塞和非阻塞分配 - 基本上我需要总是@块中的分配按顺序发生:首先,我从输入加载值,然后我需要使用此值作为数组索引获取适当的数组元素,然后我这个数字需要驱动共阴极,以激活显示。有没有办法在一个块中使用非阻塞分配,或者我应该将它们分成不同的,单独的时钟块?这里最好的做法是什么? “

您刚刚定义了顺序逻辑设计。拥有非阻塞语句不是处理此问题的正确方法。 我不确定你所针对的具体细节,但看起来你需要一台有限状态机。 时钟后每个步骤都有设计进度。

将所有顺序逻辑写入一个总是阻塞。这应该对时钟和复位敏感。将所有组合逻辑写在一个单独的always块中。

在第一个时钟周期读取输入,在第二个时钟周期解码,在第三个时钟周期驱动它。 看看你的设计是否允许流水线操作。