當我們進行綜合和I/O佈局後會發生什麼QwQ
基於的平臺是Vivado 2018.2
本文主要以一個簡單的半加器加器(組合邏輯為例)學習vivado的綜合,I/O配置的一些內容。
本人小白,記一些自己的理解。
任務:
- 分析Log檔案。
- 佈局I/O管腳
- 分析兩個檢視
- 分析約束.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
執行模擬結果如下:
顯然這和我們的真值表是對應的。
以上部分屬於基本操作,下面我們正式進入我們的任務:
- 分析綜合後的Log檔案:
- 首先我們run synthesis
- 綜合結束後我們取消,先不進行下一步實現。
- Xilinx官方推薦我們在綜合後,實現前進行IO佈置和時鐘約束。
- 下面我們來看生成的Log檔案都寫了些什麼。
- 我們在① 的位置看到了我們的license檔案的使用,當我們需要實現綜合操作時,首先軟體會檢查我們是否獲取了license。
-
- 從②我們可以看到,此時我們還沒有新增約束檔案(先不要管約束檔案是幹嘛的,這個約束檔案就是.xdc檔案)
-
-
- 從3可以看到,我們的是兩輸入,一個異或邏輯。
- 從3.1看到我們有(的DSP和BRAM資源的個數),這個並不是我們使用的個數。
- Block RAM是PL部分的儲存器陣列,為了與DRAM(分散式RAM)區分開,所以叫塊RAM。ZYNQ的每一個BRAM 36KB,7020的BRAM有140個(4.9M),7030有265個(9.3M),7045有545個(19.2M)。每一個BRAM都有兩個共享資料的獨立埠,當然是可以配置的,可用於片內資料快取、FIFO緩衝。
- 原文:https://blog.csdn.net/u014485485/article/details/78882027
- 常見資源介紹
- :http://www.elecfans.com/dianzichangshi/20170517517040.html
-
- 從④我們可以看到,該模組使用了2個LUT,2個輸入緩衝區(Input-Buff)A一個,B一個,和兩個輸出緩衝區(Output-Buff)S一個,C一個。
-
-
-
- 從5我們看到未使用black box。
- 通俗點講LUT就是像函式一樣,對應關係就是邏輯表示式,給你輸入,你可以查詢到一個輸出。舉個例子裡說:如何用4輸入LUT實現表示式X。就是推測EEPROM中的值,你可以畫出X的對應真值表,應該不難。如圖所示:
- 如果A=1,B=1,C=0,D=0那麼X=1,以此類推,A,B,C,D控制門控開關,讓其選通相應的函式值到X端。
- https://www.cnblogs.com/Dinging006/p/9512506.html
-
以上就完成了任務一的分析。
- 我們開始佈局I/O
- 對I/O進行簡單說明
-
- MRCC/SRCC:時鐘
- User I/O:同樣IO
- 被佔用的 User I/O
- 電源(紅色):VCCINT VCCBRAM VCCAUX VCCAUX_IO
- Config(與做配置相關的管腳)
- 我們進入約束介面(點選紅色線)
- 會提示我們沒有約束檔案,是否要建立約束檔案,我們取消。
- 進行I/O配置
-
- 通過①進入Package檢視
- ②進行選中我們要進行佈置的管腳
- 3是管腳對應的電平狀態
- 常見電平標準:https://wenku.baidu.com/view/10365452f01dc281e53af0f6.html
- 我們放置在了這幾個位置
- 放大後可以看到
- 我們以B為例,進行具體分析
-
-
- 接著在DEVICE檢視下我們可以看到我們剛才設定的管腳的位置。
- 紅色圈住的地方就是我們的I/O管腳
- 例如我們的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實際上是同一個。
這個坑的內容以後會慢慢完善。