FPGA——zhixin培训 Day_06——数码管(2)+电子时钟

A.数码管

一、设计背景:

数码管可做电子时钟,可显示参数等。

二、设计需求:

设计六个数码管的驱动电路,使六个数码管能够循环显示“HELLO.”。

架构图:

四、代码:

顶层模块:

例化三个子模块

Freq是产生1KHz的时钟,来刷新数码管,使六个数码管一起亮;

Shift_data1用来移位操作,使显示的值循环显示。该模块中移位需要按要求1s移位一次,因此需要产生一个1s的flag;

产生1秒的代码如下:

然后用来移位的代码如下:

接着,是数码管显示模块:

译码代码如下:

用状态机(FSM)写的给每个数码管赋值

Data_in是上个模块给的data_out的值;在顶层连线时候要注意。

B.电子时钟

一、设计背景:

数码管可做电子时钟,可显示参数等。

二、设计需求:

用6个数码管显示时,分,秒。

三、代码

方法一:

顶层模块:

说明:分频模块,是之前写好的,用于调用,产生的是1KHz的时钟,用于6个数码管显示;

 

Teme_driver:

1s就加一是写在该模块里面的,如下:

下面的时钟都用这个clk_1hz的时钟。

秒:

0   always @(posedge clk_1hz)

1      begin

2          if(!rst_n)

3             begin

4                 cnt_sec0 <= 4'd0;

5             end

6          else

7             begin

8                 if(cnt_sec0 == 4'd9)

9                    begin

10                       cnt_sec0 <= 4'd0;

11                   end

12                else

13                   begin

14                       cnt_sec0 <= cnt_sec0 + 1'd1;

15                   end

16            end

17     end

18

19 

20  always @(posedge clk_1hz)

21     begin

22         if(!rst_n)

23            begin

24                cnt_sec1 <= 4'd0;

25            end

26         else

27            begin

28                if(cnt_sec1 == 4'd5 && cnt_sec0 == 9)

29                   begin

30                       cnt_sec1 <= 4'd0;

31                   end

32                else   if(cnt_sec0 == 9)

33                          begin

34                              cnt_sec1 <= cnt_sec1 + 1'd1;

35                          end

36                       else

37                          begin

38                              cnt_sec1 <= cnt_sec1;

39                          end

40            end

41     end

42 

43  assign data_in1 = {cnt_sec1,cnt_sec0};

分钟:

0   //min

1      always @(posedge clk_1hz)

2      begin

3          if(!rst_n)

4             begin

5                 cnt_min0 <= 4'd0;

6             end

7          else

8             begin

9                 if(cnt_min0 == 9 && cnt_sec1 == 4'd5 && cnt_sec0 == 9)

10                   begin

11                       cnt_min0 <= 4'd0;

12                   end

13                else if(cnt_sec1 == 4'd5 && cnt_sec0 == 9)

14                   begin

15                       cnt_min0 <= cnt_min0 + 1'd1;

16                   end

17            end

18     end

19 

20  always @(posedge clk_1hz)

21     begin

22         if(!rst_n)

23            begin

24                cnt_min1 <= 4'd0;

25            end

26         else

27            begin

28                if(cnt_min1 == 5 && cnt_min0 == 9 && cnt_sec1 == 4'd5 && cnt_sec0 == 9)

29                   cnt_min1 <= 4'd0;

30                else if(cnt_min0 == 9 && cnt_sec1 == 4'd5 && cnt_sec0 == 9)

31                   cnt_min1 <= cnt_min1 + 1'd1;

32            end

33     end

小时:

0   //hour

1   always @(posedge clk_1hz)

2      begin

3          if(!rst_n)

4             begin

5                 cnt_hour0 <= 4'd0;

6             end

7          else

8             begin

9                 if((cnt_hour0 == 9 && cnt_min1 == 5 && cnt_min0 == 9 && cnt_sec1 == 4'd5 && cnt_sec0 == 9) || (cnt_hour1 == 2 && cnt_hour0 == 3 && cnt_min1 == 5 && cnt_min0 == 9 && cnt_sec1 == 4'd5 && cnt_sec0 == 9))

10                   cnt_hour0 <= 4'd0;

11                else if(cnt_min1 == 5 &&cnt_min0 == 9 && cnt_sec1 == 4'd5 && cnt_sec0 == 9)

12                   cnt_hour0 <= cnt_hour0 + 1'd1;

13            end

14     end

15 

16     always @(posedge clk_1hz)

17     begin

18         if(!rst_n)

19            begin

20                cnt_hour1 <= 4'd0;

21            end

22         else

23            begin

24                if(cnt_hour1 == 2 && cnt_hour0 == 3 && cnt_min1 == 5 && cnt_min0 == 9 && cnt_sec1 == 4'd5 && cnt_sec0 == 9)

25                   cnt_hour1 <= 4'd0;

26                else if(cnt_hour0 == 9 && cnt_min1 == 5 &&cnt_min0 == 9 && cnt_sec1 == 4'd5 && cnt_sec0 == 9)

27                   cnt_hour1 <= cnt_hour1 + 1'd1;

28            end

29     end

30 

31  assign data_in3 = {cnt_hour1,cnt_hour0};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值