Verilog 中的环形计数器
Ring Counter in Verilog
我需要修改此环形计数器以从最高有效位移至最低有效位,然后重置回最高有效位。输出应如下所示:
100000
010000
001000
000100
000010
000001
100000
环形计数器
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
我对数字逻辑还很陌生,所以请多多包涵。对于如何修改这个环形计数器,我只是有点困惑。任何形式的帮助或解释这究竟是如何工作的,将不胜感激。
https://gist.github.com/vividvilla/4605985
这应该可以,它包含测试平台和程序的输出:)
这里的问题不是很清楚。但有几件事需要修改。
首先,永远不要在两个不同的 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;
在20ns
之后应用rst
并在20ns
之后终止模拟应该不是你想要的。您可能想改用 #200 $finish;
。
这些是我想阐明的一些要点。我在EDAPlayground here处模拟了代码,也许你想看波形,这似乎是根据问题描述的
更多关于合成的指南可以从this PDF获得。
请参阅 Always block hardware implementation and Difference in negation operators 链接以获取更多信息。
我需要修改此环形计数器以从最高有效位移至最低有效位,然后重置回最高有效位。输出应如下所示:
100000
010000
001000
000100
000010
000001
100000
环形计数器
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
我对数字逻辑还很陌生,所以请多多包涵。对于如何修改这个环形计数器,我只是有点困惑。任何形式的帮助或解释这究竟是如何工作的,将不胜感激。
https://gist.github.com/vividvilla/4605985
这应该可以,它包含测试平台和程序的输出:)
这里的问题不是很清楚。但有几件事需要修改。
首先,永远不要在两个不同的 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;
在20ns
之后应用rst
并在20ns
之后终止模拟应该不是你想要的。您可能想改用 #200 $finish;
。
这些是我想阐明的一些要点。我在EDAPlayground here处模拟了代码,也许你想看波形,这似乎是根据问题描述的
更多关于合成的指南可以从this PDF获得。
请参阅 Always block hardware implementation and Difference in negation operators 链接以获取更多信息。