FPGA入門筆記二 top_module與硬體對映關係
阿新 • • 發佈:2019-02-03
開始小試牛刀,開發板的LED,如有錯誤請不吝指正。
頂層設計檔案,子檔案都有module模組,但是隻有頂層的 top_module埠列表需要與ucf檔案中晶片引腳對映起來。
按照上篇設計RTL步驟來設計本功能:
功能定義與模組劃分:上電後4個LED都滅,1秒後,從LED1到LED4輪流亮,每次亮1秒,然後全部亮1秒。迴圈如此。功能簡單,只需一個模組。
定義所有模組的介面:時鐘輸入給一個計數器timer,高電平輸出led。
設計時鐘域:只需一個時鐘。
考慮設計的關鍵路徑:無
頂層設計:時鐘控制時序(迴圈亮滅),邏輯控制功能
FSM 設計:無。Finite State Machine有限狀態機,狀態機由狀態暫存器和組合邏輯電路構成,能夠根據控制訊號按照預先設定的狀態進行狀態轉移,是協調相關訊號動作,完成特定操作的控制中心。狀態機分為摩爾(Moore)型狀態機和米莉(Mealy)型狀態機。目前理解還不夠。
時序邏輯設計:任意時刻的輸出不僅取決於當時的輸入訊號,而且還取決於電路原來的狀態。畫個時序的草圖,6s一個迴圈。
組合邏輯設計:任意時刻的輸出僅僅取決於該時刻的輸入。根據計數器使用if...else...,判斷是哪個燈即可
雖然分析了一遍,還是自己寫不出來,根據原始碼修改了一遍,有疑問的地方,再學習一段時間後再理解吧。
ucf檔案:
## NET clk LOC = T8 | TNM_NET = sys_clk_pin | IOSTANDARD = "LVCMOS33"; TIMESPEC TS_sys_clk_pin = PERIOD sys_clk_pin 50000 kHz; ## ########LED Pin define##################### NET led<0> LOC = P4 | IOSTANDARD = "LVCMOS33"; ## LED1 NET led<1> LOC = N5 | IOSTANDARD = "LVCMOS33"; ## LED2 NET led<2> LOC = P5 | IOSTANDARD = "LVCMOS33"; ## LED3 NET led<3> LOC = M6 | IOSTANDARD = "LVCMOS33"; ## LED4
.v檔案
`timescale 1ns / 1ps
module led_test (
clk, // 開發板上輸入時鐘: 50Mhz
led // 輸出LED燈,用於控制開發板上四個LED(LED1~LED4)
);
input clk;
output [3:0] led;
//暫存器定義
reg [31:0] timer; //?為什麼選擇這種變數?
reg [3:0] led; //?為什麼選擇這種變數,wire?
//===========================================================================
always @(posedge clk) //檢測時鐘的上升沿
begin
if (timer == 32'd299_999_999) //開發板使用的晶振為50MHz,6秒計數(50M*6-1=249_999_999)
timer <= 0; //計數器計到6秒,計數器清零
else
timer <= timer + 1'b1; //計數器加1
end
//=========================== LED燈控制=====================================
always @(posedge clk) //檢測時鐘的上升沿
begin
if (timer == 32'd0)
led <= 4'b0000; //LED燈輸出全為滅
else if (timer == 32'd49_999_999) //計數器計到1秒,
led <= 4'b0001; //LED1亮,其他滅
else if (timer == 32'd99_999_999) //計數器計到2秒,
led <= 4'b0010; //LED2
else if (timer == 32'd149_999_999) //計數器計到3秒,
led <= 4'b0100; //LED3
else if (timer == 32'd199_999_999) //計數器計到4秒,
led <= 4'b1000; //LED4
else if (timer == 32'd249_999_999) //
led <= 4'b1111;
end
endmodule