手把手教你學(xué)FPGA設計-秒表功能

發(fā)布時(shí)間:2018-9-30 11:08    發(fā)布者:luckyb1
秒表功能
一、項目背景
同上一個(gè)項目。
二、設計目標
開(kāi)發(fā)板或者模塊是有 8 位數碼管,本次設計需要使用1個(gè)數碼管,即數碼管0,實(shí)現類(lèi)似于秒表的功能,具體要求如下:
復位后,數碼管0顯示數字0并持續1秒;然后顯示數字1并持續2秒;然后顯示數字2并持續3秒;以此類(lèi)推,最后是顯示數字9并持續10秒。然后再次循環(huán)
上板效果圖如下圖所示。
file:///C:/Users/pan/AppData/Local/Temp/msohtmlclip1/01/clip_image002.jpgfile:///C:/Users/pan/AppData/Local/Temp/msohtmlclip1/01/clip_image004.jpgfile:///C:/Users/pan/AppData/Local/Temp/msohtmlclip1/01/clip_image006.jpgfile:///C:/Users/pan/AppData/Local/Temp/msohtmlclip1/01/clip_image008.jpg
上板的演示效果,請登陸網(wǎng)址查看:www.mdy-edu.com/xxxx。
三、模塊設計
我們要實(shí)現的功能,概括起來(lái)就是控制8個(gè)數碼管,其中數碼管0亮,其他數碼管不亮。并讓數碼管0顯示不同的數字。
要控制8個(gè)數碼管,就需要控制位選信號,即FPGA要輸出一個(gè)8位的位選信號,設為seg_sel,其中seg_sel[0]對應數碼管0,seg_sel[1]對應數碼管1,以此類(lèi)推,seg_sel[7]對應數碼管7。
要顯示不同的數字,就需要控制段選信號,不需要用到DP,一共有7根線(xiàn),即FPGA要輸出一個(gè)7位的段選信號,設為seg_ment,seg_ment[6]~segm_ment[0]分別對應數碼管的abcdefg(注意對應順序)。
我們還需要時(shí)鐘信號和復位信號來(lái)進(jìn)行工程控制。
綜上所述,我們這個(gè)工程需要4個(gè)信號,時(shí)鐘clk,復位rst_n,輸出的位選信號seg_sel和輸出的段選信號seg_ment。
  
信號線(xiàn)
  
信號線(xiàn)
FPGA管腳
內部信號
SEG_E
SEG0
Y6
seg_ment[2]
SEG_DP
SEG1
W6
未用到
SEG_G
SEG2
Y7
seg_ment[0]
SEG_F
SEG3
W7
seg_ment[1]
SEG_D
SEG4
P3
seg_ment[3]
SEG_C
SEG5
P4
seg_ment[4]
SEG_B
SEG6
R5
seg_ment[5]
SEG_A
SEG7
T3
seg_ment[6]
DIG1
DIG_EN1
T4
seg_sel[0]
DIG2
DIG_EN2
V4
seg_sel[1]
DIG3
DIG_EN3
V3
seg_sel[2]
DIG4
DIG_EN4
Y3
seg_sel[3]
DIG5
DIG_EN5
Y8
seg_sel[4]
DIG6
DIG_EN6
W8
seg_sel[5]
DIG7
DIG_EN7
W10
seg_sel[6]
DIG8
DIG_EN8
Y10
seg_sel[7]
我們先分析要實(shí)現的功能,數碼管0顯示數字0,翻譯成信號就是seg_sel的值為8’b1111_1110,seg_ment的值為7’b000_0001。然后數碼管0顯示數字1,也就是說(shuō)seg_sel的值為8’b1111_1110,seg_ment的值為7’b100_1111。以此類(lèi)推,數碼管0顯示數字9,就是seg_sel的值為8’b1111_1110,seg_ment的值為7’b000_0100。
file:///C:/Users/pan/AppData/Local/Temp/msohtmlclip1/01/clip_image009.png
seg_sel一直為8’hfe,不變化。seg_ment隔一段時(shí)間后會(huì )變化,而這個(gè)時(shí)間在不同時(shí)期還不相同。把時(shí)間信息補充上,得到下面的波形示意圖。
file:///C:/Users/pan/AppData/Local/Temp/msohtmlclip1/01/clip_image011.png         上圖就是seg_selseg_seg信號的變化波形圖。在顯示第1個(gè)時(shí),seg_sel=8’hfe,seg_ment=7’h01并持續1秒;在第2個(gè)時(shí),seg_sel=8’hfe,seg_ment=7’h4f并持續2秒;以此類(lèi)推,第8個(gè)時(shí),seg_sel=8’hfe,seg_ment=7’h04并持續10秒。然后又再次重復。
由波形圖可知,我們需要1個(gè)計數器用來(lái)計算時(shí)間,如2秒、3秒等。另外,我們還需要一個(gè)計數器,用來(lái)計算在第幾個(gè)階段中。所以總共需要2個(gè)計數器。
本工程的工作時(shí)鐘是50MHz,即周期為20ns,計數器計數到2_000_000_000/20=100_000_000個(gè),我們就能知道2秒時(shí)間到了。以類(lèi)類(lèi)推,在第2次時(shí),數到150_000_000個(gè),就知道了3秒時(shí)間到。第9次時(shí),數到500_000_000個(gè),就表示10秒時(shí)間到。另外,由于該計數器是不停地計數,永遠不停止的,可以認為加1條件一直有效,可寫(xiě)成:assignadd_cnt0==1。綜上所述,結合變量法,該計數器的代碼如下
file:///C:/Users/pan/AppData/Local/Temp/msohtmlclip1/01/clip_image013.jpg
1
  
