1基礎理論部分 分頻,是的,這個概念也很重要。分頻是指將一單一頻率信號的頻率降低為原來的1/N,就叫N分頻。實現分頻的電路或裝置稱為“分頻器”,如把33MHZ的信號2分頻得到16.5MHZ的信號,3分頻得到11MHZ的信號,10分頻得到3.3MHZ的信號。 分頻主要是相對於主晶振來說,用不到那麼高的 ...
1基礎理論部分
1.1分頻
分頻,是的,這個概念也很重要。分頻是指將一單一頻率信號的頻率降低為原來的1/N,就叫N分頻。實現分頻的電路或裝置稱為“分頻器”,如把33MHZ的信號2分頻得到16.5MHZ的信號,3分頻得到11MHZ的信號,10分頻得到3.3MHZ的信號。
分頻主要是相對於主晶振來說,用不到那麼高的頻率,開發板一般根據具體需要會加入晶振,一般若是功耗較高可選用50MHz,其他情況可以相對調整,如24MHz等等。那麼分頻的典型應用,二分頻,四分頻,八分頻,還有任意分頻。
對於分頻,我們可以利用quartus ii 自帶的PLL進行分頻,這樣會占用一定的資源,也可以利用計數器實現一定的分頻,註意,FPGA中不同於其他的CPU,沒有計時器的概念,只有計數器。
1.2 LED
LED(light emitting diode),發光二極體,簡稱LED,是一種能夠將電能轉化成可見光的固態的半導體器件,可以直接把電轉換成光。可以用在電路及儀器中作指示燈,或者組成文字或數字顯示等。有不同化合物製成的二極體如砷,鎵,磷等化合物製成,不同的化合物組合會顯示不同顏色的光。
在設計LED的驅動電路時,不能直接接到3.3V或者5V來點亮,LED有額定電流,超過這個額定電流,LED就會燒掉,反接也會燒掉。一般的LED的額定電流從10mA~1A不等。FPGA開發採用的LED主要是貼片0805或者0603等,額定電路一般從10mA~30mA.
1.3 74HC595
開發板上面的LED控制是用串入並出/串出的移位寄存器74HC595晶元,晶元在電路中的接入情況如圖5.1所示,實物圖如圖5.2所示。其中MR引腳直接接高電平,不進行複位。串出引腳9不接,不進行串出引腳的使用。輸出使能引腳13直接接地,手冊上建議。11和12引腳分別為移位寄存器時鐘輸入和存儲時鐘輸入,分別引出。
圖5.1 LED部分電路圖
圖5.2 實物圖
2 verilog代碼實現部分
2.1 74HC595 控制部分
14行定義了一個全局參數WIDTH = 8,用來控製程序下麵所有的有關於數量的使用。
59行和60行分別定義了時鐘信號和時鐘使能信號,其中時鐘信號sclk時鐘周期前半段為低電平,後半段為高電平,可以實現對數據的中間採樣,時鐘使能信號led_time可以控制數據和時鐘對齊。48行的state是一個狀態改變的寄存器,只要數據一更新,state就有效。
75行定義了update_input信號用來檢測輸入數據的變化。
狀態轉換部分,在case語句中先檢測state的初始位,然後進入迴圈操作,檢測update_input是否使能,使能更新state,不使能保持state,更新後開始輸出位數計數器led_cnt的計數
在121到123行,對輸出的三路信號進行了約束限制,這種方法值的借鑒,在用不到時不輸出信號,用到時輸出信號,最大量的節省時鐘。Led_data_out是先從高位輸出到低位。
2.2 LED數據產生部分
在模塊聲明處,仍舊使用全局定義變數,控制模塊中常量的使用。
計數模塊,產生時鐘使能信號。
Reg型變數Led_out_cnt是用來控制LED變化, 每當時鐘信號使能開始計數,板卡上面一共有8個LED,所以計數8個即可。
LED解碼部分,通過上面的led_out_cnt信號進行解碼,控制LED的流水操作。
3 modelsim驗證部分
3.1 led_generate 模塊模擬
43行產生時鐘信號,通過PERIOD進行周期控制。49~51產生複位信號,當時鐘兩次下降沿後複位信號拉高。56行用來監測led_out輸出的時間,生成的腳本文件如圖5.3所示。
圖5.3模擬波形
圖5.4是利用腳本文件生成,可以觀察到實現了流水功能,且時間間隔1s;
圖5.4 腳本生成文件
3.2 led_74HC595 模塊模擬
前半部分和上述都一樣,可以作為固定部分,大家可以自行複製即可。59行到63行增加了系統輸入信號初始化部分。在輸入信號輸入前,最好最安全就是進行一次初始化。
75行到87行是對輸入進行模擬輸入,並監測led_data-out信號,輸出的結果如圖5.5所示,由圖可以看到時間間隔為120ns。
圖5.6是模擬波形,可以看到時鐘led_sclk每次採樣在輸入信號的正中間位置,最大程度保證採樣可靠。
圖5.5 腳本文件
圖5.6 模擬波形