1. 程式人生 > >Vivado+FPGA學習之第一次上電

Vivado+FPGA學習之第一次上電

背景:我本人沒有怎麼接觸過FPGA,但是這次一上來就被要求做FPGA的工作,實在是讓我感到無從下手,前前後後忙活了好幾天才第一次上電成功,所以把整個經過整理了一下,以便方面後來人。

開發平臺:Vivado 2015.2
FPGA :Xilinx Virtex-7系列晶片

一上來就碰到這種高階FPGA晶片,沒有什麼資料,至於下面的FPGA的板子也是自制的(上面沒有按鈕,沒有數碼管,只有2個led燈),所以感到無從下手。那麼針對這種情況怎麼辦呢?下面將全面介紹一下。

//************************************************************//
1.時鐘:

時鐘是驅動FPGA工作的關鍵,首先我們來看怎麼引入時鐘。
這裡寫圖片描述
從圖中可以看出,使用了ICS8543晶片,檢視該晶片的datasheet,可以知道該晶片的輸出為4對差分口,IO標準為LVDS,並且通過檢視原理圖可以知道Q3和Q3*是作為FPGA工作的時鐘,此時記下在FPGA中的引腳。
//************************************************************//
2.建立工程:這一步網上有很多教程,我在這裡就略過了
//************************************************************//
3.呼叫Clocking wizard:
為了得到穩定的適合XilinxFPGA的時鐘,需要使用Xilinx提供的一個IP核

這裡寫圖片描述
選擇IP Catalog
這裡寫圖片描述
雙擊Clocking Wizard
這裡寫圖片描述
設定外部時鐘的輸入頻率,我這裡是200M的時鐘,由於時鐘使用的是差分傳輸,所以我在這裡選擇了Differential clock capable pin
這裡寫圖片描述
這裡是填寫輸出時鐘,根據需要選擇即可
這裡寫圖片描述
這裡是對例項化的IP core的輸出埠的重新命名,方便自己記憶
//************************************************************//
4.使用IP Core:使用Vivado提供的例化模版在v檔案中例項化

這裡寫圖片描述
這裡寫圖片描述
複製紅框中的內容,貼上到自己的工程檔案中
//************************************************************//
5.編寫程式碼:
在程式碼很簡單,就是利用輸出的25M時鐘,做了一個分頻,點亮一盞LED燈,由於我使用的平臺沒有外部按鍵,所以又呼叫一個VIO的IP core來做復位控制,關於VIO這個IP Core我會在以後的文章中提到。

module top(
    input clk_in1_p,
    input clk_in1_n,    
    output reg flag,
    output led
    );
    wire clk_25M,clk_10M;
    wire locked,rst_n;
    reg [31:0] cnt_r;    

  clk_wiz_0 instance_name
     (
     // Clock in ports
      .clk_in1_p(clk_in1_p),    // input clk_in1_p
      .clk_in1_n(clk_in1_n),    // input clk_in1_n
      // Clock out ports
      .clk_25M(clk_25M),     // output clk_25M
      .clk_10M(clk_10M),     // output clk_10M
      // Status and control signals
      .locked(locked));      // output locked 
    always @ (posedge clk_10M, negedge rst_n) begin
        if(rst_n == 0)begin
            cnt_r <= 0;
        end
        else begin
            if (cnt_r == 32'b1111_1111_1111_1111_1111_1111_1111_1111) begin
                cnt_r <= 0;
            end
            else cnt_r <= cnt_r +1;
        end
      end

      always @ (posedge clk_10M)begin
        if(cnt_r < 32'b1000_0000_0000_0000_0000_0000_0000_0000) flag <= 1;
        else flag <= 0;
      end

    vio_0 your_instance_name (
            .clk(clk_10M),                // input wire clk
            .probe_in0(cnt_r),    // input wire [31 : 0] probe_in0
            .probe_out0(rst_n),  // output wire [0 : 0] probe_out0
            .probe_out1(led)
          );
endmodule

//************************************************************//
6.配置管腳:程式碼編寫好之後,為了讓FPGA能夠工作,需要將module的輸出輸入管腳配置到實際的地方才能正常工作
這裡寫圖片描述
開啟Schematic
這裡寫圖片描述
點選IO Ports
這裡寫圖片描述
這裡就是配置管腳的地方,可以看到我將clk_in1_p配置為了C25(由於是差分管腳的關係,Vivado能夠自動識別,自動的把clk_in1_n配置為了C26),根據之前ICS8543的datasheet,IO std應該設定為LVDS。flag是我用來控制led燈的管腳,分配到了a16(不同板子位置不一樣,這個需要檢視原理圖才能知道),至於還有一個名為“led”的引腳,這個大家可以暫時忽略,這個引腳是直接被VIO控制的,在以後會講到。

7.生成bit檔案:這就是最後一步了,雖然過程看起來簡單,但是要成功的來到這一步也是很困難的,如果一切順利的話,這裡就能夠生成bit檔案了(因為沒有配置vio核,所以如果直接用我的程式碼的話,是會報錯的,需要刪除vio,並且對相應的輸入輸出進行修改)

這裡吐槽一下Vivado,我用的電腦是I7-4790+16G記憶體+SSD,從頭跑一次也要快10分鐘的時間,簡直太慢了。