數字(zì)时(shí)鐘(zhōng)是(shì)常見(jiàn)的(de)畢業設計(jì)題(tí)目。我(wǒ)们(men)做畢業設計(jì)时(shí),一(yī)般使用(yòng)數碼管(guǎn)来(lái)顯示數字(zì)。小时(shí)、分(fēn)鐘(zhōng)和(hé)秒(miǎo)鐘(zhōng)各(gè)两(liǎng)位數字(zì),所(suǒ)以(yǐ)需要(yào)用(yòng)到(dào)6位的(de)數碼管(guǎn)。
如(rú)果(guǒ)平时(shí)不(bù)動(dòng)手(shǒu),要(yào)做这(zhè)个(gè)畢業設計(jì),很多(duō)人(rén)都会(huì)覺得挺難的(de)。收(shōu)集到(dào)的(de)代(dài)碼,其风格也(yě)是(shì)五(wǔ)花八(bā)門(mén),第(dì)一(yī)感(gǎn)覺是(shì)貌似能(néng)看(kàn)懂,但就(jiù)是(shì)不(bù)知道(dào)怎麼(me)設計(jì)出(chū)来(lái)的(de)。
其实如(rú)果(guǒ)有(yǒu)正(zhèng)确的(de)設計(jì)思(sī)路(lù)和(hé)方(fāng)法,其实現(xiàn)起来(lái)是(shì)非(fēi)常簡單的(de)。下(xià)面(miàn)我(wǒ)们(men)就(jiù)核心(xīn)的(de)數字(zì)模块(kuài)为(wèi)例,講解(jiě)如(rú)何使用(yòng)至(zhì)簡設計(jì)法来(lái)实現(xiàn)。
數字(zì)模块(kuài)的(de)功能(néng),是(shì)産生(shēng)6个(gè)信(xìn)号(hào),分(fēn)别表(biǎo)示时(shí)十(shí)位、时(shí)个(gè)位、分(fēn)十(shí)位、分(fēn)个(gè)位、秒(miǎo)十(shí)位和(hé)秒(miǎo)个(gè)位的(de)值。例如(rú)上(shàng)述信(xìn)号(hào)值依次(cì)为(wèi)2、1、4、3、5、9时(shí),則表(biǎo)示时(shí)間(jiān)为(wèi)21點(diǎn)43分(fēn)59秒(miǎo)。
仔细(xì)观察6个(gè)信(xìn)号(hào),每个(gè)單独来(lái)看(kàn),其數字(zì)都是(shì)遞增的(de),增加到(dào)一(yī)定(dìng)數後(hòu)就(jiù)清(qīng)零(líng)。以(yǐ)秒(miǎo)个(gè)位为(wèi)例,開(kāi)始时(shí)值为(wèi)0,然後(hòu)是(shì)1、2、3依次(cì)增加,直(zhí)到(dào)變(biàn)成(chéng)9後(hòu),然後(hòu)變(biàn)成(chéng)0,再次(cì)循环(huán)。其他(tā)信(xìn)号(hào)都是(shì)相同(tóng)的(de)規律。这(zhè)些依次(cì)遞增的(de)信(xìn)号(hào),就(jiù)是(shì)計(jì)數器。
我(wǒ)们(men)認識到(dào)这(zhè)些信(xìn)号(hào)是(shì)計(jì)數器,那(nà)就(jiù)好(hǎo)辦(bàn)了(le)。計(jì)數器設計(jì)只(zhī)需要(yào)考慮两(liǎng)點(diǎn),什麼(me)时(shí)候加1和(hé)要(yào)數多(duō)少(shǎo)个(gè),明(míng)确这(zhè)两(liǎng)个(gè)問(wèn)題(tí)後(hòu),剩下(xià)的(de)就(jiù)是(shì)套(tào)用(yòng)計(jì)數器模板了(le)。
以(yǐ)秒(miǎo)个(gè)位这(zhè)个(gè)計(jì)數器为(wèi)例,这(zhè)个(gè)計(jì)數器加1的(de)条(tiáo)件(jiàn)是(shì)什麼(me)呢?到(dào)了(le)1秒(miǎo)就(jiù)加1。那(nà)我(wǒ)们(men)怎麼(me)知道(dào)1秒(miǎo)鐘(zhōng)时(shí)間(jiān)到(dào)了(le)呢?FPGA是(shì)通(tòng)过(guò)數时(shí)鐘(zhōng)周期(qī)數来(lái)确定(dìng)时(shí)間(jiān)的(de)。例如(rú)下(xià)图(tú),假設时(shí)鐘(zhōng)頻率是(shì)50MHz,即时(shí)鐘(zhōng)周期(qī)是(shì)20ns,cnt是(shì)每个(gè)时(shí)鐘(zhōng)加1,則當cnt==99时(shí),就(jiù)说(shuō)明(míng)數了(le)100个(gè)时(shí)鐘(zhōng)周期(qī),也(yě)就(jiù)是(shì)时(shí)間(jiān)是(shì)100*20=2000ns了(le)。
同(tóng)樣(yàng)的(de)道(dào)理,1秒(miǎo)鐘(zhōng)时(shí)間(jiān),我(wǒ)们(men)就(jiù)是(shì)數1s/20ns= 50_000_000个(gè)时(shí)鐘(zhōng)周期(qī)。我(wǒ)们(men)也(yě)認識到(dào)这(zhè)个(gè)cnt也(yě)是(shì)計(jì)數器,其加1条(tiáo)件(jiàn)是(shì)“1”,要(yào)數50_000_000个(gè)數。我(wǒ)们(men)套(tào)用(yòng)計(jì)數器模块(kuài),即有(yǒu)下(xià)面(miàn)代(dài)碼。
always @(posedge clk or negedge rst_n)begin
if(!rst_n)begin
cnt 《= 0;
end
else if(add_cnt)begin
if(end_cnt)
cnt 《= 0;
else
cnt 《= cnt + 1;
end
end
assign add_cnt = 1 ;
assign end_cnt = add_cnt && cnt== 50_000_000-1;
代(dài)碼中(zhōng),always語(yǔ)句(jù)除了(le)名字(zì)後(hòu),完全(quán)套(tào)用(yòng)模板,不(bù)用(yòng)更(gèng)改。加1条(tiáo)件(jiàn)體(tǐ)現(xiàn)在(zài)第(dì)13行,要(yào)數多(duō)少(shǎo)个(gè)體(tǐ)現(xiàn)在(zài)第(dì)14行。
确定(dìng)了(le)cnt後(hòu),那(nà)麼(me)秒(miǎo)个(gè)位的(de)加1条(tiáo)件(jiàn)就(jiù)非(fēi)常明(míng)确了(le),就(jiù)是(shì)cnt數到(dào)50_000_000个(gè),也(yě)就(jiù)是(shì)end_cnt有(yǒu)效的(de)时(shí)候。所(suǒ)以(yǐ)秒(miǎo)个(gè)位的(de)加1条(tiáo)件(jiàn)是(shì)end_cnt。
秒(miǎo)个(gè)位要(yào)數多(duō)少(shǎo)个(gè)數字(zì)呢?由(yóu)0到(dào)9,因(yīn)此(cǐ)有(yǒu)10个(gè)。
綜上(shàng)所(suǒ)述,我(wǒ)们(men)得到(dào)秒(miǎo)个(gè)位的(de)代(dài)碼如(rú)下(xià)表(biǎo)。
always@(posedge clk or negedge rst_n)begin
if(rst_n==1‘b0)begin
miao_g 《= 0;
end
else if(add_miao_g)begin
if(end_miao_g)
miao_g 《= 0;
else
miao_g 《= miao_g + 1;
end
end
assign add_miao_g = end_cnt;
assign end_miao_g = add_miao_g && miao_g == 10-1;
用(yòng)類(lèi)似于(yú)秒(miǎo)个(gè)位的(de)思(sī)考方(fāng)法,我(wǒ)们(men)可(kě)以(yǐ)得到(dào)秒(miǎo)十(shí)位、分(fēn)个(gè)位、分(fēn)十(shí)位、时(shí)个(gè)位和(hé)时(shí)十(shí)位的(de)代(dài)碼,完整的(de)代(dài)碼如(rú)下(xià)表(biǎo)。
always @(posedge clk or negedge rst_n)begin
if(!rst_n)begin
cnt 《= 0;
end
else if(add_cnt)begin
if(end_cnt)
cnt 《= 0;
else
cnt 《= cnt + 1;
end
end
assign add_cnt = 1 ;
assign end_cnt = add_cnt && cnt== 50_000_000-1;
always@(posedge clk or negedge rst_n)begin
if(rst_n==1’b0)begin
miao_g 《= 0;
end
else if(add_miao_g)begin
if(end_miao_g)begin
miao_g 《= 0;
end
else begin
miao_g 《= miao_g + 1;
end
end
end
assign add_miao_g = end_cnt;
assign end_miao_g = add_miao_g && miao_g == 10-1;
always @(posedge clk or negedge rst_n)begin
if(rst_n==1‘b0)begin
miao_s 《= 0;
end
else if(add_miao_s)begin
if(end_miao_s)begin
miao_s 《= 0;
end
else begin
miao_s 《= miao_s + 1;
end
end
end
assign add_miao_s = end_miao_g;
assign end_miao_s = add_miao_s && miao_s == 6-1;
always @(posedge clk or negedge rst_n)begin
if(rst_n==1’b0)begin
fen_g 《= 0;
end
else if(add_fen_g)begin
if(end_fen_g)begin
fen_g 《= 0;
end
else begin
fen_g 《= fen_g + 1;
end
end
end
assign add_fen_g = end_miao_s;
assign end_fen_g = add_fen_g && fen_g == 10-1;
always @(posedge clk or negedge rst_n)begin
if(rst_n==1‘b0)begin
fen_s 《= 0;
end
else if(add_fen_s)begin
if(end_fen_s)begin
fen_s 《= 0;
end
else begin
fen_s 《= fen_s + 1;
end
end
end
assign add_fen_s = end_fen_g;
assign end_fen_s = add_fen_s && fen_s == 6-1;
always @(posedge clk or negedge rst_n)begin
if(rst_n==1’b0)begin
shi_g 《= 0;
end
else if(add_shi_g)begin
if(end_shi_g)begin
shi_g 《= 0;
end
else begin
shi_g 《= shi_g + 1;
end
end
end
assign add_shi_g = end_fen_s;
assign end_shi_g = add_shi_g && shi_g ==x-1;
always @(posedge clk or negedge rst_n)begin
if(rst_n==1‘b0)begin
shi_s 《= 0;
end
else if(add_shi_s)begin
if(end_shi_s)begin
shi_s 《= 0;
end
else begin
shi_s 《= shi_s + 1;
end
end
end
assign add_shi_s = end_shi_g;
assign end_shi_s = add_shi_s && shi_s == 3-1;
always@(*)begin
if(shi_s==2)
x =4;
else
x =10;
end
细(xì)心(xīn)的(de)读(dú)者(zhě)可(kě)以(yǐ)發(fà)現(xiàn),上(shàng)面(miàn)每段(duàn)計(jì)數器格式都非(fēi)常相似。沒(méi)錯,这(zhè)就(jiù)是(shì)技巧。我(wǒ)们(men)設計(jì)的(de)这(zhè)套(tào)模板,基本(běn)上(shàng)可(kě)以(yǐ)應(yìng)用(yòng)于(yú)任何场合,任何时(shí)候读(dú)者(zhě)只(zhī)考慮两(liǎng)个(gè)因(yīn)素就(jiù)够了(le),不(bù)会(huì)出(chū)現(xiàn)丢三(sān)落(là)四(sì)的(de)情(qíng)況,而(ér)且每次(cì)只(zhī)需要(yào)考慮一(yī)个(gè)因(yīn)素,保證能(néng)做出(chū)最(zuì)优的(de)設計(jì)。
对(duì)了(le),上(shàng)面(miàn)代(dài)碼中(zhōng),我(wǒ)们(men)沒(méi)有(yǒu)補充信(xìn)号(hào)定(dìng)義这(zhè)些。其实我(wǒ)们(men)認为(wèi)这(zhè)些信(xìn)号(hào)定(dìng)義純屬體(tǐ)力勞動(dòng),是(shì)根(gēn)本(běn)就(jiù)不(bù)需要(yào)学習的(de),所(suǒ)以(yǐ)我(wǒ)们(men)就(jiù)沒(méi)列出(chū)来(lái)。读(dú)者(zhě)有(yǒu)興趣可(kě)必補充。另(lìng)外(wài)加上(shàng)數碼管(guǎn)譯碼電(diàn)路(lù),那(nà)麼(me)一(yī)个(gè)完整的(de)數字(zì)时(shí)鐘(zhōng)代(dài)碼就(jiù)出(chū)来(lái)了(le)。
參考資料:明(míng)德揚至(zhì)簡設計(jì)法原理與(yǔ)應(yìng)用(yòng)- 2.8 數字(zì)时(shí)鐘(zhōng)設計(jì)








