基于FPGA的數(shù)字時(shí)鐘(使用vivado)
使用兩個(gè)四位數(shù)碼管,可以實(shí)現(xiàn)時(shí)鐘分鐘秒鐘顯示,高兩位設(shè)置不顯示。
換了一個(gè)新開發(fā)板,nexys4ddr,資料不多,最多使用的就是一本英文Reference Manual。
其實(shí)是老師覺得我計(jì)數(shù)器還差點(diǎn),得再練練。
原件選擇
Digilent NEXYS4DDR
Vivado2018.3
設(shè)計(jì)方案
60進(jìn)制秒鐘計(jì)數(shù)然后進(jìn)1分鐘
60進(jìn)制分鐘計(jì)數(shù)然后進(jìn)1小時(shí)
設(shè)計(jì)思想
1、設(shè)計(jì)時(shí)鐘一,用于計(jì)數(shù)器計(jì)一秒,根據(jù)芯片晶振選擇計(jì)算
2、設(shè)計(jì)時(shí)鐘二,用于計(jì)數(shù)60秒
3、設(shè)計(jì)時(shí)鐘三,用于計(jì)數(shù)60分
4、設(shè)計(jì)時(shí)鐘四,用于計(jì)數(shù)24時(shí)
5、設(shè)計(jì)時(shí)鐘五,用于選擇數(shù)碼管刷新頻率
代碼
module clock(
input sclk ,
input s_rst_n ,
input YEAR ,
input MONTH ,
input DAY ,
output reg [7:0] SEG ,
output reg [7:0] SMG
);
localparam DELAY_1S = 'd9_999_999;
localparam DELAY_1M = 'd59;
localparam DELAY_1H = 'd59;
localparam DELAY_1D = 'd23;
localparam DELAY_10MS = 'd199_999;
reg [3:0] TIME_8 ;
reg [25:0] cnt_1s ;
reg [5:0] cnt_1m ;
reg [5:0] cnt_1h ;
reg [4:0] cnt_1d ;
reg [18:0] cnt_10ms ;
reg [7:0] SEG1 ;
reg [7:0] SEG2 ;
reg [7:0] SEG3 ;
reg [7:0] SEG4 ;
reg [7:0] SEG5 ;
reg [7:0] SEG6 ;
reg [7:0] SEG7 ;
reg [7:0] SEG8 ;
localparam NULL = 8'b1111_1111;
localparam num0 = 8'b1100_0000;
localparam num9 = 8'b1001_0000;
localparam num8 = 8'b1000_0000;
localparam num7 = 8'b1111_1000;
localparam num6 = 8'b1000_0010;
localparam num5 = 8'b1001_0010;
localparam num4 = 8'b1001_1001;
localparam num3 = 8'b1011_0000;
localparam num2 = 8'b1010_0100;
localparam num1 = 8'b1111_1001;
//秒計(jì)時(shí)
always @ (posedge sclk or negedge s_rst_n)
begin
if(s_rst_n == 1'b0)
cnt_1s <= 'd0;
else if (cnt_1s == DELAY_1S)
cnt_1s <= 'd0;
else
cnt_1s <= cnt_1s + 1'b1;
end
//分計(jì)時(shí)
always @ (posedge sclk or negedge s_rst_n)
begin
if(s_rst_n == 1'b0)
cnt_1m <= 'd0;
else if (cnt_1s == DELAY_1S && cnt_1m == DELAY_1M)
cnt_1m <= 'd0;
else if (cnt_1s == DELAY_1S)
cnt_1m <= cnt_1m + 1'b1;
end
//時(shí)計(jì)時(shí)
always @ (posedge sclk or negedge s_rst_n)
begin
if(s_rst_n == 1'b0)
cnt_1h <= 'd0;
else if (cnt_1s == DELAY_1S && cnt_1m == DELAY_1M && cnt_1h == DELAY_1H)
cnt_1h <= 'd0;
else if (cnt_1s == DELAY_1S && cnt_1m == DELAY_1M)
cnt_1h <= cnt_1h + 1'b1;
end
//天計(jì)時(shí)
always @ (posedge sclk or negedge s_rst_n)
begin
if(s_rst_n == 1'b0)
cnt_1d <= 'd0;
else if (cnt_1s == DELAY_1S && cnt_1m == DELAY_1M && cnt_1h == DELAY_1H && cnt_1d == DELAY_1D)
cnt_1d <= 'd0;
else if (cnt_1s == DELAY_1S && cnt_1m == DELAY_1M && cnt_1h == DELAY_1H)
cnt_1d <= cnt_1d + 1'b1;
end
//數(shù)碼管刷新
always @ (posedge sclk or negedge s_rst_n)
begin
if(s_rst_n == 1'b0)
cnt_10ms <= 'd0;
else if (cnt_10ms == DELAY_10MS)
cnt_10ms <= 'd0;
else
cnt_10ms <= cnt_10ms + 1'b1;
end
//位選1
always @ (posedge sclk or negedge s_rst_n)
begin
if(s_rst_n == 1'd0)
TIME_8 <= 1'd0;
else if (TIME_8 == 8 && cnt_10ms == DELAY_10MS)
TIME_8 <= 1'd1;
else if (cnt_10ms == DELAY_10MS)
TIME_8 <= TIME_8 + 1'd1;
end
//位選2
always @ (posedge sclk or negedge s_rst_n)
begin
if(s_rst_n == 1'd0)
SEG <= 8'b0000_0000;
else if (TIME_8 == 01)
SEG <= 8'b1111_1110;
else if (TIME_8 == 02)
SEG <= 8'b1111_1101;
else if (TIME_8 == 03)
SEG <= 8'b1111_1011;
else if (TIME_8 == 04)
SEG <= 8'b1111_0111;
else if (TIME_8 == 05)
SEG <= 8'b1110_1111;
else if (TIME_8 == 06)
SEG <= 8'b1101_1111;
else if (TIME_8 == 07)
SEG <= 8'b1011_1111;
else if (TIME_8 == 08)
SEG <= 8'b0111_1111;
end
//段選
always @ (posedge sclk or negedge s_rst_n)
begin
if(s_rst_n == 1'd0)
SMG <= 8'b0000_0000;
else if (TIME_8 == 01)
SMG <= SEG4;
else if (TIME_8 == 02)
SMG <= SEG3;
else if (TIME_8 == 03)
SMG <= SEG2;
else if (TIME_8 == 04)
SMG <= SEG1;
else if (TIME_8 == 05)
SMG <= SEG6;
else if (TIME_8 == 06)
SMG <= SEG5;
else if (TIME_8 == 07)
SMG <= NULL;
else if (TIME_8 == 08)
SMG <= NULL;
end
//秒顯示
always@(*)
begin
case(cnt_1m)
00: {SEG3,SEG4} <={num0,num0};
01: {SEG3,SEG4} <={num0,num1};
02: {SEG3,SEG4} <={num0,num2};
03: {SEG3,SEG4} <={num0,num3};
04: {SEG3,SEG4} <={num0,num4};
05: {SEG3,SEG4} <={num0,num5};
06: {SEG3,SEG4} <={num0,num6};
07: {SEG3,SEG4} <={num0,num7};
08: {SEG3,SEG4} <={num0,num8};
09: {SEG3,SEG4} <={num0,num9};
10: {SEG3,SEG4} <={num1,num0};
11: {SEG3,SEG4} <={num1,num1};
12: {SEG3,SEG4} <={num1,num2};
13: {SEG3,SEG4} <={num1,num3};
14: {SEG3,SEG4} <={num1,num4};
15: {SEG3,SEG4} <={num1,num5};
16: {SEG3,SEG4} <={num1,num6};
17: {SEG3,SEG4} <={num1,num7};
18: {SEG3,SEG4} <={num1,num8};
19: {SEG3,SEG4} <={num1,num9};
20: {SEG3,SEG4} <={num2,num0};
21: {SEG3,SEG4} <={num2,num1};
22: {SEG3,SEG4} <={num2,num2};
23: {SEG3,SEG4} <={num2,num3};
24: {SEG3,SEG4} <={num2,num4};
25: {SEG3,SEG4} <={num2,num5};
26: {SEG3,SEG4} <={num2,num6};
27: {SEG3,SEG4} <={num2,num7};
28: {SEG3,SEG4} <={num2,num8};
29: {SEG3,SEG4} <={num2,num9};
30: {SEG3,SEG4} <={num3,num0};
31: {SEG3,SEG4} <={num3,num1};
32: {SEG3,SEG4} <={num3,num2};
33: {SEG3,SEG4} <={num3,num3};
34: {SEG3,SEG4} <={num3,num4};
35: {SEG3,SEG4} <={num3,num5};
36: {SEG3,SEG4} <={num3,num6};
37: {SEG3,SEG4} <={num3,num7};
38: {SEG3,SEG4} <={num3,num8};
39: {SEG3,SEG4} <={num3,num9};
40: {SEG3,SEG4} <={num4,num0};
41: {SEG3,SEG4} <={num4,num1};
42: {SEG3,SEG4} <={num4,num2};
43: {SEG3,SEG4} <={num4,num3};
44: {SEG3,SEG4} <={num4,num4};
45: {SEG3,SEG4} <={num4,num5};
46: {SEG3,SEG4} <={num4,num6};
47: {SEG3,SEG4} <={num4,num7};
48: {SEG3,SEG4} <={num4,num8};
49: {SEG3,SEG4} <={num4,num9};
50: {SEG3,SEG4} <={num5,num0};
51: {SEG3,SEG4} <={num5,num1};
52: {SEG3,SEG4} <={num5,num2};
53: {SEG3,SEG4} <={num5,num3};
54: {SEG3,SEG4} <={num5,num4};
55: {SEG3,SEG4} <={num5,num5};
56: {SEG3,SEG4} <={num5,num6};
57: {SEG3,SEG4} <={num5,num7};
58: {SEG3,SEG4} <={num5,num8};
59: {SEG3,SEG4} <={num5,num9};
endcase
end
//分顯示
always@(*)
begin
case(cnt_1h)
00: {SEG1,SEG2} <={num0,num0};
01: {SEG1,SEG2} <={num0,num1};
02: {SEG1,SEG2} <={num0,num2};
03: {SEG1,SEG2} <={num0,num3};
04: {SEG1,SEG2} <={num0,num4};
05: {SEG1,SEG2} <={num0,num5};
06: {SEG1,SEG2} <={num0,num6};
07: {SEG1,SEG2} <={num0,num7};
08: {SEG1,SEG2} <={num0,num8};
09: {SEG1,SEG2} <={num0,num9};
10: {SEG1,SEG2} <={num1,num0};
11: {SEG1,SEG2} <={num1,num1};
12: {SEG1,SEG2} <={num1,num2};
13: {SEG1,SEG2} <={num1,num3};
14: {SEG1,SEG2} <={num1,num4};
15: {SEG1,SEG2} <={num1,num5};
16: {SEG1,SEG2} <={num1,num6};
17: {SEG1,SEG2} <={num1,num7};
18: {SEG1,SEG2} <={num1,num8};
19: {SEG1,SEG2} <={num1,num9};
20: {SEG1,SEG2} <={num2,num0};
21: {SEG1,SEG2} <={num2,num1};
22: {SEG1,SEG2} <={num2,num2};
23: {SEG1,SEG2} <={num2,num3};
24: {SEG1,SEG2} <={num2,num4};
25: {SEG1,SEG2} <={num2,num5};
26: {SEG1,SEG2} <={num2,num6};
27: {SEG1,SEG2} <={num2,num7};
28: {SEG1,SEG2} <={num2,num8};
29: {SEG1,SEG2} <={num2,num9};
30: {SEG1,SEG2} <={num3,num0};
31: {SEG1,SEG2} <={num3,num1};
32: {SEG1,SEG2} <={num3,num2};
33: {SEG1,SEG2} <={num3,num3};
34: {SEG1,SEG2} <={num3,num4};
35: {SEG1,SEG2} <={num3,num5};
36: {SEG1,SEG2} <={num3,num6};
37: {SEG1,SEG2} <={num3,num7};
38: {SEG1,SEG2} <={num3,num8};
39: {SEG1,SEG2} <={num3,num9};
40: {SEG1,SEG2} <={num4,num0};
41: {SEG1,SEG2} <={num4,num1};
42: {SEG1,SEG2} <={num4,num2};
43: {SEG1,SEG2} <={num4,num3};
44: {SEG1,SEG2} <={num4,num4};
45: {SEG1,SEG2} <={num4,num5};
46: {SEG1,SEG2} <={num4,num6};
47: {SEG1,SEG2} <={num4,num7};
48: {SEG1,SEG2} <={num4,num8};
49: {SEG1,SEG2} <={num4,num9};
50: {SEG1,SEG2} <={num5,num0};
51: {SEG1,SEG2} <={num5,num1};
52: {SEG1,SEG2} <={num5,num2};
53: {SEG1,SEG2} <={num5,num3};
54: {SEG1,SEG2} <={num5,num4};
55: {SEG1,SEG2} <={num5,num5};
56: {SEG1,SEG2} <={num5,num6};
57: {SEG1,SEG2} <={num5,num7};
58: {SEG1,SEG2} <={num5,num8};
59: {SEG1,SEG2} <={num5,num9};
endcase
end
//時(shí)顯示
always@(*)
begin
case(cnt_1d)
00: {SEG5,SEG6} <={num0,num0};
01: {SEG5,SEG6} <={num0,num1};
02: {SEG5,SEG6} <={num0,num2};
03: {SEG5,SEG6} <={num0,num3};
04: {SEG5,SEG6} <={num0,num4};
05: {SEG5,SEG6} <={num0,num5};
06: {SEG5,SEG6} <={num0,num6};
07: {SEG5,SEG6} <={num0,num7};
08: {SEG5,SEG6} <={num0,num8};
09: {SEG5,SEG6} <={num0,num9};
10: {SEG5,SEG6} <={num1,num0};
11: {SEG5,SEG6} <={num1,num1};
12: {SEG5,SEG6} <={num1,num2};
13: {SEG5,SEG6} <={num1,num3};
14: {SEG5,SEG6} <={num1,num4};
15: {SEG5,SEG6} <={num1,num5};
16: {SEG5,SEG6} <={num1,num6};
17: {SEG5,SEG6} <={num1,num7};
18: {SEG5,SEG6} <={num1,num8};
19: {SEG5,SEG6} <={num1,num9};
20: {SEG5,SEG6} <={num2,num0};
21: {SEG5,SEG6} <={num2,num1};
22: {SEG5,SEG6} <={num2,num2};
23: {SEG5,SEG6} <={num2,num3};
endcase
end
endmodule
實(shí)物展示
由于這個(gè)代碼將速率方法了十倍,故手機(jī)錄像時(shí),無法捕捉到動態(tài)刷新,只能貼一張圖片了,不能做成pdf。文章來源:http://www.zghlxwxcb.cn/news/detail-780119.html
小結(jié)
換了開發(fā)板和平臺,vivado編譯一次是真的慢,也得慢慢琢磨。文章來源地址http://www.zghlxwxcb.cn/news/detail-780119.html
到了這里,關(guān)于基于FPGA的數(shù)字時(shí)鐘(使用vivado)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!