2024年6月7日 星期五

Xilinx Vivado (3).使用ILA(Integrated Logic Analyzer)分析波形

 1. 先將"FPGA board"的JTAG使用"xilinx USB Cable"與PC連接。

2. 增加設計電路檔案,在"Flow Navigator"視窗,點選"PROJECT MANAGER > Add Sources"。

3. 勾選"Add or create design sources"之後按"Next>"。

4. 點選"Create File"。

5. 在"File name:"欄位中,輸入source檔案名稱,這裡輸入"bl_led",輸入完成按"OK"。

6. 按"Finish",增加source檔案。

7. 按"OK"。

8. 按"Yes"。

9. 在"Sources"視窗中的"Hierarchy"標籤頁中,開啟"Bl_led.v"檔,撰寫設計電路。

`timescale 1ns / 1ps

module bl_led(
input sys_clk,
input rst_n,
output reg[3:0] led
);
parameter max_cnt = 32'd49999999;
reg[31:0] timer_cnt;

always@(posedge sys_clk or negedge rst_n)
begin
    if(!rst_n)
    begin
        timer_cnt <= 32'd0;
    end
    else
    begin
        if(timer_cnt < max_cnt)
            timer_cnt <= timer_cnt +32'd1;
        else
            timer_cnt <= 32'd0;
    end
end
    
always@(posedge sys_clk or negedge rst_n)
begin
    if(!rst_n)
    begin
        led <= 4'b0000;
    end
    else
    begin
        if(timer_cnt == max_cnt)
            led <= ~led;
        else
            led <= led;
    end
end

endmodule

10. 點選"IP Catalog",增加IP Symbol。

11. 在"Search:"欄位中輸入"ILA",尋找"ILA(Integrated Logic Analyzer)"並點選。

12. 在"General Options"標籤頁,"Number of Probes"欄位設定為"2",表示需要量測2組訊號。

13. 在"Probe_Ports(0..1)的標籤頁,PROBE0的Probe Width[1..4096]欄位設"32",PROBE1的Probe Width[1..4096]欄位設"4",這部分的設定是依據設計電路需要量測波形的bit數,設定完成按"OK"。

14. 按"OK"。

15. 按"Generate"。

16. 按"OK"。

17. 選擇在Sources視窗的IP Sources標籤頁,點選開啟"ila_0.veo",複製IP 連接的IO port。

18. 在"Sources"視窗中的"Hierarchy"標籤頁中,開啟"bl_led.v"檔,貼上IP 連接的IO port,並設定電路IO port的設定。

`timescale 1ns / 1ps

module bl_led(
input sys_clk,
input rst_n,
output reg[3:0] led
);
parameter max_cnt = 32'd49999999;
reg[31:0] timer_cnt;

always@(posedge sys_clk or negedge rst_n)
begin
    if(!rst_n)
    begin
        timer_cnt <= 32'd0;
    end
    else
    begin
        if(timer_cnt < max_cnt)
            timer_cnt <= timer_cnt +32'd1;
        else
            timer_cnt <= 32'd0;
    end
end
    
always@(posedge sys_clk or negedge rst_n)
begin
    if(!rst_n)
    begin
        led <= 4'b0000;
    end
    else
    begin
        if(timer_cnt == max_cnt)
            led <= ~led;
        else
            led <= led;
    end
end

ila_0 ila_0_inst (
.clk(sys_clk), // input wire clk


.probe0(timer_cnt), // input wire [31:0]  probe0  
.probe1(led) // input wire [3:0]  probe1
);

endmodule

19. 增加限制條件檔案,在"Flow Navigator"視窗,點選"PROJECT MANAGER > Add Sources"。
20. 勾選"Add or create constraints"之後按"Next>"。

21. 點選"Create File"。

22. 在"File name:"欄位中,輸入constraint檔案名稱,這裡輸入"bl_led",輸入完成按"OK"。

23. 按"Finish",增加constraint檔案。

24. 在"Sources"視窗中的"Hierarchy"標籤頁中,開啟"bl_led.xdc"檔,並設定IO port的限制條件。

