Verilog与数电[3]-波形图
保命声明:笔者在校属于中低水平学生,代码能力有限,若行文中有错漏之处欢迎大家指出。
在线小工具
在线波形图查看
[https://wavedrom.com/editor.html]
Verilog刷题网站
JK触发器
[https://www.cnblogs.com/ajiaoa/p/13241610.html]
Verilog语法大全
//根据图片写出模块包含的内容
module JK_FF(
clk,J,K,S,R,Q);
//输入
input clk;
input S;//异步置位
input R;//异步复位
input J;
input K;
output reg Q;
/*顺序执行的块语句*/
/*
always意为一直,always后加@(输入信号或电平),括号中为触发方式,括号中的任何一个输入信号或电平发生变化时,该语句后的内容将会重复执行,或者说循环执行,当内容的最后一行代码执行完成后,再从第一行代码开始执行。如果用begin...end规定执行范围,执行范围以begin开始,以end结束
*/
always@(posedge clk,negedge R,posedge S)//在clk信号的上升沿或R的下降沿或S的下降沿执行操作
begin
if(!R)
Q <= 1'b0;
else if(!S)
Q <= 1'b1;
/*
1'b0 表示一位二进制数,其值为0
1'b1 表示一位二进制数,其值为1
时序逻辑器件的赋值语句采用非阻塞赋值 “<=”;
*/
else
Q <= (J&~Q) | (~K&Q);
end
/*结束当前块*/
endmodule
/*结束当前模块*/
测试文件JK_FF_tb.v
module top_module();
reg clk=0;
always #5 clk = ~clk;//产生时钟信号周期为10
initial `probe_start;//工具的宏定义
`probe(clk);//放置探针
reg J=0;
reg K=0;
reg S=0;
reg R=0;
reg Q=0;
initial begin
/*
延时语句——#n; 代表延时n个时间轴单位。比如之前定义了`timescale 1ns / 1ps;如果后面写 #3;就代表延时3ns而不是延时3ps。
*/
#10 J <= 1;Q<=1;
#10 J <= 0;Q<=1;
#20 K <= 1;Q<=1;
#20 K <= 0;Q<=1;
#50 $finish;
end
`probe(J);
`probe(K);
`probe(S);
`probe(R);
`probe(Q);
`probe(~Q);
endmodule
在线仿真
[https://hdlbits.01xz.net/wiki/Iverilog]
注: `probe为添加的探针宏定义,最上面的top_module()是testbench,下面的module才是本体
查看JK_FF_tb.v的波形图
不太符合要求
子模块调用
module top_module(output J,output K,output S,output R,output Q);
reg clk=0;
always #5 clk = ~clk;//产生时钟信号周期为10
initial `probe_start;//工具的宏定义
`probe(clk);//放置探针
reg J=0;
reg K=0;
reg S=0;
reg R=0;
reg Q=0;
initial begin
/*
延时语句——#n; 代表延时n个时间轴单位。比如之前定义了`timescale 1ns / 1ps;如果后面写 #3;就代表延时3ns而不是延时3ps。
*/
S<=1;R<=1;
#10 J <= 1;K<=1;
#10 J <= 0;K<=1;
#20 K <= 1;J<=0;
#20 K <= 0;J<=1;
#50 $finish;
end
JK_FF inst1 ( .clk(clk),.J(J),.K(K),.S(S),.R(R) ); // 让JK_FF模块工作,inst1为JK_FF的实例化名称,.clk(clk)为传参过程
`probe(J);
`probe(K);
`probe(S);
`probe(R);
endmodule
//下面才是模块
module JK_FF(clk,J,K,S,R,Q);
input clk;
input S;//异步置位
input R;//异步复位
input J;
input K;
output reg Q;
always@(posedge clk)//在clk信号的上升沿
begin
$display ("hello");
Q <= J&~K;
end
`probe(Q);
`probe(~Q);
endmodule
总算显示出来Q的正确波形了!
官方示例
module top_module ();
reg clk=0;
always #5 clk = ~clk; // Create clock with period=10
initial `probe_start; // Start the timing diagram
`probe(clk); // Probe signal "clk"
// A testbench
reg in=0;
initial begin
#10 in <= 1;
#10 in <= 0;
#20 in <= 1;
#20 in <= 0;
$display ("Hello world! The current time is (%0d ps)", $time);
#50 $finish; // Quit the simulation
end
invert inst1 ( .in(in) ); // Sub-modules work too.
endmodule
module invert(input in, output out);
assign out = ~in;
`probe(in); // Sub-modules can also have `probe()
`probe(out);
endmodule
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· DeepSeek 开源周回顾「GitHub 热点速览」