zl程序教程

您现在的位置是:首页 >  后端

当前栏目

重温FPGA开发20

开发 20 FPGA 重温
2023-09-14 09:09:12 时间

基于verilog系统函数语法的按键消抖

讲解实用的TB编写语法

随机函数:
random

优化 testbench文件

`timescale 1ns/1ns
module key_filter_tb();

	reg clk;
	reg reset;
	reg key;
	wire key_p_flag;
	wire key_r_flag;

	// 例化
	key_filter key_filter(
		clk,
		reset,
		key,
		key_p_flag,
		key_r_flag
	);


	initial clk = 1;
	always#10 clk = ~clk;

	initial begin
		reset = 0;
		key = 0;
		#201
		reset = 1;
		#3000;
		press_key(2);  // 调用这个task
		
		
	end

		
	reg [31:0] rand;
	initial begin
		rand = $random(200) % 10000000;
		#rand key= ~key;
	end

	task press_key();
		input [3:0] seed;
		begin
			key = 1;
			#20000000;
			repeat(5) begin
			rand = {$random(seed)} % 10000000;
			#rand key= ~key;
			end
			key = 0;
			#40000000;

			// 释放按键
			repeat(5) begin
			rand = {$random(seed)} % 10000000;
			#rand key= ~key;
			end
			key = 1;
			#40000000;						
		end
	endtask

endmodule

在这里插入图片描述
发现有个问题是,key flag的时间不对,分析结果,看子模块的信号,cnt在下一次的信号的时候,没有清零,在回到idle的状态的时候没有清零。
在这里插入图片描述
cnt 没有清零
在这里插入图片描述