2
  
3
  
4
  
5
  
6
  
7
  
8
  
9
  
10
  
11
  
12
  
13
  
14
always @(posedge clk or negedge  rst_n)begin
  
     if(!rst_n)begin
  
         cnt0 <= 0;
  
     end
  
     else if(add_cnt0)begin
  
         if(end_cnt0)
  
            cnt0 <= 0;
  
         else
  
            cnt0 <= cnt0 + 1;
  
     end
  
end
  
  
assign add_cnt0 = 1 ;
  
assign end_cnt0 = add_cnt0 &&  cnt0== x-1 ;
第二個(gè)計數器用于表示第幾個(gè),很自然可以看到,每個(gè)階段完成后,該計數器加1,因此加1條件可為end_cnt0。該計數器一共要數10次。所以代碼為:
file:///C:/Users/pan/AppData/Local/Temp/msohtmlclip1/01/clip_image015.jpg
1
  
2
  
3
  
4
  
5
  
6
  
7
  
8
  
9
  
10
  
11
  
12
  
13
  
14
always @(posedge clk or negedge  rst_n)begin
  
     if(!rst_n)begin
  
         cnt1 <= 0;
  
     end
  
     else if(add_cnt1)begin
  
         if(end_cnt1)
  
             cnt1 <= 0;
  
         else
  
            cnt1 <= cnt1 + 1;
  
     end
  
end
  
  
assign add_cnt1 = end_cnt0;
  
assign end_cnt1 = add_cnt1 &&  cnt1== 10-1 ;
接下來(lái)設計seg_sel。該信號一直為8’hfe,所以代碼直接寫(xiě)成如下:
file:///C:/Users/pan/AppData/Local/Temp/msohtmlclip1/01/clip_image016.png
1
assign seg_sel = 8'hfe ;
我們來(lái)思考輸出信號seg_ment的變化。概括起來(lái),在第1次的時(shí)候輸出值為7’h01;在第2次的時(shí)候輸出值為7’h4f;以此類(lèi)推,在第8次的時(shí)候輸出值為7’h0f。我們用信號cnt1來(lái)代替第幾次,也就是:當cnt1==0的時(shí)候,輸出值為7’h01;在cnt1==1的時(shí)候輸出值為7’h4f;以此類(lèi)推,在cnt1==9的時(shí)候輸出值為7’h04。再進(jìn)一步翻譯成代碼,就變成如下:
file:///C:/Users/pan/AppData/Local/Temp/msohtmlclip1/01/clip_image017.png
1
  
2
  
3
  
4
  
5
  
6
  
7
  
8
  
9
  
10
  
11
  
12
  
13
  
14
  
15
  
16
  
17
  
18
  
19
  
20
  
21
  
22
  
23
  
24
  
25
  
26
  
27
  
28
  
29
  
30
  
31
  
32
  
