Verilog与数电[3]-波形图

保命声明:笔者在校属于中低水平学生,代码能力有限,若行文中有错漏之处欢迎大家指出。

在线小工具

在线波形图查看

[https://wavedrom.com/editor.html]

Verilog刷题网站

[https://hdlbits.01xz.net]

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

posted @ 2022-10-15 16:40  qsBye  阅读(310)  评论(0编辑  收藏  举报