数字系统设计学习之VHDL输入设计
前言
繼續數字系統設計的學習,對QuartusII9的使用相對開始熟悉了很多,正好課程進度學習到了VHDL語言,嘗試用VHDL語言完成板載測試,本次實現的功能是花式流水燈。
本文原創,創作不易,轉載請注明!!!
本文鏈接
個人博客:https://ronglin.fun/?p=260
PDF鏈接:見博客網站
CSDN: https://blog.csdn.net/RongLin02/article/details/115432284
實現流水燈
創建project
用QuartusII 新建一個名為water_led的項目文件。
芯片照常選擇FLEX10K中的FLEX10K20TC144-4,如果這里選錯了后面也可以改的
接下來就是一路next就行了。
VHDL
新建文件
下面新建一個VHDL文件,菜單欄File–New–VHDL File然后ok就行了。
效果設計和源碼
首先我想的是實現一個8位led燈的流水燈,根據cp信號,從右到左,然后交替亮,最后變成全0,大概如下:
00000001 00000010 00000100 00001000 00010000 00100000 01000000 1000000010101010 01010101 11111111 00000000大概我想實現的效果就是這樣,然后開始頭禿敲源碼
library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_arith.all;ENTITY water_led is --配置實體port(CLK,CLR : in std_logic;res : out std_logic_vector(7 downto 0)); end ;architecture func of water_led is --配置結構體 signal state : integer range 11 downto 0 := 0; --定義信號,全局量 beginprocess(CLR,CLK) --監聽時鐘信號和清0信號beginif CLR = '1' thenres <= "00000000";state <= 0;elsif CLK'event and CLK = '1' then --時鐘變化且上升沿state <= state+1; --每次觸發全局量自增if state < 8 thenres <= conv_std_logic_vector(2**state,8);elsif state = 8 thenres <= "10101010";elsif state = 9 thenres <= "01010101";elsif state = 10 thenres <= "11111111";elsif state = 11 thenres <= "00000000";state <= 0; --從頭開始end if;end if;end process; end func;簡單的提示一下細節和可能出現的問題:
就說一下這句代碼res <= conv_std_logic_vector(2**state,8);,函數conv_std_logic_vector()的作用是將整型轉化為位矢量,第一個參數為要轉化的整數,第二個參數是轉化的位矢量的位寬。
問題可能有:
1.沒法輸入中文。可能是QuartusII9太老了,沒法輸入中文,可以先用記事本,輸入好中文,然后copy過去。
2.信號變量延遲問題。編程過程中,代碼邏輯沒問題,但是仿真在第一輪循環之后總會多一個cp周期之后才開始第二輪的循環。剛開始并沒有留意,板載的時候才明顯的感受到,后來查了資料才知道,信號的賦值是有延遲的,仔細分析分析我的代碼,在最后state <= 0;之后,第二次循環開始,執行到state <= state+1;如果按照軟件設計思想,現在的state的值應該是1,然后res應該輸出的值是2的1次方,就應該第二輪第一個值是2,但是不論看仿真還是看板載測試,都是從1開始,說明信號的賦值是延遲的。有關更多這篇博客有詳細的說明:https://blog.csdn.net/qijitao/article/details/50629305
編譯
編譯之前需要簡單的配置一下,如果之前選錯了芯片的話,可以在Assignments–Setting中,左側選擇Device,然后就可以修改芯片了,如果還想修改更詳細的配置,例如配置文件格式啥的,可以在右側中的Device and Pin Opinions中修改。
同時,教材上還提供了選擇編譯模式的方法。就是在Assignments–Setting中,選擇左側的Compilation Process Settings,然后在右側勾選上Use smart compilation和Preserve fewer node names to save disk space,據說可以讓每一次重復編譯運行的更快。
之后就是編譯了,可以直接點擊快捷欄的start Compilation的倒三角按鈕,也可以在菜單欄中Processing中選擇start Compilation,一樣的。
編譯成功成功之后,還可以看生成的寄存器傳輸級(RTL),菜單欄Tool–Netlist Viewers–RTL Viewer,就可以看到了。
仿真與板載
仿真和之前的一樣了,菜單欄File–New–Vector Waveform File然后ok就行了。
有關仿真波形圖的使用,我的另一篇博客中有詳細的講解:數字系統設計學習之QuartusII9下載程序
只需注意時鐘信號的設置方法,全選中CLK信號,在左側找到一個帶有小鐘表的圖標,名為Overwrite Clock
然后就可以設置時鐘信號了。時鐘時長設為1us,間隔設為50ns一變
直接看結果
循環是1-2-4-8-16-32-64-128-170-85-255-0,和我設計的一樣。
在Assignments–Pins中選好陣腳,然后一定要記得再編譯一次,查看板載測試,板載的時候一定要注意重啟設置禁用數字簽名
成功了,=w=
總結
以上是生活随笔為你收集整理的数字系统设计学习之VHDL输入设计的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: statement执行insert in
- 下一篇: Vue第一部分(6):Vue的生命周期