33
  
34
  
35
always   @(posedge clk or negedge rst_n)begin
  
     if(rst_n==1'b0)begin
  
         seg_ment <= 7'h01;
  
     end
  
     else if(cnt1==0)begin
  
         seg_ment <= 7'h01;
  
     end
  
     else if(cnt1==1)begin
  
         seg_ment <= 7'h4f;
  
     end
  
     else if(cnt1==2)begin
  
         seg_ment <= 7'h12;
  
     end
  
     else if(cnt1==3)begin
  
         seg_ment <= 7'h06;
  
     end
  
     else if(cnt1==4)begin
  
         seg_ment <= 7'h4c;
  
     end
  
     else if(cnt1==5)begin
  
         seg_ment <= 7'h24;
  
     end
  
     else if(cnt1==6)begin
  
         seg_ment <= 7'h20;
  
    end
  
     else if(cnt1==7)begin
  
         seg_ment <= 7'h0f;
  
     end
  
     else if(cnt1==8)begin
  
         seg_ment <= 7'h00;
  
     end
  
     else if(cnt1==9)begin
  
         seg_ment <= 7'h04;
  
     end
  
end
然后,用組合邏輯把x的值確定下來(lái)。
file:///C:/Users/pan/AppData/Local/Temp/msohtmlclip1/01/clip_image018.png
file:///C:/Users/pan/AppData/Local/Temp/msohtmlclip1/01/clip_image019.png
1
  
2
  
3
  
4
  
5
  
6
  
7
  
8
  
9
  
10
  
11
  
12
  
13
  
14
  
15
  
16
  
17
  
18
  
19
  
20
  
21
  
22
  
23
  
24
  
25
  
26
  
27
  
28
  
29
  
30
  
31
  
32
always   @(*)begin
  
     if(cnt1==0)begin
  
         x = 50_000_000;
  
     end
  
     else if(cnt1==1)begin
  
         x = 100_000_000;
  
     end
  
     else if(cnt1==2)begin
  
         x = 150_000_000;
  
     end
  
     else if(cnt1==3)begin
  
         x = 200_000_000;
  
     end
  
     else if(cnt1==4)begin
  
         x = 250_000_000;
  
     end
  
     else if(cnt1==5)begin
  
         x = 300_000_000;
  
     end
  
     else if(cnt1==6)begin
  
         x = 350_000_000;
  
     end
  
     else if(cnt1==7)begin
  
         x = 400_000_000;
  
     end
  
     else if(cnt1==8)begin
  
         x = 450_000_000;
  
     end
  
     else if(cnt1==9)begin
  
         x = 500_000_000;
  
     end
  
end
此次,主體程序已經(jīng)完成。接下來(lái)是將module補充完整。
module的名稱(chēng)定義為my_time。并且我們已經(jīng)知道該模塊有4個(gè)信號:clk、rst_n、seg_selseg_ment,代碼如下:
file:///C:/Users/pan/AppData/Local/Temp/msohtmlclip1/01/clip_image020.png
1
  
2

手把手教你學(xué)FPGA設計-秒表功能.pdf

1.44 MB, 下載積分: 積分 -1

本文地址:http://selenalain.com/thread-547888-1-1.html     【打印本頁(yè)】

本站部分文章為轉載或網(wǎng)友發(fā)布,目的在于傳遞和分享信息,并不代表本網(wǎng)贊同其觀(guān)點(diǎn)和對其真實(shí)性負責;文章版權歸原作者及原出處所有,如涉及作品內容、版權和其它問(wèn)題,我們將根據著(zhù)作權人的要求,第一時(shí)間更正或刪除。
哈哈哈yyy 發(fā)表于 2019-6-24 00:00:25
看看
您需要登錄后才可以發(fā)表評論 登錄 | 立即注冊

關(guān)于我們  -  服務(wù)條款  -  使用指南  -  站點(diǎn)地圖  -  友情鏈接  -  聯(lián)系我們
電子工程網(wǎng) © 版權所有   京ICP備16069177號 | 京公網(wǎng)安備11010502021702
快速回復 返回頂部 返回列表
午夜高清国产拍精品福利|亚洲色精品88色婷婷七月丁香|91久久精品无码一区|99久久国语露脸精品|动漫卡通亚洲综合专区48页