基于状态机的按键消抖-verilog随机函数

上篇文章的testbench的方法有些冗杂,这篇中使用随机函数。随机函数可以用在测试仿真中,产生激励,不可被综合。

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2023/07/06 16:45:46
// Design Name: czy
// Module Name: key_filter_tb
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module key_filter_tb();
    
reg Clk;
reg Reset_n;
reg key;

wire key_flag;
wire key_state;
    
key_filter key_filter(
Clk,
Reset_n,
key,
key_flag,
key_state
   );
      
//产生时钟

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

initial begin
Reset_n = 0;
key=1;//按键正常情况高电平
#201;//避开时钟的上升沿
Reset_n = 1;//释放复位
#30000;
press_key(2);
$stop;

end

//抖动在20ms  = 0001001100010010110100000000  25位

reg [24:0]rand;  

task press_key;   //task中 input的值便于改变
 input [3:0]seed;
 begin
 key =1;
 #20_000_000;
 repeat(5)begin
 rand= {$random(seed)}%10_000_000;//random 可以产生一个32位的随机数 有符号种子  $random  随机 0~10_000_000-1之间的值  防止值为0 零次延迟加起来  超过20ms
#rand key=~key;
 end
 key = 0;
 #50_000_000;
  repeat(5)begin
 rand= {$random(seed)}%10_000_000;//random 可以产生一个32位的随机数 有符号种子  $random  随机 0~10_000_000-1之间的值  防止值为0 零次延迟加起来  超过20ms
#rand key=~key;
 end
 key =1;
 #50_000_000;
end
endtask
endmodule

仿真结果

有些 问题?!看一下子模块的内部信号

 修改一下模块的设计  回到idle状态要记得清零 

 

 参考上一篇的内容,对比两次仿真

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值