FPGA入門筆記二 top_module與硬件映射關係

開始小試牛刀,開發板的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



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章