############## NET - IOSTANDARD ##################
set_property CFGBVS VCCO [current_design]
set_property CONFIG_VOLTAGE 3.3 [current_design]
#############SPI Configurate Setting##################
set_property BITSTREAM.CONFIG.SPI_BUSWIDTH 4 [current_design] 
set_property CONFIG_MODE SPIx4 [current_design] 
set_property BITSTREAM.CONFIG.CONFIGRATE 50 [current_design] 
#############clock Setting#########################
create_clock -period 20 [get_ports sys_clk]
set_property IOSTANDARD LVCMOS33 [get_ports {sys_clk}]
set_property PACKAGE_PIN Y18 [get_ports {sys_clk}]
#############reset Setting##########################
set_property IOSTANDARD LVCMOS33 [get_ports {rst_n}]
set_property PACKAGE_PIN F20 [get_ports {rst_n}]
#############LED Setting###########################
set_property PACKAGE_PIN F19 [get_ports {led[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led[0]}]

set_property PACKAGE_PIN E21 [get_ports {led[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led[1]}]

set_property PACKAGE_PIN D20 [get_ports {led[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led[2]}]

set_property PACKAGE_PIN C20 [get_ports {led[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {led[3]}]

25. 產生bitstream(.bin)檔,在"Flow Navigator"視窗,點選"PROJECT MANAGER > PROGRAM AND DEBUG",按"滑鼠右鍵",點選"Bitstream Settings..."。

26. 在"Project Settings > Bitstream"視窗中,將"-bin_file"打勾,之後按"OK"。

27. 產生.bin檔,點選"Generate Bitstream"。

28. 按"Yes"。

29. 按"OK"。

30. 需要稍微等待一下,產生.bin檔。

31. 產生.bin檔程序結束,按"OK"。

32. 連線FPGA開發板,在"Flow Navigator"視窗,點選"PROJECT MANAGER > PROGRAM AND DEBUG > Open Hardware Manager > Open Target",跳出視窗後,點選"Auto Connect"。

33. 燒錄.bin檔,在"Flow Navigator"視窗,點選"PROJECT MANAGER > PROGRAM AND DEBUG > Open Hardware Manager > Program Device",跳出視窗後,點選"xc7a35t_0"(此為開發板上的FPGA型號)。

34. 按"Program",開始燒錄。

35. 按"Run trigger for this ILA core",開始讀取波形。


2024年6月6日 星期四

Xilinx Vivado (2).使用Clock IP並模擬波形

 1. 點選"IP Catalog",增加IP Symbol。


2. 在"Search:"欄位中輸入"clock",尋找"Clocking Wizard"並點選。


3. 點選後可以開啟"Clocking Wizard "設定視窗。


4. 在"Input Frequenc(MHz)"欄位中輸入"50",此參數是因為開發板使用50MHz的震盪器。


5. 點選"Output Clocks"標籤頁,在"Output Clock"勾選需要輸出多少組頻率,我這裡勾選4組,之後在"Requested"欄位中,輸入所需要的頻率值,我這裡由上至下,輸入"200"、"100"、"50"、"25"。


6. 一般會在設計電路時,Reset會習慣使用低電位時動作,所以我這裡在"Reset Type"選擇"Active Low",設定完成按"OK"。


7. 按"OK"。


8. 按"Generate"。


9. 按"OK"。


10. 選擇在Sources視窗的IP Sources標籤頁,點選開啟"Clk_Wiz_0.veo",複製IP 連接的IO port。


  clk_wiz_0 instance_name

   (

    // Clock out ports

    .clk_out1(clk_out1),     // output clk_out1

    .clk_out2(clk_out2),     // output clk_out2

    .clk_out3(clk_out3),     // output clk_out3

    .clk_out4(clk_out4),     // output clk_out4

    // Status and control signals

    .resetn(resetn), // input resetn

    .locked(locked),       // output locked

   // Clock in ports

    .clk_in1(clk_in1));      // input clk_in1


11. 增加設計電路檔案,在"Flow Navigator"視窗,點選"PROJECT MANAGER > Add Sources"。


 12. 勾選"Add or create design sources"之後按"Next>"。



13. 點選"Create File"。


14. 在"File name:"欄位中,輸入source檔案名稱,這裡輸入"Clock",輸入完成按"OK"。


15. 按"Finish",增加source檔案。


16. 按"OK"。


17. 按"Yes"。


18. 在"Sources"視窗中的"Hierarchy"標籤頁中,開啟"Clock.v"檔,貼上IP 連接的IO port,並設定電路IO port的設定。

`timescale 1ns / 1ps

module Clock(
input clk_in1,
input resetn,

output clk_out1,
output clk_out2,
output clk_out3,
output clk_out4
    );
    
clk_wiz_0 clk_wiz_0
(
    // Clock out ports
    .clk_out1(clk_out1),     // output clk_out1
    .clk_out2(clk_out2),     // output clk_out2
    .clk_out3(clk_out3),     // output clk_out3
    .clk_out4(clk_out4),     // output clk_out4
    // Status and control signals
    .resetn(resetn), // input resetn
    .locked(locked),       // output locked
   // Clock in ports
    .clk_in1(clk_in1));      // input clk_in1
endmodule

19. 增加模擬電路檔案,在"Flow Navigator"視窗,點選"PROJECT MANAGER > Add Sources"。
20. 勾選"Add or create simulation sources"之後按"Next>"。


21. 點選"Create File"。


22. 在"File name:"欄位中,輸入source檔案名稱,這裡輸入"testbench",輸入完成按"OK"。

23. 按"Finish",增加simulation source檔案。

24. 按"OK"。

25. 按"Yes"。

26. 在"Sources"視窗中的"Hierarchy"標籤頁中,開啟"testbench.v"檔,設計模擬電路。
`timescale 1ns / 1ps
`define FLASH 1'b1
module testbench();
reg clk_in1;
reg resetn;

wire clk_out1;
wire clk_out2;
wire clk_out3;
wire clk_out4;

Clock uClouk(
.clk_in1    (clk_in1),
.resetn      (resetn),

.clk_out1   (clk_out1),
.clk_out2   (clk_out2),
.clk_out3   (clk_out3),
.clk_out4   (clk_out4)
);

initial
begin
clk_in1 = `FLASH;
forever #5 clk_in1 =~clk_in1;
end

initial
begin
    resetn = 0;
    #100;
resetn = 1;
#8000000 $finish;
end
endmodule

27. 開始模擬,在"Flow Navigator"視窗,點選"SIMULATION > Run Simulation",跳出視窗後點選"Run Behavioral Simulation"。

28. 顯示模擬視窗,如下圖所示,可以看到OUTPUT輸出四種不同頻率。