FPGA学习笔记:verilog基础代码与modelsim仿真(三)

FPGA学习笔记:verilog基础代码与modelsim仿真(三)

1. 分频器——偶分频

方法1:

在这里插入图片描述
在这里插入图片描述


verilog代码实现:
module divider_six(
    input wire  sys_clk     ,
    input wire  sys_rst_n   ,
    
    
    output  reg      clk_out       
    
     
     
 );
 
 reg    [1:0]   cnt ; //00 01 10
 wire   [1:0]   max_cnt = 2'd2;
 
always@(posedge sys_clk or negedge sys_rst_n)
    if(sys_rst_n == 1'b0)
        cnt <= 2'b0;
    else if(cnt == max_cnt)
        cnt <= 2'b0;
    else
        cnt <= 2'd1 + cnt;
        
always@(posedge sys_clk or negedge sys_rst_n)
    if(sys_rst_n == 1'b0)
        clk_out <= 1'b0;
    else if(cnt == max_cnt)
        clk_out <= ~clk_out;
    else
       clk_out <= clk_out;
       
  
 endmodule
 




modelsim仿真波形图:

在这里插入图片描述




方法2(推荐):

比起方法一直接使用计数器定义一个新的时钟波形,方法二使用flag_out作为分频变量从而实现分频器的功能。虽然二者都使用了计数器,但方法二显然更符合“分频”的定义,且此方法在告诉电路中更加稳定,所以在实际分频应用中更推荐这种方法。

在这里插入图片描述



verilog代码实现:
 module divider_six(
    input wire  sys_clk     ,
    input wire  sys_rst_n   ,
    
    
    output  reg      flag_out       
    
     
     
 );
 
 reg    [2:0]   cnt ; //00 01 10
 wire   [2:0]   max_cnt = 3'd5;
 
always@(posedge sys_clk or negedge sys_rst_n)
    if(sys_rst_n == 1'b0)
        cnt <= 3'b0;
    else if(cnt == max_cnt)
        cnt <= 3'b0;
    else
        cnt <= 3'd1 + cnt;
        
always@(posedge sys_clk or negedge sys_rst_n)
    if(sys_rst_n == 1'b0)
        flag_out <= 1'b0;
    else if(cnt == max_cnt -3'd1)
        flag_out <= 1'b1;
    else
       flag_out <= 1'b0;
       
  
 endmodule

仿真代码:
  `timescale 1ns/1ns
  module tb_divider_six();
  
  reg sys_clk;
  reg sys_rst_n;
  wire flag_out;
  
 
  initial
     begin
         sys_clk = 1'b1;
         sys_rst_n <= 1'b0;
         #20
         sys_rst_n <= 1'b1;
     end
  

 always #10 sys_clk = ~sys_clk; //clk frequency

 
 divider_six  divider_six_inst
 (
         .sys_clk  (sys_clk)   ,
         .sys_rst_n(sys_rst_n)   ,
         .flag_out  (flag_out) 
    
            
         
 );
     
 endmodule



modelsim仿真波形:

在这里插入图片描述





2. 按键消抖


在这里插入图片描述


在这里插入图片描述



verilog代码实现:
 module key_filter
 
 #(
    parameter   CNT_MAX = 20'd999_999
 )
 
(
     input wire sys_clk     ,
     input wire sys_rst_n   ,
     input  wire key_in     ,
     
     output reg    key_flag    
   
     
 
     
     
 );
reg[19:0]   cnt_20ms     ;
always@(posedge sys_clk or  negedge sys_rst_n)

    if(sys_rst_n == 1'b0)
        cnt_20ms  <= 20'd0;
    else    if(key_in == 1'b1)
        cnt_20ms  <=  20'd0;
    else    if(cnt_20ms == CNT_MAX)
        cnt_20ms   <= cnt_20ms;
    else    
        cnt_20ms <= cnt_20ms + 20'd1;
        
always@(posedge sys_clk or  negedge sys_rst_n)

    if(sys_rst_n == 1'b0)
        key_flag  <=  1'b0;
    else    if(cnt_20ms == CNT_MAX - 1'd1)
        key_flag <=  1'd1;
    else
        key_flag <= 1'd0;
        
      
  
 endmodule
 

仿真代码:
  `timescale 1ns/1ns
  module tb_key_filter();
  
  reg sys_clk;
  reg sys_rst_n;
  reg  key_in;
  reg[7:0]  tb_cnt;
  wire key_flag;
  
 
  initial
     begin
         sys_clk = 1'b1;
         sys_rst_n <= 1'b0;
         #20
         sys_rst_n <= 1'b1;
     end
  
  

     
     
 always #10 sys_clk = ~sys_clk; //clk frequency

 always@(posedge  sys_clk   or negedge  sys_rst_n)
    if(sys_rst_n == 1'b0)
        tb_cnt  <=  8'd0;
    else if (tb_cnt == 8'd249)
        tb_cnt  <=  8'd0;
    else    
        tb_cnt  <=  tb_cnt + 8'd1;
 
 
 
 always@(posedge    sys_clk or negedge sys_rst_n)
        if(sys_rst_n == 1'b0)
            key_in  <= 1'b1;
        else if(((tb_cnt >=  8'd19) && (tb_cnt <= 8'd69))
                ||  ((tb_cnt >= 8'd149) &&(tb_cnt <= 8'd169)))
                key_in  <=  {$random} % 2 ;
        else  if (tb_cnt >= 8'd69 && tb_cnt <= 8'd149)
                key_in  <= 1'b0;
        else
                key_in  <=  1'b1;
                
 
 
 
 key_filter 
 #(
    .CNT_MAX(20'd24)
 )

 key_filter_inst
 (
         .sys_clk  (sys_clk)   ,
         .sys_rst_n(sys_rst_n)   ,
         .key_in(key_in)        ,
         .key_flag  (key_flag) 
    
            
         
 );
     
 endmodule



modelsim仿真波形:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 1
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

保温杯配红牛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值