verilog - 在 Verilog 中使用 SR 触发器模块创建 JK 触发器模块
问题描述
我已经为 SR Latch、SR Flip Flop(通过实例化 SR Latch 模块)和 JK Flip Flop(通过实例化 SR Latch 模块)编写了 verilog 模块。我正在使用 Xilinx Vivado 2019 版本进行仿真和查看输出波形。SR 锁存器和 SR 触发器模块工作得很好,我也得到了正确的输出波形。我尝试通过实例化 SR 锁存器模块来创建 JK 触发器模块。但我只是没有得到输出波形。我不知道出了什么问题。我也检查了布尔表达式。一切似乎都很好。有人可以指出错误吗?
这是代码。
SR 锁存模块
module sr_latch(s, r, q, qbar);
input s, r;
output q, qbar;
nand(q, s, qbar);
nand(qbar, r, q);
endmodule
使用 SR 锁存器的 SR 触发器模块
module sr_ff(s, r, clk, q, qbar);
input s, r, clk;
output q, qbar;
reg t1, t2;
always @(posedge clk)
begin
t1 <= !(clk & s);
t2 <= !(clk & r);
end
sr_latch SRL(t1, t2, q, qbar);
endmodule
使用 SR 锁存器的 JK 触发器
module jk_ff(j, k, clk, q, qbar);
input j, k, clk;
output q, qbar;
reg t1, t2;
always @(posedge clk)
begin
t1 <= !(clk & qbar & j);
t2 <= !(clk & q & k);
end
sr_latch SRL(t2, t1, q, qbar);
endmodule
JK 触发器测试台
module jk_ff_tb();
wire q, qbar;
reg j, k, clk=1;
integer i;
jk_ff JKFF(j, k, clk, q, qbar);
always #25 clk = !clk;
initial
begin
for(i=0; i<4; i=i+1)
begin
{j, k} <= i; #50;
end
$stop;
end
endmodule
解决方案
您的输出未知 ( X
),因为您的jk_ff
模型不允许正确初始化 SR Latch。
根据这个简单的原理图,您只需在 SR 锁存器的输入上实现 2 个 NAND 门:
这是一种方法,使用连续分配:
module jk_ff (j, k, clk, q, qbar);
input j, k, clk;
output q, qbar;
wire sn = clk & qbar & j;
wire rn = clk & q & k;
sr_latch SRL (sn, rn, q, qbar);
endmodule
这使得输出变得已知。
另一种方法是添加 2 个nand
基元。
请注意,JK 触发器可以由 SR Latch构造,而不是 SR触发器。
推荐阅读
- python - 如何设置 python asyncio websocket 服务器以优雅地松散与客户端的连接
- python - 使用 pytest-check 进行完整回溯?
- python - 无法在生产服务器上使用烧瓶渲染模板
- pdf - Jupyter:当笔记本本身包含 LaTeX 时导出为 PDF
- python - 如何使用 .split() 将数据从 python 套接字插入 SQL Server 表来分隔条目并使用变量执行?
- r - 我可以使用 R 将 Excel 工作簿保存为二进制文件吗?
- missing-data - MCMCglmm 中的错误:固定预测变量中的缺失值 - 但我没有缺失值
- javascript - Formik React Native 复选框
- ansible - Ansible playbook 将字节转换为 GB
- vim - 是否有一个 Vim 插件可以 TAB 完成 CTags 索引中的符号?