題外話
好久沒(méi)更新,轉(zhuǎn)眼大二下了,去年我的城市經(jīng)歷新冠疫情,我自己也沉迷于某csgo游戲開(kāi)擺500小時(shí),終于在上個(gè)月醒悟,正式開(kāi)始fpga的學(xué)習(xí),是跟這實(shí)驗(yàn)室的一位帶工程師學(xué)習(xí)的,話不多說(shuō)開(kāi)始。
學(xué)習(xí)路線
主要看著B(niǎo)站開(kāi)源騷客和小梅哥的視頻,開(kāi)源騷客的視頻我看完了,最近在看小梅哥,其實(shí)我發(fā)現(xiàn)野火的電子文檔寫的也不錯(cuò),然后還有特權(quán)同學(xué)的fpga教程,我沒(méi)有怎么看數(shù)電,所以學(xué)起來(lái)感覺(jué)有點(diǎn)磕磕絆絆,比如D觸發(fā)器,pwm,時(shí)鐘那里。
首先f(wàn)pga學(xué)習(xí)確實(shí)跟單片機(jī)不太一樣,可以把fpga理解一塊面包板,需要我們自己設(shè)定輸入輸出端口。fpga學(xué)習(xí)確實(shí)跟單片機(jī)不一樣,時(shí)鐘是時(shí)序邏輯的靈魂,我們要考慮好如何設(shè)計(jì)時(shí)鐘,搞懂非阻塞賦值,并行執(zhí)行思想。
方案設(shè)計(jì)
原件選擇
開(kāi)發(fā)板選擇altera MAXII epm240t100c5n,其實(shí)這是一塊cpld還不是fpga。
軟件選擇quartusII 13.1 這里注意看自己的器件庫(kù) 我的芯片過(guò)于古老,軟件不兼容,我還額外去intel官網(wǎng)下載了maxII的devices。
同時(shí)建議提前了解rgb和數(shù)碼管原理。
設(shè)計(jì)方案
0、復(fù)位時(shí) 數(shù)碼管包括小數(shù)點(diǎn)全部亮 同時(shí)也方便檢測(cè)器件是否損壞
1、紅燈10秒倒計(jì)時(shí)
2、然后黃燈3秒,
3、然后綠燈5秒
4、再黃燈3秒
設(shè)計(jì)思想
1、設(shè)計(jì)時(shí)鐘一,用于選擇10+3+3+21個(gè)狀態(tài)
2、設(shè)計(jì)時(shí)鐘二,用于數(shù)碼管動(dòng)態(tài)刷新一個(gè)周期
3、對(duì)四位數(shù)碼管位選和段選的設(shè)計(jì)
4、對(duì)數(shù)碼管共陰極共陽(yáng)極的選擇
代碼
module traffic(
input sclk ,
input s_rst_n ,
output reg [3:0] SEG ,
output reg [7:0] SMG ,
output reg beep ,
output reg [ 2:0] RGB
);
localparam DELAY_1S = 'd24_999_999;
localparam DELAY_10MS = 'd299_999;
reg [4:0] TIME_21 ;
reg [4:0] TIME_4 ;
reg [25:0] cnt_1s ;
reg [18:0] cnt_10ms ;
reg [7:0] SEG1 ;
reg [7:0] SEG2 ;
reg [7:0] SEG3 ;
reg [7:0] SEG4 ;
localparam NULL = 8'b0000_0000;
localparam num0 = 8'b0011_1111;
localparam num9 = 8'b0110_1111;
localparam num8 = 8'b0111_1111;
localparam num7 = 8'b0000_0111;
localparam num6 = 8'b0111_1101;
localparam num5 = 8'b0110_1101;
localparam num4 = 8'b0110_0110;
localparam num3 = 8'b0100_1111;
localparam num2 = 8'b0101_1011;
localparam num1 = 8'b0000_0110;
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
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
always @ (posedge sclk or negedge s_rst_n)
begin
if(s_rst_n == 1'd0)
TIME_21 <= 1'd1;
else if (TIME_21 == 21 && cnt_1s == DELAY_1S)
TIME_21 <= 1'd1;
else if (cnt_1s == DELAY_1S)
TIME_21 <= TIME_21 + 1'd1;
end
always @ (posedge sclk or negedge s_rst_n)
begin
if(s_rst_n == 1'd0)
TIME_4 <= 1'd0;
else if (TIME_4 == 4 && cnt_10ms == DELAY_10MS)
TIME_4 <= 1'd1;
else if (cnt_10ms == DELAY_10MS)
TIME_4 <= TIME_4 + 1'd1;
end
always @ (posedge sclk or negedge s_rst_n)
begin
if(s_rst_n == 1'd0)
SEG <= 4'b0000;
else if (TIME_4 == 01)
SEG <= 4'b0111;
else if (TIME_4 == 02)
SEG <= 4'b1011;
else if (TIME_4 == 03)
SEG <= 4'b1101;
else
SEG <= 4'b1110;
end
always @ (posedge sclk or negedge s_rst_n)
begin
if(s_rst_n == 1'd0)
SMG <= 8'b1111_1111;
else if (TIME_4 == 01)
SMG <= SEG4;
else if (TIME_4 == 02)
SMG <= SEG3;
else if (TIME_4 == 03)
SMG <= SEG2;
else
SMG <= SEG1;
end
always@(*)
begin
case (TIME_21)
01: {SEG1,SEG2,SEG3,SEG4} <={NULL,NULL,num1,num0};
02: {SEG1,SEG2,SEG3,SEG4} <={NULL,NULL,NULL,num9};
03: {SEG1,SEG2,SEG3,SEG4} <={NULL,NULL,NULL,num8};
04: {SEG1,SEG2,SEG3,SEG4} <={NULL,NULL,NULL,num7};
05: {SEG1,SEG2,SEG3,SEG4} <={NULL,NULL,NULL,num6};
06: {SEG1,SEG2,SEG3,SEG4} <={NULL,NULL,NULL,num5};
07: {SEG1,SEG2,SEG3,SEG4} <={NULL,NULL,NULL,num4};
08: {SEG1,SEG2,SEG3,SEG4} <={NULL,NULL,NULL,num3};
09: {SEG1,SEG2,SEG3,SEG4} <={NULL,NULL,NULL,num2};
10: {SEG1,SEG2,SEG3,SEG4} <={NULL,NULL,NULL,num1};
11: {SEG1,SEG2,SEG3,SEG4} <={NULL,NULL,NULL,num3};
12: {SEG1,SEG2,SEG3,SEG4} <={NULL,NULL,NULL,num2};
13: {SEG1,SEG2,SEG3,SEG4} <={NULL,NULL,NULL,num1};
14: {SEG1,SEG2,SEG3,SEG4} <={NULL,NULL,NULL,num5};
15: {SEG1,SEG2,SEG3,SEG4} <={NULL,NULL,NULL,num4};
16: {SEG1,SEG2,SEG3,SEG4} <={NULL,NULL,NULL,num3};
17: {SEG1,SEG2,SEG3,SEG4} <={NULL,NULL,NULL,num2};
18: {SEG1,SEG2,SEG3,SEG4} <={NULL,NULL,NULL,num1};
19: {SEG1,SEG2,SEG3,SEG4} <={NULL,NULL,NULL,num3};
20: {SEG1,SEG2,SEG3,SEG4} <={NULL,NULL,NULL,num2};
21: {SEG1,SEG2,SEG3,SEG4} <={NULL,NULL,NULL,num1};
endcase
end
always@(*)
begin
if(s_rst_n == 1'b0)
RGB <= 3'b000;
else if (TIME_21>=1 &&TIME_21<=10)
RGB <= 3'b110; //紅
else if (TIME_21>=11 &&TIME_21<=13)
RGB <= 3'b100; //黃
else if (TIME_21>=14 &&TIME_21<=18)
RGB <= 3'b101; //綠
else if (TIME_21>=19 &&TIME_21<=21)
RGB <= 3'b100; //黃
end
endmodule
實(shí)物展示
忘了錄復(fù)位時(shí)白燈了,大家自己想象。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-500252.html
小結(jié)
搞電子要耐得住寂寞,要學(xué)習(xí)的很多,大家加油。歡迎大家互相交流學(xué)習(xí)方法路線心得,csdn不能及時(shí)回復(fù),抱歉!文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-500252.html
到了這里,關(guān)于基于FPGA的倒計(jì)時(shí)交通信號(hào)燈系統(tǒng)(使用quartusII)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!