集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 1139|回复: 5

动态显示之移位模块

[复制链接]
zxopenljx 发表于 2020-4-30 14:46:49 | 显示全部楼层 |阅读模式
今天,我们一起来分享一下数码管滚动显示的最后一个模块:“移位模块”

数码管的移位其实和流水灯差不多。只不过流水灯是一个灯亮其它灯不亮,然后另一个灯亮其它灯不亮;可以看成数据的单个显示。而数码管滚动显示原理和流水灯相似,只不过数码管是多个数据同时流水,而流水灯则是一个LED灯单独流水。
今天,我们采取拼接符的方法来实现多个数据同时流水的目的。

之前我们说过,一个数码管需要4位数据,6个数码管需要24位数据。那么24位数据从高位到低位,每4位对应一个数码管。
24位数据从高位到低位,与6个数码管从左向右依次对应。

移位模块的代码如下:
00  //数码管滚动显示之“移位模块”
01  module seg_run(clk, rst_n, date_in);
02
03     input clk;                                          //系统时钟
04     input rst_n;                                        //系统复位
05     
06     outputreg[23:0] date_in;                          //输出数据,每4位数据对应一个数码管显示
07     
08     //计时模块,计1s
09     reg[25:0] cnt;                                     //定义一个计数器
10     wire flag;                                          //定义一个计时标志信号
11     parameter cnt_num =50_000_000/1-1;               //定参:1秒钟需要数多少个时钟周期
12     
13     always@(posedge clk,negedge rst_n)               //总是在时钟上升沿或复位下降沿时,执行以下操作
14     begin
15         if(!rst_n)                                      //判断是否复位
16              cnt <=26'd0;                               //如果复位,将计数器cnt清零
17         elseif(cnt == cnt_num)                         //否则,判断cnt是否计到最大值
18                      cnt <=26'd0;                       //计到最大值,让计数器cnt清零
19                  else
20                      cnt <= cnt +1;                     //否则,继续计数,让cnt加一
21     end
22     
23     assign flag =(cnt == cnt_num)?1'b1    :   1'b0;   //计时信号(当cnt=cnt_num时,即计够1秒,让flag信号拉高一次;若没计够,flag一直保持低电平)
24     
25     //流水模块
26     always@(posedge clk,negedge rst_n)              
27     begin
28         if(!rst_n)                                      //判断复位
29              date_in <=24'h012345;                      //复位时,给date_in一个初始值“HELLO.”这个数据是由数码管显示模块得到的。
30         else                                            //否则
31              begin
32                  if(flag ==1)                           //判断flag是否拉高
33                      date_in <={date_in[3:0],date_in[23:4]};//若拉高,让date_in的低四位数据和date_in的高20位数据拼接成一个新的24位数据。即实现移位。
34                  else
35                      date_in <= date_in;                 //若flag没有拉高,则让date_in的24位数据保持不变。.0
36              end
37     end
38     
39  endmodule

今天的分享就到这里,我们明天见!
您需要登录后才可以回帖 登录 | 我要注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|小黑屋|手机版|Archiver|fpga论坛|fpga设计论坛 ( 京ICP备20003123号-1 )

GMT+8, 2025-4-20 03:32 , Processed in 0.058575 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表