FPGA学习记录(2): 计数器的编写

FPGA学习记录(2):计数器编写

注:使用的是野火的征途mini FPGA开发板(参考野火系列视频)

1.定时点亮led灯

  • 目标

    • 利用计数器定时1s,实现0.5s灯亮,0.5s灯灭
  • 模拟框图

在这里插入图片描述

开发板使用的是50MHz的晶振也就是
频率f = 50MHz = 5*10^7KHz
所以t=1/f= 2*10^7
所以计数1s所需要的计数为
M=1/t=25000000
因为是从0开始计数所以计数的最大值为
M=24_999_999
通过计算器可以知道M为25位宽的

定义两个寄存器变量,cnt与cnt_flag
cnt用于计数
cnt_flag用来控制led亮灭的变化
起始让cnt_flag为低电平,每当cnt计数到最大值的的一半时即达到0.5s时
改变cnt_flag的状态,这样就可以实现0.5s灯亮,0.5灯灭
  • 波形图绘制

在这里插入图片描述

  • 代码编写

    • rtl代码

      /*-------------------------    
      Function:定时1s,点亮led
      Date:2020/2/12
      Reference:"野火"
      Author:Troke
      ---------------------------*/
      module counter
      #(
      	parameter CNT_MAX =  25d'24_999_999 //定义参数变量
      )
      (
      	input	wire	sys_clk,      //定义时钟线
          input	wire	sys_rst_n,    //定义复位信号
          
          output	reg		led_out
      );
          /*定义两个寄存器变量,一个用于计数,一个用于控制led*/
          reg	[24:0]	cnt;
          reg		    cnt_flag;
          /*对cnt的编写*/
          always@(posedge sys_clk or negedge sys_rst_n)
              if(sys_rst_n == 1'b0)
                  cnt <= 25'd0;        	//起始给cnt赋值为0
          	else if (cnt == (CNT_MAX))
              	cnt <= 25'd0;			//当cnt计数到最大值时,重新赋值为0
          	else
                  cnt <= cnt + 25'd1; 	//其他情况让cnt自加
          /*对cnt_flag的编写*/
          always@(posedge sys_clk or negedge sys_rst_n)
              if(sys_rst_n == 1'b0)
                  cnt_flag <= 1'b0;		//起始给cnt_flag赋值低电平
          	else if (cnt ==(CNT_MAX-25'd1))
              	cnt_flag <= ~cnt_flag;	//当计数到最大值减1时,改变cnt_flag的状态
          	else
      			cnt_flag <= cnt_flag;   //其他情况cnt_flag保持原来的状态
          
          /*对led_out的编写*/
          always@(posedge sys_clk or negedge sys_rst_n)
              if(sys_rst_n == 1'b0)
                  led_out <= 1'b0;		//起始给led_out赋值低电平
         	    else if (cnt_flag == 1'b1)	
              	led_out <= ~led_out;	//当cnt_flag改变状态时,改变led的状态
         	    else
              	led_out <= led_out;		//其他情况保持led状态
          
      endmodule
      
    • testbench代码

      `timescale 1ns/1ns
      module tb_counter();
          
      reg	sys_clk;
      reg	sys_rst_n;
      wire led_out;
          
      initial
          begin
             sys_clk = 1'b0;
             sys_rst_n <= 1'b0;
             #20
             sys_rst_n <= 1'b1;
          end
      always #10 sys_clk = ~sys_clk;
          
      counter
      #(
          .CNT_MAX(25'd 24) //设置参数变量的值
      )
      counter_inst
      (
          .sys_clk	(sys_clk),    
          .sys_rst_n	(sys_rst_n),   
          
          .led_out	(led_out)
      );    
          
      endmodule
      
  • 仿真结果

在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值