本系列將帶來FPGA的系統性學習,從最基本的數字電路基礎開始,最詳細操作步驟,最直白的言語描述,手把手的“傻瓜式”講解,讓電子、信息、通信類專業學生、初入職場小白及打算進階提升的職業開發者都可以有系統性學習的機會。
系統性的掌握技術開發以及相關要求,對個人就業以及職業發展都有著潛在的幫助,希望對大家有所幫助。后續會陸續更新 Xilinx 的 Vivado、ISE 及相關操作軟件的開發的相關內容,學習FPGA設計方法及設計思想的同時,實操結合各類操作軟件,會讓你在技術學習道路上無比的順暢,告別技術學習小BUG卡破腦殼,告別目前忽悠性的培訓誘導,真正的去學習去實戰應用,這種快樂試試你就會懂的。話不多說,上貨。
LED流水燈設計
在學習軟件設計時,第一個例程總是“hello world!”,那么學習硬件時,也會有硬件的“hello world”------流水燈。本篇硬件基于叁芯智能科技的 SANXIN-B01開發板,如有想要入手,可查看以下鏈接,官方淘寶店已上架。
在FPGA開發板上有四個LED,我們要做的流水燈,顧名思義就是要LED像流水一樣的點亮熄滅。直白點說就是,點亮第一個一段時間,然后熄滅第一個的同時,點亮第二個·····。在此,我們設置每一個LED點亮的時間為1秒鐘。
硬件介紹
在我們的開發板上有四個LED,設計邏輯為:FPGA輸出高電平時,LED點亮;FPGA輸出低電平時,LED熄滅。
架構設計和信號說明
本設計的模塊名稱為ledrun。
建立工程、新建文件等步驟在專輯前篇中已經明確羅列,以后將不再敘述。這里給出超鏈接,方便參考學習。
設計代碼
parameter可以定義一個參數(默認是32位)。在寫代碼時,對于某些數字,設計者經常利用定義參數的方式進行編寫,方便修改,也方便閱讀。
在硬件電路中,使用計數器當做計時器,每記錄一個數字等于過去一個時鐘周期。由于本設計中采用的clk為50MHz,所以經過50_000_000(在verilog中,如果是描述數字,中間的下劃線只起到分隔的作用,不影響數值的大?。﹤€周期正好為1秒鐘。由于計數器是從0開始計數,所以計數器只需要記錄到50_000_000-1即可。
為了能夠記錄到50_000_000-1這么大的數字,所以定義了一個26位的計數器cnt(參考附錄1:設計中位寬的概念和計算位寬的小技巧)。
在verilog中,“{}”( 大括號)的第一個特殊作用為位拼接。{a,b}相當于將a和b拼接為一個整體,并且是高位為a,低位為b。
當led輸出為4’b0001時,第一個led點亮;經過1秒鐘,輸出4’b0010時,第二個led點亮;經過1秒鐘,輸出4’b0100時,第三個led點亮;經過1秒鐘,輸出4’b1000時,第四個led點亮;經過1秒鐘,輸出4’b0001時,第一個led點亮······按照上述的過程周而復始,就形成了流水燈。
不難發現,led的輸出,一直為3個0,1個1。并且1的位置每1秒鐘移動一次,從頭到尾,然后又到頭。這種現象可以利用移位的思想進行實現。即:led[3]<=led[2]; led[2]<=led[1]; led[1]<=led[0]; led[0]<=led[3];如果將被賦值的組成一個整體,那就是led,賦值的組成一個整體就是{led[2:0], led[3]}。
仿真代碼
$stop是一個系統任務,功能為將modelsim的仿真停止。
設置好testbench后,運行分析綜合后,打開RTL仿真。
波形分析
在modelsim中,打開sim窗口,選擇ledrun_tb下的ledrun_inst。
打開objects,將cnt選中。
objects窗口中顯示在sim窗口中選中模塊中所有的信號。
右擊,將其添加入波形窗口。
返回到wave窗口中,cnt信號已經添加到wave窗口中。由于新添加進來,沒有數據(no data)。
點擊restart。
restart按鈕為重新運行波形,點擊后,軟件會詢問是否保持各種屬性,點擊ok即可。
wave窗口中所有的波形都處于no data 狀態。點擊run –all按鈕,開始運行波形。
運行后,會自動停止。停止在tb文件中的$stop處。
返回wave窗口,各個信號都會有波形。
設置cnt的信號進制為無符號的十進制:右擊cnt信號,選擇radix中的unsigned。
把光標放到復位結束時,選擇放大波形。
放大按鈕的左側第一個按鈕為全局縮放,功能為將所有運行波形,顯示到目前的窗口里;左側第二個為縮小。最左邊和最右邊的按鈕暫時用不到,這里不再介紹。
可以看到,在復位結束后,cnt信號每一個時鐘周期都會增加1。
由于我們設計的流水燈是每1秒鐘流動一個,在上述的仿真中,led數值是不會變化的。如果仿真幾秒鐘的話,仿真的時間會比較長。在此不建議仿真幾秒鐘的時長,有可能會導致電腦卡住。
仿真時,可以將T_1s的值,改成一個較小值。例如:5。然后在此編譯仿真。
在quartus的編譯器中,修改完后。進行綜合分析,保證沒有任何語法錯誤。在之前打開的modelsim中,打開library窗口,找到最上面的work,打開其前面的“+”。
選中剛才修改過的文件,右擊,選擇recompile。此時,modelsim會重新編譯此文件。
回到wave窗口中,點擊restart,run-all。運行波形。
能夠清楚的看到,led在進行移位,并且都是5個周期移動一次。
仿真通過后,關閉modelsim?;氐絨uartus中,將參數修改成為50_000_000,綜合分析后,分配管腳。布局布線,生成配置文件,進行下板測試。
開發板上的四個LED開始做流水狀點亮。
本文由電子發燒友社區發布,轉載請注明以上來源。如需社區合作及入群交流,請添加微信EEFans0806,或者發郵箱liuyong@huaqiu.com。
熱門推薦干貨好文
1、RK3568!四核64位ARMv8.2A架構,匯聚編譯源碼及實戰樣例
2、開源作品秀,教你如何DIY一款自己的聲源跟蹤小車
3、從零入門物聯網OH開源平臺,從簡單到高階項目,創客、電子愛好者都愛用!
4、低成本ESP32方案,支持OpenHarmony系統開發(附10+項目樣例Demo)
5、從0到1玩轉瑞薩RA4系列開發板,教你變著花樣玩板子
6、四核64位,超強CPU ,看RK3568“競”開發板DEMO!
8、全部開源 | 基于全志V85X的運動相機,工業網關,可穿戴式攝像頭
9、高性能雙核RISC-V,滿足大多數開發,這款國產MCU工程師都愛
-
電子技術
+關注
關注
18文章
890瀏覽量
56021 -
電子發燒友論壇
+關注
關注
4文章
197瀏覽量
1090
原文標題:【教程分享】FPGA零基礎學習:LED流水燈設計
文章出處:【微信號:gh_9b9470648b3c,微信公眾號:電子發燒友論壇】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論