|
今天,我们一起来分享一下数码管滚动显示的最后一个模块:“移位模块”
数码管的移位其实和流水灯差不多。只不过流水灯是一个灯亮其它灯不亮,然后另一个灯亮其它灯不亮;可以看成数据的单个显示。而数码管滚动显示原理和流水灯相似,只不过数码管是多个数据同时流水,而流水灯则是一个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
今天的分享就到这里,我们明天见! |
|