logic - 重置约翰逊计数器 Verilog 的问题
问题描述
我需要为 n 位 Johnson Counter 构建测试平台和设计,但我在重置电路时遇到了问题。初始状态应该是 000,但我得到的是 xxx。这发生在所有 n 值上。在这种情况下,我使用 n = 3(3 位)进行测试。正如预期的那样,所有结果都是正确的;唯一的问题是第一个值。
设计
module johnsonCounter (clk, reset, out);
parameter n = 3;
input clk;
input reset;
output reg [n-1:0] out;
genvar i;
generate
for (i = n-1; i >= 0; i=i-1) begin: test
always @ (posedge clk) begin
out[i+1] <= out[i];
if (!reset)
out <= 1;
else begin
out[0] <= ~out[n-1];
end
end
end
endgenerate
endmodule
试验台
module tb;
parameter n = 3;
reg clk;
reg reset;
wire [n-1:0] out;
//Instanciamento uut(Unity Under Test)
johnsonCounter uut(clk, reset, out);
//EPWave
initial begin
$dumpvars;
$dumpfile("dump.vcd");
end
//
always #10 clk = ~clk;
initial begin
{clk, reset} <= 0;
$monitor ("Saidas = %b", out);
repeat (2) @(posedge clk);
reset <= 1;
repeat (2*n) @(posedge clk);
$finish;
end
endmodule
#输出
OUTPUT:
# KERNEL: Saidas = xxx
# KERNEL: Saidas = 001
# KERNEL: Saidas = 011
# KERNEL: Saidas = 111
# KERNEL: Saidas = 110
# KERNEL: Saidas = 100
# KERNEL: Saidas = 000
EXPECTED OUTPUT:
# KERNEL: Saidas = 000
# KERNEL: Saidas = 001
# KERNEL: Saidas = 011
# KERNEL: Saidas = 111
# KERNEL: Saidas = 110
# KERNEL: Saidas = 100
# KERNEL: Saidas = 000
解决方案
使用异步复位而不是同步复位。改变:
always @ (posedge clk) begin
至:
always @ (posedge clk or negedge reset) begin
这摆脱了 1st xxx
。
推荐阅读
- python - Python Regex:如何在文本文件中找到重复出现的文本块
- python - 在python中通过指定时间运行脚本
- reactjs - Recharts activeDot 将有效负载返回为未定义
- oracle - 只有一行可以是“是”的唯一约束(但基于其他列中的值)
- google-apps-script - 如何在 Apps 脚本文件中更改时区 - 新编辑器
- typescript - TypeScript 与 Node JSON 隐含的对象成员范围差异
- sql - 火花上下文问题
- python - MongoDB聚合根据数组中的另一个键值获取键值
- spring - 反向代理背后的keycloak Spring Application - 转发到http
- ios - SwiftUI:如何获取用户的当前位置?