<var id="fnfpo"><source id="fnfpo"></source></var>
<rp id="fnfpo"></rp>

<em id="fnfpo"><object id="fnfpo"><input id="fnfpo"></input></object></em>
<em id="fnfpo"><acronym id="fnfpo"></acronym></em>
  • <th id="fnfpo"><track id="fnfpo"></track></th>
  • <progress id="fnfpo"><track id="fnfpo"></track></progress>
  • <tbody id="fnfpo"><pre id="fnfpo"></pre></tbody>

  • 手把手教你學FPGA設計-秒表功能

    發布時間:2018-9-30 11:08    發布者:luckyb1
    秒表功能
    一、項目背景
    同上一個項目。
    二、設計目標
    開發板或者模塊是有 8 位數碼管,本次設計需要使用1個數碼管,即數碼管0,實現類似于秒表的功能,具體要求如下:
    復位后,數碼管0顯示數字0并持續1秒;然后顯示數字1并持續2秒;然后顯示數字2并持續3秒;以此類推,最后是顯示數字9并持續10秒。然后再次循環
    上板效果圖如下圖所示。
    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
    上板的演示效果,請登陸網址查看:www.mdy-edu.com/xxxx。
    三、模塊設計
    我們要實現的功能,概括起來就是控制8個數碼管,其中數碼管0亮,其他數碼管不亮。并讓數碼管0顯示不同的數字。
    要控制8個數碼管,就需要控制位選信號,即FPGA要輸出一個8位的位選信號,設為seg_sel,其中seg_sel[0]對應數碼管0,seg_sel[1]對應數碼管1,以此類推,seg_sel[7]對應數碼管7。
    要顯示不同的數字,就需要控制段選信號,不需要用到DP,一共有7根線,即FPGA要輸出一個7位的段選信號,設為seg_ment,seg_ment[6]~segm_ment[0]分別對應數碼管的abcdefg(注意對應順序)。
    我們還需要時鐘信號和復位信號來進行工程控制。
    綜上所述,我們這個工程需要4個信號,時鐘clk,復位rst_n,輸出的位選信號seg_sel和輸出的段選信號seg_ment。
      
    信號線
      
    信號線
    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]
    我們先分析要實現的功能,數碼管0顯示數字0,翻譯成信號就是seg_sel的值為8’b1111_1110,seg_ment的值為7’b000_0001。然后數碼管0顯示數字1,也就是說seg_sel的值為8’b1111_1110,seg_ment的值為7’b100_1111。以此類推,數碼管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隔一段時間后會變化,而這個時間在不同時期還不相同。把時間信息補充上,得到下面的波形示意圖。
    file:///C:/Users/pan/AppData/Local/Temp/msohtmlclip1/01/clip_image011.png         上圖就是seg_selseg_seg信號的變化波形圖。在顯示第1個時,seg_sel=8’hfe,seg_ment=7’h01并持續1秒;在第2個時,seg_sel=8’hfe,seg_ment=7’h4f并持續2秒;以此類推,第8個時,seg_sel=8’hfe,seg_ment=7’h04并持續10秒。然后又再次重復。
    由波形圖可知,我們需要1個計數器用來計算時間,如2秒、3秒等。另外,我們還需要一個計數器,用來計算在第幾個階段中。所以總共需要2個計數器。
    本工程的工作時鐘是50MHz,即周期為20ns,計數器計數到2_000_000_000/20=100_000_000個,我們就能知道2秒時間到了。以類類推,在第2次時,數到150_000_000個,就知道了3秒時間到。第9次時,數到500_000_000個,就表示10秒時間到。另外,由于該計數器是不停地計數,永遠不停止的,可以認為加1條件一直有效,可寫成: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 ;
    第二個計數器用于表示第幾個,很自然可以看到,每個階段完成后,該計數器加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 ;
    接下來設計seg_sel。該信號一直為8’hfe,所以代碼直接寫成如下:
    file:///C:/Users/pan/AppData/Local/Temp/msohtmlclip1/01/clip_image016.png
    1
    assign seg_sel = 8'hfe ;
    我們來思考輸出信號seg_ment的變化。概括起來,在第1次的時候輸出值為7’h01;在第2次的時候輸出值為7’h4f;以此類推,在第8次的時候輸出值為7’h0f。我們用信號cnt1來代替第幾次,也就是:當cnt1==0的時候,輸出值為7’h01;在cnt1==1的時候輸出值為7’h4f;以此類推,在cnt1==9的時候輸出值為7’h04。再進一步翻譯成代碼,就變成如下:
    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的值確定下來。
    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
    此次,主體程序已經完成。接下來是將module補充完整。
    module的名稱定義為my_time。并且我們已經知道該模塊有4個信號:clk、rst_n、seg_selseg_ment,代碼如下:
    file:///C:/Users/pan/AppData/Local/Temp/msohtmlclip1/01/clip_image020.png
    1
      
    2

    手把手教你學FPGA設計-秒表功能.pdf

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

    本文地址:http://www.portaltwn.com/thread-547888-1-1.html     【打印本頁】

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

    廠商推薦

    • Microchip視頻專區
    • Dev Tool Bits——使用MPLAB® Discover瀏覽資源
    • Dev Tool Bits——使用條件軟件斷點宏來節省時間和空間
    • Dev Tool Bits——使用DVRT協議查看項目中的數據
    • Dev Tool Bits——使用MPLAB® Data Visualizer進行功率監視
    • 貿澤電子(Mouser)專區
    關于我們  -  服務條款  -  使用指南  -  站點地圖  -  友情鏈接  -  聯系我們
    電子工程網 © 版權所有   京ICP備16069177號 | 京公網安備11010502021702
    快速回復 返回頂部 返回列表
    精品一区二区三区自拍图片区_国产成人亚洲精品_亚洲Va欧美va国产综合888_久久亚洲国产精品五月天婷