微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > FPGA和CPLD > 小梅哥和你一起深入学习FPGA之数码管动态扫描

小梅哥和你一起深入学习FPGA之数码管动态扫描

时间:04-13 来源:互联网 点击:

动采用了组合逻辑译码的方式进行,具体将在代码解读时讲解。


实验中还设计了一个控制器,该控制器主要通过读取按键信息来改变待数码管待显示的数据内容。


按键检测部分使用前一节开发的独立按键的驱动,因此这里不进行过多的分析介绍。



二、       关键代码解读


因为数码管属于低速设备,其正常的扫描频率为500~10KHz,扫描频率太快,会导致系统功耗增加,显示效果变暗。扫描频率太慢,会有明显的闪烁感。本实验通过调试观察,选择以1KHz作为扫描频率,实际显示效果非常好。


因此本实验首先就需要产生一个1KHz的扫描时钟,该时钟由系统时钟分频得到。产生1KHz扫描时钟的代码如下:

  • parameter system_clk = 50_000_000;
  • localparam cnt1_MAX = system_clk/1000/2-1;
  • //1KHz时钟分频计数器
  •         always@(posedge Clk)
  •         begin
  •                 if(!Rst_n)cnt1<=0;
  •                 else if(cnt1==cnt1_MAX)cnt1<=0;
  •                 else cnt1<=cnt1+1'b1;
  •         end
  •         //得到1KHz时钟
  •         always@(posedge Clk or negedge Rst_n)
  •         if(!Rst_n)clk_1K<=0;
  •         else if(cnt1==cnt1_MAX)
  •                 clk_1K<=~clk_1K;//翻转扫描时钟信号
  •         else ;


[color=rgb(51, 102, 153) !important]复制代码

其中,定义了一个全局参数system_clk,该参数为Clk的频率,不同的时钟频率,只需要更改该参数,就可改变分频计数器的最大计数值,以保证1KHz分频的精准性。

在驱动中,数码管的位选以扫描时钟的速率进行切换,因为只有6位数码管,因此当位选计数到6-1后必须清零从头开始计数。相关代码如下:

//位选信号控制

         always@(posedgeclk_1K or negedge Rst_n)

         if(!Rst_n)sel_r<=3'd0;

         elseif(sel_r == 3'd5)

                   sel_r<=3'd0;

         else

                   sel_r<=sel_r+1'b1;



每个数码管需要显示的内容都不相同,由Data中相应的位指定,Data中各位与数码管的位对应关系如下:

因此需要从Data中将每个数码管被选中时需要显示的数据提取出来,提取数据的代码如下所示:

  • //根据不同的数码管位选择不同的待显示数据
  •         always@(*)
  •         if(!Rst_n)
  •                 disp_data=4'd0;
  •         else
  •         begin
  •                 case(sel_r)
  •                         0:disp_data=Data[23:20];
  •                         1:disp_data=Data[19:16];
  •                         2:disp_data=Data[15:12];
  •                         3:disp_data=Data[11:8];
  •                         4:disp_data=Data[7:4];
  •                         5:disp_data=Data[3:0];
  •                         default

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top