1. 程式人生 > >當我們進行綜合和I/O佈局後會發生什麼QwQ

當我們進行綜合和I/O佈局後會發生什麼QwQ

基於的平臺是Vivado 2018.2

本文主要以一個簡單的半加器加器(組合邏輯為例)學習vivado的綜合,I/O配置的一些內容。

本人小白,記一些自己的理解。

任務:

  1. 分析Log檔案。
  2. 佈局I/O管腳
  3. 分析兩個檢視
  4. 分析約束.xdc檔案

 

首先介紹半加器:

連結地址:http://www.elecfans.com/dianzichangshi/20170816539743.html

 

我們盡關注半加器的邏輯結構:

假設輸入端子為A,B

輸出端子為S

進位端子為C

則我們有 S = A xor B;C = A & B;

 

那麼我們去寫我們的verilog程式碼(vivado的使用會再今後進行簡單說明。我們假設已經會了怎麼新建工程。)

 

半加器程式碼如下:

module half_add(

    input A,

    input B,

    output S,

    output C

    );

   

    assign S = A ^ B;

    assign C = A & B;

   

   

endmodule

 

我們按照這張真值表編寫testbench檔案:

`timescale 1ns / 1ps

 

module half_sim();

reg data_1;

reg data_2;

wire S;

wire C;

 

half_add test(

    .A(data_1),

    .B(data_2),

    .S(S),

    .C(C)

);

 

initial begin

    #200;

    data_1 = 1'b0;

    data_2 = 1'b0;

    #200;

    data_1 = 1'b0;

    data_2 = 1'b1;

    #200;

    data_1 = 1'b1;

    data_2 = 1'b0;

    #200;

    data_1 = 1'b1;

    data_2 = 1'b1;

    #200;

    $finish;

end

 

endmodule

 

執行模擬結果如下:

顯然這和我們的真值表是對應的。

 

 

 

以上部分屬於基本操作,下面我們正式進入我們的任務:

  1. 分析綜合後的Log檔案:
    1. 首先我們run synthesis
    2. 綜合結束後我們取消,先不進行下一步實現。
    3. Xilinx官方推薦我們在綜合後,實現前進行IO佈置和時鐘約束。
    4. 下面我們來看生成的Log檔案都寫了些什麼。
    5. 我們在① 的位置看到了我們的license檔案的使用,當我們需要實現綜合操作時,首先軟體會檢查我們是否獲取了license。
      1. 從②我們可以看到,此時我們還沒有新增約束檔案(先不要管約束檔案是幹嘛的,這個約束檔案就是.xdc檔案)
      1. 從3可以看到,我們的是兩輸入,一個異或邏輯。
      2. 從3.1看到我們有(的DSP和BRAM資源的個數),這個並不是我們使用的個數。
        1. Block RAM是PL部分的儲存器陣列,為了與DRAM(分散式RAM)區分開,所以叫塊RAM。ZYNQ的每一個BRAM 36KB,7020的BRAM有140個(4.9M),7030有265個(9.3M),7045有545個(19.2M)。每一個BRAM都有兩個共享資料的獨立埠,當然是可以配置的,可用於片內資料快取、FIFO緩衝。
        2. 原文:https://blog.csdn.net/u014485485/article/details/78882027
        3. 常見資源介紹
        4. :http://www.elecfans.com/dianzichangshi/20170517517040.html
      1. 從④我們可以看到,該模組使用了2個LUT,2個輸入緩衝區(Input-Buff)A一個,B一個,和兩個輸出緩衝區(Output-Buff)S一個,C一個。
      1. 從5我們看到未使用black box。
      2. 通俗點講LUT就是像函式一樣,對應關係就是邏輯表示式,給你輸入,你可以查詢到一個輸出。舉個例子裡說:如何用4輸入LUT實現表示式X。就是推測EEPROM中的值,你可以畫出X的對應真值表,應該不難。如圖所示:
      3. https://gss0.baidu.com/-fo3dSag_xI4khGko9WTAnF6hhy/zhidao/wh%3D600%2C800/sign=5fc2d849d72a60595245e91c180418a3/8718367adab44aed20be8a64b31c8701a08bfbb9.jpg
      4. 如果A=1,B=1,C=0,D=0那麼X=1,以此類推,A,B,C,D控制門控開關,讓其選通相應的函式值到X端
      5. https://www.cnblogs.com/Dinging006/p/9512506.html

以上就完成了任務一的分析。

  1. 我們開始佈局I/O
    1. 對I/O進行簡單說明
      1. MRCC/SRCC:時鐘
      2. User I/O:同樣IO
      3. 被佔用的 User I/O
      4. 電源(紅色):VCCINT VCCBRAM VCCAUX VCCAUX_IO
      5. Config(與做配置相關的管腳)
    2. 我們進入約束介面(點選紅色線)
    3. 會提示我們沒有約束檔案,是否要建立約束檔案,我們取消。
    4. 進行I/O配置
      1. 通過①進入Package檢視
      2. ②進行選中我們要進行佈置的管腳
      3. 3是管腳對應的電平狀態
      4. 常見電平標準:https://wenku.baidu.com/view/10365452f01dc281e53af0f6.html
    5. 我們放置在了這幾個位置
    6. 放大後可以看到
    7. 我們以B為例,進行具體分析
      1. 接著在DEVICE檢視下我們可以看到我們剛才設定的管腳的位置。
      2. 紅色圈住的地方就是我們的I/O管腳
        1. 例如我們的S管腳。

下面我們implement 並觀察生成的.xdc檔案

 

set_property :設定屬性

PROHIBIT :禁止使用(true表示確認禁止使用)

[get_sites B13]:尋找到B13檔案。

 

set_property PROHIBIT true [get_sites B13]

set_property PROHIBIT true [get_sites B3]

set_property PROHIBIT true [get_sites D10]

set_property PROHIBIT true [get_sites D12]

set_property PROHIBIT true [get_sites D2]

set_property PROHIBIT true [get_sites E4]

set_property PROHIBIT true [get_sites F1]

set_property PROHIBIT true [get_sites F11]

set_property PROHIBIT true [get_sites G11]

set_property PROHIBIT true [get_sites G8]

set_property PROHIBIT true [get_sites H7]

set_property PROHIBIT true [get_sites J12]

set_property PROHIBIT true [get_sites J2]

set_property PROHIBIT true [get_sites K4]

set_property PROHIBIT true [get_sites L1]

set_property PROHIBIT true [get_sites L5]

set_property PROHIBIT true [get_sites M13]

set_property PROHIBIT true [get_sites M3]

set_property PROHIBIT true [get_sites N10]

set_property PROHIBIT true [get_sites P5]

set_property IOSTANDARD LVCMOS18 [get_ports C]

set_property IOSTANDARD LVCMOS18 [get_ports B]

set_property IOSTANDARD LVCMOS18 [get_ports S]

set_property PACKAGE_PIN A2 [get_ports A]

set_property PACKAGE_PIN A3 [get_ports B]

set_property PACKAGE_PIN A4 [get_ports C]

set_property PACKAGE_PIN A5 [get_ports S]

set_property IOSTANDARD LVCMOS18 [get_ports A]

 

我們進行implement操作之後就可以看見電路中的實現

 

左圖我們看到兩個LUT2實際上是同一個。

 

這個坑的內容以後會慢慢完善。