我需要修改此环形计数器以从最高位移位到最低位,然后重置为最高位。输出应如下所示:
module ringcounter(clk, rst, count);
input clk, rst;
output [5:0] count;
wire clk, rst;
reg [5:0] count = 6'b1;
// Respond to the positive-going pulse edge
always @ ( posedge clk )
begin
if ( ~rst )
begin
count <= count << 1;
count[0] <= count[5];
end
end
// Respond to the positive-going reset signal
always @ ( posedge rst )
begin
count <= 6'b1;
end
endmodule
响铃计数器
module ringcounter_tb();
reg clk = 0, rst = 0;
wire [5:0] count;
always #1 clk = !clk; // Create a clock pulse
initial begin
$monitor("At time %4t, count = %b", $time, count );
#20 rst = 1;
#1 rst = 0;
#20 $finish;
end
ringcounter cntr01 ( .clk(clk), .rst(rst), .count(count) );
endmodule
响铃计数器测试台
active
我对数字逻辑仍然很陌生,所以请耐心等待。我对如何修改这个响铃计数器感到有些困惑。任何形式的帮助,或解释这将如何工作,将不胜感激。
答案 0 :(得分:1)
这里的问题不是很清楚。但有几件事需要修改。
首先,永远不要在两个不同的 always
块中使用相同的变量。只需将rst
添加到敏感度列表即可。如下所示:
// sensitive to clock and reset both
always @ ( posedge clk, posedge rst )
begin
if ( ~rst )
begin
count <= count << 1;
count[0] <= count[5];
end
else
count <= 8'b1;
end
使用边缘敏感 always
阻止会导致触发器创建。如果在两个不同的块中完成,则会发生综合问题。这可以通过门和寄存器的逻辑来显示。
此外,在时钟生成期间,建议使用按位否定(~
)。
!
符号表示布尔值或逻辑否定。虽然~
符号代表按位否定。
// Replace this
always #1 clk = !clk;
// With this
always #1 clk = ~clk;
在rst
之后应用20ns
并在20ns
之后终止模拟将不是您想要的。您可能希望改为使用#200 $finish;
。
这些是我想澄清的一些观点。我在EDAPlayground here处模拟了代码,也许您希望看到波形,这似乎是根据相关描述的那个。
有关合成的更多指南可以从this PDF获得。
有关详细信息,请参阅Always block hardware implementation和Difference in negation operators链接。
答案 1 :(得分:0)
https://gist.github.com/vividvilla/4605985
这应该可行,它包含测试平台以及程序的输出:)