保命声明:笔者在校属于中低水平学生,代码能力有限,若行文中有错漏之处欢迎大家指出。
在线小工具
在线波形图查看
[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 ();
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
标签:probe,clk,always,数电,module,波形图,Verilog,input,reg
From: https://www.cnblogs.com/qsbye/p/16794436.html