• <tr id='DS2ADt'><strong id='DS2ADt'></strong><small id='DS2ADt'></small><button id='DS2ADt'></button><li id='DS2ADt'><noscript id='DS2ADt'><big id='DS2ADt'></big><dt id='DS2ADt'></dt></noscript></li></tr><ol id='DS2ADt'><option id='DS2ADt'><table id='DS2ADt'><blockquote id='DS2ADt'><tbody id='DS2ADt'></tbody></blockquote></table></option></ol><u id='DS2ADt'></u><kbd id='DS2ADt'><kbd id='DS2ADt'></kbd></kbd>

    <code id='DS2ADt'><strong id='DS2ADt'></strong></code>

    <fieldset id='DS2ADt'></fieldset>
          <span id='DS2ADt'></span>

              <ins id='DS2ADt'></ins>
              <acronym id='DS2ADt'><em id='DS2ADt'></em><td id='DS2ADt'><div id='DS2ADt'></div></td></acronym><address id='DS2ADt'><big id='DS2ADt'><big id='DS2ADt'></big><legend id='DS2ADt'></legend></big></address>

              <i id='DS2ADt'><div id='DS2ADt'><ins id='DS2ADt'></ins></div></i>
              <i id='DS2ADt'></i>
            1. <dl id='DS2ADt'></dl>
              1. <blockquote id='DS2ADt'><q id='DS2ADt'><noscript id='DS2ADt'></noscript><dt id='DS2ADt'></dt></q></blockquote><noframes id='DS2ADt'><i id='DS2ADt'></i>

                【技術分享】FPGA雜記之基礎篇

                日期:2020-11-23 作者:彩神网創研社 返回列表

                Verilog基礎語法


                1605866576384260.png


                1.1  可綜合模♂塊


                以module為單元,具體實現△如下


                2.png


                1.1.1 時序邏輯


                以異步觸發的D觸發器為例,時序邏輯在always塊裏實現


                1605866624540881.png


                主要』註意點:


                1. 聲明模塊時︾,輸入變●量一定是wire類型


                2. 聲明模塊時,輸出變量可以是wire,也可以是reg, reg變量@只能在always塊中賦值


                3. 敏感列表既可以是邊沿觸︽發,也可以是電平觸ζ 發


                4. 沿觸發的邏輯裏,一定采用的是非阻塞♀觸發<=


                1.1.2 組合邏輯


                以數據選擇器為例,組合邏輯通常使ξ 用assign語句賦值


                1605866720680439.png 1605866733735808.png


                主要註意點:


                1. sel = 0時,c = a;sel = 1時,c =b,即二選一數據選擇○器。四選一則有兩個選◥擇端,四個輸◣入端,八選一則是三個選擇端,八個輸入端。


                2. wire 變量一↓定要用連續賦值語句賦值,而且必須用阻塞賦①值


                1.2 仿真模塊


                仿真模塊和可綜▓合模塊的區別:


                可綜合模♀塊最終生成的bit文件會燒錄進芯片〓運行,而仿真模塊編譯過後是在仿真軟件(例如modelsim)上運行的。仿真模№塊是基於可綜合⌒模塊進行例化,並通過仿真軟件的模擬,可以初步驗證我們寫的可綜合模塊的№實現現象。


                以計數↑器為例,可綜合模塊如下:


                6.png


                基於以上可綜合模塊的仿真模塊如下:


                1605866766460615.png


                1. 仿真的模塊聲明◇不需要輸入列表


                2. initial塊只能對【寄存器】量〖進行賦值


                3. 例化模塊╱時,如果原始模塊是輸出變量,則括號內必須【wire變量】


                HDL常見例子


                2.1 譯碼器


                2.1.1 可綜合模塊(case語句)


                此模塊用case實現∑ 了一個數據選擇的功能,先產生◆了一個8位計數器,通過判斷計數器的值來輸出不同的取值,當計數器計數到1時,o_data和o_dv分別輸出5和1,當計數器為2時,輸出7和1,其余均』輸出0。(Note:Case語句常常運用於狀態機中狀態的判斷)


                8.png


                Case語︾句註意點:


                必須有default語句,否〓則會形成鎖存器


                2.1.2 仿真模塊


                10.png


                2.2 狀態機


                由於FPGA內部語句塊都是並行運行的,當我們希望FPGA按照順序執行我們的語句時,就會用到狀∞態機。


                下面例子是使♀用狀態機模擬的一個簡∏單的自動售貨機,該售貨機中的商品 2.5 元一件,每次投幣既能投入 1 元, 也能投入 0.5 元,當投入 3 元時,需要設定找零。


                2.2.1 狀態圖


                1605866866887481.png


                2.2.2 可綜合模塊(2段式ぷ狀態機)


                1605866880697085.png

                13.png

                1605866920718563.png


                2.2.3 仿真模塊


                15.png


                2.2.4 仿真腳本


                仿真腳本可以省去人工操作modelsim軟件圖形頁面的步驟,運行腳本,modelsim可以根據腳本命令自動運行包括】創建工∴作目錄,編譯文件,啟動仿真等步驟,以下是本例中的仿真腳本。


                1605866954668024.png


                仿真腳〓本編寫好後,只需要進入仿真軟件(本例使用的是◤modelsim),改變當前路徑到腳本保存的路徑,然後在modelsim命令行輸入¤ do  [腳本文■件名]即可。


                1605866970857043.png

                18.png


                仿真結果:


                1605866987123831.png


                2.2.5 上板測試


                上板測試對原來的條件做了一定改動更方便觀測結果,輸入和輸出分別使用的按鍵和LED燈,測試版使用的◇是Anlogic的EF3L40CG332B_DEV,實現的功能☆如下:


                ① 在開發板上完成自動售貨機的實驗,投幣的動作通過按鍵實現, 當按一次ω按鍵(按下到擡起算一次),算作投幣一⌒次;


                ② 按鍵有兩個,按下分別代表 5 毛和 1 元,可樂售價 2.5 元;


                ③ 當投入ω 總金額為 5 毛時, led 燈亮一個,投入總金額為 1 元時, led 燈亮兩個, 投入總金額為 1.5 元時, led 燈亮三個, 投入總金額為 2 元時, led 亮四個, 用單向※流水燈效果充當出可樂並且不找零的情況,用雙向流ぷ水燈效果充當既出可樂又找零的情況。流水ㄨ燈持續十秒後熄滅,狀態回到『初始狀態。


                重新設計狀態圖如下:


                20.png


                代碼詳見工程fsm_key,筆記不再贅述,此次筆記主要記錄關於頂層模塊和例化▓的相關知識點:


                工程目錄如下所♀示:


                21.png


                各模塊之間的關系是:


                頂層文件是fsm.v,在fsm.v中▼調用了模塊led_water_single,led_Water_double和key_debounce,這三個模塊的功能分別是單向流水燈,雙向流水燈和按鍵消抖。想在頂層文件中〗調用對應的模塊需要在頂層文件︽中對相應的模塊進行例化,以單向流水燈為例。


                單向流水燈≡的聲明如下:


                22.png


                (具體功能實現代碼略,如有需要,請登錄www.fortune-co.com留言)


                23.png


                那麽在fsm.v中例@ 化方法如下:


                24.png


                括號外的信號是對應的聲明信號;括號內的信號是從fsm模塊中傳入的信號,該信號名稱可以自定義。


                整個工程的框架如下:(由於本實驗沒有另外寫◣一個總的TOP文件,而是將例化和狀態機信號處→理都放在了fsm模塊中,因此top層和狀態機模塊都標註的是fsm)


                1605867067105270.png


                其中key05,key10,就是從外界接入的信號,led[7:0]即輸出信號。接入信號我們要引到對應的按鍵,可以參考EF3L40CG332B_DEV的原理圖


                1605867082525264.png1605867088595792.png


                SW2和SW3對應的FPGA的管腳♂分別是R19和R20,同理可查,八個led的對應腳,並寫出相應的管腳〇約束文件


                28.png


                管腳約束文件寫完後,在可綜合模塊頂層文件中的輸入輸出信號就會對應到相應的物理輸入輸出,也可以使用圖形頁面設置。


                完成後編譯下載到板子上觀測現象。


                在本次實驗的過程中也▽發生了一個編程錯※誤問題,剛編寫完上板測試時發現結果和預想的有差異▲,具體錯處在輸入3元進入雙向流水燈的狀態時,雙向流水燈正向流水正』常,當反向流水時,在倒數第二個燈會卡住,然後反復亮滅倒數一二個燈,沒法完成反㊣向流水。


                1605867125644660.png


                由於第一次正向流水是正常的,因此推測是在反向流▓水時有條件判斷錯誤使得反向流水無法正常運行,進入到led_water_double模塊關於反向流水燈的操作模塊,經查驗發現是設置翻轉←標誌的時候判斷條件寫錯了。


                29.png


                判斷條件應該是led == 8’b1111_1110,更改後,實驗現象符合預期要求。


                以上是FPGA雜記基礎篇的第一部分,因文章篇幅所限,本文先分享到這裏。後續會有更多的基於FPGA的設計文章,敬請期待……


                返回列表