本文通過一個簡單的例子,介紹Vivado 下的仿真過程。主要參考了miz702的教程,同時也參考了Xilinx的ug937,? xapp199.。
我的軟件平臺是Vivado 2015.4, 硬件平臺是黑金的AC7010, Zynq 7000, 其實與平臺關系不大。
本文分為四部分:工程的建立,測試代碼,仿真圖形輸出,更復雜點的例子。
工程和源碼下載鏈接: 鏈接:http://pan.baidu.com/s/1gflHSdH 密碼:fpi5
1:工程的建立:
打開Vivado 軟件,并點擊新建工程, New Project,并點擊Next
出現如圖界面, 輸入工程名和路徑,我這里是qim
點擊Next ,出現選擇工程類型的界面, 選擇RTL Project, 并且選擇 Do not specify sources at this time.
選擇硬件平臺, 我是這么選擇的:
點擊確定,出現Summary 窗口,點擊Finish, 工程就建立完成了。
2:代碼的導入或輸入:
本例子有2個源文件:待測試的verilog 文件, 測試文件。
右鍵點擊Design Source ,選擇Add Source
這里添加的設計源文件,并點擊Next
你是選擇添加還是新建,你有源代碼文件,你可以選擇Add? Files, 但我這是新建
新建文件名和路徑,添加也一樣。你要選擇verilog 文件類型
出現了這樣一個對話框,目錄和文件名。
出現這樣一個對話框,ok 就可以,
再這樣,Yes, 添加估計不是這樣的,
好了,文件出現在這里了
基本同樣的操作,在simulate source 這里添加測試文件testbench.v 文件,不再復雜圖示了。
好的,添加或新建2個文件后,這樣的效果。
如果你是新建,你就需要輸入源代碼,或者copy 這里,去本文開頭介紹的地方下載源文件好了。我這源代碼是從xapp.pdf 里copy 過來的。
測試代碼也是輸入,或copy,最好是下載
shift_reg.v 文件的內容:
`timescale 1ns / 1ps
module shift_reg (clock, reset, load, sel, data, shiftreg);
input clock;
input reset;
input load;
input [1:0] sel;
input [4:0] data;
output [4:0] shiftreg;
reg [4:0] shiftreg;
always @ (posedge clock)
begin
?if (reset)
?? shiftreg = 0;
?else if (load)
?? shiftreg = data;
?else
? case (sel)
?? 2'b00 : shiftreg = shiftreg;
?? 2'b01 : shiftreg = shiftreg << 1;
?? 2'b10 : shiftreg = shiftreg >> 1;
?? default : shiftreg = shiftreg;
? endcase
end
endmodule
這是一個移位寄存器的例子,load=1 的時候 shiftreg=data, sel =0, 不動作, =1 左移, =2 ’b10 右移
testbench.v 代碼如下:
`timescale 1ns / 1ps
?module testbench; // declare testbench name
? reg clock;
? reg load;
? reg reset;? // declaration of signals
? wire [4:0] shiftreg;
? reg [4:0] data;
? reg [1:0] sel;
?? // instantiation of the shift_reg design below
? shift_reg dut(.clock (clock),
.load (load),
.reset (reset),
.shiftreg (shiftreg),
?????????????? .data (data),
.sel (sel));
?? //this process block sets up the free running clock
? initial begin
? clock = 0;
? forever #50 clock = ~clock;
? end
? initial begin// this process block specifies the stimulus.
??? reset = 1;
??? data = 5'b00000;
??? load = 0;
??? sel = 2'b00;
?? #200
??? reset = 0;
??? load = 1;
?? #200
??? data = 5'b00001;
?? #100
??? sel = 2'b01;
??? load = 0;
?? #200
??? sel = 2'b10;
?? #1000 $stop;
? end
?initial begin// this process block pipes the ASCII results to the
//terminal or text editor
? $timeformat(-9,1,"ns",12);
? $display("?? Time Clk Rst Ld SftRg Data Sel");
? $monitor("%t %b %b %b %b %b %b", $realtime,
?????? clock, reset, load, shiftreg, data, sel);
?end
?endmodule
3: 仿真過程:
仿真設置:點擊主菜單 Flow->Simulation Settings
或者界面左邊Project Manager 下的Simulation Settings
出現如下設置界面,并設置好,注意箭頭地方是否一致,或者設置一致。
設置好之后, Flow->Run Simulation 或者左邊直接點擊,選擇 Run Behavioral Simulation, 就是最上的那個選擇。
這個時候出現如下界面:
能出現如下界面基本就是成功了,有時候你的代碼有錯誤,就會報錯。我開始的時候就是這樣,也不知道怎么檢查錯誤。后來發現如果這樣,可以點擊綜合,Run Synthesis, 可以指示錯誤代碼信息,方便排除, 如果你直接用下載的代碼,應該不會錯誤。
怎么說成功了呢?圖都沒顯示,不急,單點選擇Untitled ,就是上圖紅箭頭的地方,就會出現圖形了。
但是上圖還是沒有波形,點擊下圖Zoom Fit, 出現密集的波形,你再點其上面的放大,縮小,就能看到波形了。
波形還不是很好看,可以點右上角的全圖顯示,shiftreg也可以點開, 這樣你可以看到移位效果了。
好了,通過這個例子有了仿真的感覺了吧。
4:更復雜一點的例子
上面例子很簡單,操作也沒什么復雜,很多功能還不能展示。下面我們來個復雜一點的。 分別添加下載的文件, Divider_Multiple.v? Divider_Multiple_TB.v , 添加后效果如下:
我們需要仿真設置, Simulation Settings, 在對話框里,有個選擇Simulation top Module name 的地方,點擊就出現以下選擇對話框:
這次我們選擇Divider_Multiple_TB
這是一個多次分頻的程序,2,3,4,8分頻,還有1hz 信號,波形比較多樣一點。
我們要顯示內部數據,點擊uut, 紅箭位置, 這是Objects 窗口多了很多變量,就是紅框里的
選擇下面3個變量div_cnt1, pos_cnt, neg_cnt。 怎么選多個呢? 用CTRL 還有shift, 選好后,鼠標右鍵Add to Wave Window, 這樣就添加到波形圖了,但還是沒有波形顯示。
點擊 Run ->Run For , 或者工具條Run For , 你就看到有波形了
如果要復位再重放, 你就需要保存設置參數。波形圖左邊快捷工具條里選擇 Save Waveform Configuration, 或者CTRL + S 或者File -> Save Waveform Configuration
就出現保存配置對話框。 下次就使用你剛才的設置。
還可以添加分界線,右鍵顯示點擊 New Divider,開始分界線在下面,你可以拖到任何地方,看起來比較方便一點,特別是信號多一點的時候。
還有分組功能, 控制進制顯示, 模擬顯示功能,顏色控制,需要慢慢體驗或者學習。這些在ug937 里有介紹。
這里也就是帶你入門vivado 仿真。
評論
查看更多