FPGA流水燈
參考博客:(一)FPGA流水燈的實作
第一次在CSDN上寫博客,記錄一下自己學習FPGA的歷程吧,也是對CSDN這個平臺的回饋,過去大半年在這上面學習了不少知識,現在也希望能給別人一些幫助,下面言歸正傳:
“流水燈”應該是每一個開發板的初學者都要做的一步吧,這兩天對FPGA的板子有了一個初步的認識,今天就花了半天(原諒我學得有點慢),寫了一個八位的LED流水燈,
用的是Quartus 13.0,代碼如下:
module self_train1(clk,rst_n,led);//8位LED流水燈
input clk; //系統時鐘,50MHz
input rst_n; //全域復位,低電平有效
output reg[7:0] led; //led輸出,高電平燈亮
//定義時間計數器
reg [31:0] timer;
//計數行程
always@(posedge clk or negedge rst_n)//只要括號中的任意信號發生變化,就執行always@里面的內容
begin
if(rst_n==1'b0)//'b'表示二進制
timer<=32'd0;//'d'表示十進制;如果復位鍵按下,時間計數歸零
else if(timer==32'd199_999_999)//'_'占位符,沒有實際意義
timer<=32'd0;//如果時間計數到4s,時間計數歸零
else
timer<=timer+32'd1;//正常情況下,每來一個時鐘脈沖,時間計數加1
end
//led控制行程
always@(posedge clk or negedge rst_n)
begin
if(rst_n==1'b0)
led<=8'b0000_0000;//如果復位鍵按下,所有的燈都為'0',熄滅
else if(timer==32'd24_999_999)
led<=8'b0000_0001;//當時間計到0.5s時,第一個LED燈亮
else if(timer==32'd49_999_999)
led<=8'b0000_0010;//當時間計到1s時,第二個LED燈亮
else if(timer==32'd74_999_999)
led<=8'b0000_0100;
else if(timer==32'd99_999_999)
led<=8'b0000_1000;
else if(timer==32'd124_999_999)
led<=8'b0001_0000;
else if(timer==32'd149_999_999)
led<=8'b0010_0000;
else if(timer==32'd174_999_999)
led<=8'b0100_0000;
else if(timer==32'd199_999_999)
led<=8'b1000_0000;
end
endmodule
代碼的原理還是很簡單的,具體可以參考我開頭的參考博客,我只是比他多了4個LED燈,位數相應的增加了,
代碼撰寫完了之后,我們讓軟體給我們分析一遍,看有沒有錯誤,點擊軟體最上方Processing / Start / Start Analysis & Synthesis,或者直接點擊下圖紅色方框中的鍵:

分析成功的話會顯示如下圖:
·
·
然后,我們進行功能仿真,也叫RTL行為級仿真或者前仿真,
首先編輯test bench檔案,代碼如下:
`timescale 1ns/1ns//前面的1ns表示時延單位,后面的1ns表示時延精度
module self_train1_tb;
reg clk;
reg rst_n;
wire [7:0]led;
self_train1 u1(
.clk(clk),
.rst_n(rst_n),
.led(led)
);
initial clk=1;//任意賦予clk一個初值,也可賦值0
always #10 clk = ~clk;//讓clk的值每10ns反向變化一次,形成50MHz的脈沖
initial begin
rst_n=1'b0;
#100;//'#'表示延時
rst_n=1'b1;
#1000000000;//我在這里只仿真了初始的1s,因為電腦太老了,運行速度太慢
$stop;
end
endmodule
我稍后會再寫一篇功能仿真的軟體操作步驟,畢竟Quartus是英文的,對自學的同學來說不太友好,并且這部分操作確實有點麻煩,將心比心,我盡量把我覺得在初學階段可能碰到的問題寫清楚,多幫助一些人,
下面,我們運行RTL Simulation,結果如下:

我們可以看到,在500ms的時候,第一個LED燈的狀態由0變為1,第一個燈亮,1000ms的時候,第一個燈由1變為0,第一個燈滅,同時,第二個LED燈由0變為1,第二個燈亮,以此類推,仿真結果和我們想要的結果一樣,因為電腦太老了,運行速度慢,我就只仿真了初始的1s,
·
還有一個時序仿真我就不做了,它在功能仿真的基礎上加入了時延,更接近板子運行時候的真實情況,
下面進行全編譯,點擊Start Complation,
PS:
quartus軟體可以根據我們撰寫的程式生成下面類似數電里的電路圖:

大家可以在左側找到,雙擊即可:

然后,我們進行燒寫前的最后一步,分配IO:
點擊Assignments / Pin Planner

根據查找板子的使用說明書,找到合適的引腳,相對應的輸入紅色方框中,可以直接在其中輸入“y2”、“g21”等引腳號,不用區分大小寫,然后按回車鍵;也可以直接復制粘貼引腳表格中的引腳號,這里就不詳細說了,
設定好引腳后,不需要保存,直接關閉引腳設定視窗,
最后就是將我們的程式燒寫到板子里去,
將開發板與電腦連接(如果在電腦上讀不出開發板,可能是需要手動安裝板子的驅動,我當時也碰到了這個問題,可以百度解決),點擊Programmer,在跳出的視窗中點擊Add File…,將output_files檔案夾里面的.sof檔案打開到剛剛跳出的視窗,最后點擊Start,就將程式燒入FPGA開發板中了,
如果到這里一切順利,那么恭喜你,完成了開發板的第一個基礎程式開發,完結撒花!!!
ps:文中如有錯誤或不足,歡迎各位大佬予以批評指正,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/226297.html
標籤:其他
上一篇:stm32f103c8t6與stm32f103zet6 基于SX1276串口通信-----發送端(二)
下一篇:Ubuntu安裝ROS系統
