數(shù)字時(shí)鐘是常見(jiàn)的畢業(yè)設(shè)計(jì)題目。我們做畢業(yè)設(shè)計(jì)時(shí),一般使用數(shù)碼管來(lái)顯示數(shù)字。小時(shí)、分鐘和秒鐘各兩位數(shù)字,所以需要用到6位的數(shù)碼管。
如果平時(shí)不動(dòng)手,要做這個(gè)畢業(yè)設(shè)計(jì),很多人都會(huì)覺(jué)得挺難的。收集到的代碼,其風(fēng)格也是五花八門,第一感覺(jué)是貌似能看懂,但就是不知道怎么設(shè)計(jì)出來(lái)的。
其實(shí)如果有正確的設(shè)計(jì)思路和方法,其實(shí)現(xiàn)起來(lái)是非常簡(jiǎn)單的。下面我們就核心的數(shù)字模塊為例,講解如何使用至簡(jiǎn)設(shè)計(jì)法來(lái)實(shí)現(xiàn)。
數(shù)字模塊的功能,是產(chǎn)生6個(gè)信號(hào),分別表示時(shí)十位、時(shí)個(gè)位、分十位、分個(gè)位、秒十位和秒個(gè)位的值。例如上述信號(hào)值依次為2、1、4、3、5、9時(shí),則表示時(shí)間為21點(diǎn)43分59秒。
仔細(xì)觀察6個(gè)信號(hào),每個(gè)單獨(dú)來(lái)看,其數(shù)字都是遞增的,增加到一定數(shù)后就清零。以秒個(gè)位為例,開(kāi)始時(shí)值為0,然后是1、2、3依次增加,直到變成9后,然后變成0,再次循環(huán)。其他信號(hào)都是相同的規(guī)律。這些依次遞增的信號(hào),就是計(jì)數(shù)器。
我們認(rèn)識(shí)到這些信號(hào)是計(jì)數(shù)器,那就好辦了。計(jì)數(shù)器設(shè)計(jì)只需要考慮兩點(diǎn),什么時(shí)候加1和要數(shù)多少個(gè),明確這兩個(gè)問(wèn)題后,剩下的就是套用計(jì)數(shù)器模板了。
以秒個(gè)位這個(gè)計(jì)數(shù)器為例,這個(gè)計(jì)數(shù)器加1的條件是什么呢?到了1秒就加1。那我們?cè)趺粗?秒鐘時(shí)間到了呢?FPGA是通過(guò)數(shù)時(shí)鐘周期數(shù)來(lái)確定時(shí)間的。例如下圖,假設(shè)時(shí)鐘頻率是50MHz,即時(shí)鐘周期是20ns,cnt是每個(gè)時(shí)鐘加1,則當(dāng)cnt==99時(shí),就說(shuō)明數(shù)了100個(gè)時(shí)鐘周期,也就是時(shí)間是100*20=2000ns了。
同樣的道理,1秒鐘時(shí)間,我們就是數(shù)1s/20ns= 50_000_000個(gè)時(shí)鐘周期。我們也認(rèn)識(shí)到這個(gè)cnt也是計(jì)數(shù)器,其加1條件是“1”,要數(shù)50_000_000個(gè)數(shù)。我們套用計(jì)數(shù)器模塊,即有下面代碼。
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語(yǔ)句除了名字后,完全套用模板,不用更改。加1條件體現(xiàn)在第13行,要數(shù)多少個(gè)體現(xiàn)在第14行。
確定了cnt后,那么秒個(gè)位的加1條件就非常明確了,就是cnt數(shù)到50_000_000個(gè),也就是end_cnt有效的時(shí)候。所以秒個(gè)位的加1條件是end_cnt。
秒個(gè)位要數(shù)多少個(gè)數(shù)字呢?由0到9,因此有10個(gè)。
綜上所述,我們得到秒個(gè)位的代碼如下表。
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;
用類似于秒個(gè)位的思考方法,我們可以得到秒十位、分個(gè)位、分十位、時(shí)個(gè)位和時(shí)十位的代碼,完整的代碼如下表。
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ì)心的讀者可以發(fā)現(xiàn),上面每段計(jì)數(shù)器格式都非常相似。沒(méi)錯(cuò),這就是技巧。我們?cè)O(shè)計(jì)的這套模板,基本上可以應(yīng)用于任何場(chǎng)合,任何時(shí)候讀者只考慮兩個(gè)因素就夠了,不會(huì)出現(xiàn)丟三落四的情況,而且每次只需要考慮一個(gè)因素,保證能做出最優(yōu)的設(shè)計(jì)。
對(duì)了,上面代碼中,我們沒(méi)有補(bǔ)充信號(hào)定義這些。其實(shí)我們認(rèn)為這些信號(hào)定義純屬體力勞動(dòng),是根本就不需要學(xué)習(xí)的,所以我們就沒(méi)列出來(lái)。讀者有興趣可必補(bǔ)充。另外加上數(shù)碼管譯碼電路,那么一個(gè)完整的數(shù)字時(shí)鐘代碼就出來(lái)了。
-
計(jì)數(shù)器
+關(guān)注
關(guān)注
32文章
2256瀏覽量
94561 -
數(shù)字時(shí)鐘
+關(guān)注
關(guān)注
2文章
150瀏覽量
20343
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論