基于ZYNQ-7000开发板的调试系列(1)

1. 基于PL调试流水灯

最近在调试ZYNQ-7000的开发板,需要学习的部分如下:

  1. GPIO口控制 PL PS
  2. 串口通讯 Uart
  3. 中断单计时器中断 TTC计时器中断 GPIO中断
  4. SPI通讯
  5. PS、PL共享数据
  6. 使用1000M以太网

最近学的比较杂,好多细节部分的内容很容易忘记,所以需要记录一下具体的操作流程与一些细节的部分。初接触这一部分,估计会有很多的错误,如果有大佬有兴趣看的话,欢迎指摘。
该部分即为GPIO口的控制。GPIO口的控制实际上分为两个部分,分为:
(1)PL控制GPIO
(2)PS控制GPIO
该部分最后会设计一个流水灯程序。

基于PL控制的流水灯设计

该部分控制4个LED灯组成流水灯程序。其中4个LED等对应的引脚分别为A5、A7、A6、B8,其一端连在3.3V上,故而当GPIO输出高电平时,LED灭,当GPIO输出低电平时,LED亮。如果需要使用外部时钟,则外部时钟的引脚为Y14,其频率为50MHz。

1. 编写程序(基于Verilog)

led.v

`timescale 1ns / 1ps
module led(
    input clk,
    output[3:0] led
);
    parameter cnt_flag = 32'd49_999_999;
    reg[32:0] time_cntd;
    reg[3:0] reg_led;
    reg[1:0] s, ns;
    assign led = reg_led;
    initial 
        time_cntd = 32'h0;
    always@(posedge clk) begin
        if(time_cntd < cnt_flag) 
            time_cntd <= time_cntd + 32'h1;
        else begin
            time_cntd <= 32'h0;
            s <= ns;
        end
    end
    always@(*) begin
        case(s)
            2'h0: reg_led <= 4'hE;
            2'h1: reg_led <= 4'hD;
            2'h2: reg_led <= 4'hB;
            2'h3: reg_led <= 4'h7;
        default: reg_led <= 4'hF;
        endcase
    end
    always@(*) begin
        case(s) 
            2'h0: ns <= 2'h1;
            2'h1: ns <= 2'h2;
            2'h2: ns <= 2'h3;
            2'h3: ns <= 2'h0;
        endcase
    end
    
endmodule

2. 编写管脚约束文件

led.xdc

set_property IOSTANDARD LVCMOS33 [get_ports {led[0]}] 
set_property IOSTANDARD LVCMOS33 [get_ports {led[1]}] 
set_property IOSTANDARD LVCMOS33 [get_ports {led[2]}] 
set_property IOSTANDARD LVCMOS33 [get_ports {led[3]}] 
set_property IOSTANDARD LVCMOS33 [get_ports clk] 

set_property PACKAGE_PIN A5 [get_ports {led[0]}] 
set_property PACKAGE_PIN A7 [get_ports {led[1]}] 
set_property PACKAGE_PIN A6 [get_ports {led[2]}] 
set_property PACKAGE_PIN B8 [get_ports {led[3]}] 
set_property PACKAGE_PIN Y14 [get_ports clk] 

生成BitStream编译即可。

2. 使用时序约束

这一部分使用时序约束,时序约束的语法如下所示:

create_clock [-h | -help] [-long_help] [-add] [-name  ] -period  [-waveform  ] [  ]

其中,
1. -add 用于为一个引脚添加多个时钟约束, 如果有多个约束建议全部加上该关键词,
2. -name 表示生成时钟的名称
3. -period 表示生成时钟的周期,单位为ns
4. -waveform 表示生成时钟的占空比
5. 即为该端口

[参考自SDC时序约束1- create_clock]
[参考自create_clock]

这一部分的作用主要用于告知Vivado这个引脚具体的频率是多少,以方便Vivado对电路进行优化。
[参考自FPGA设计中时钟约束的重要性]

这一部分主要用于资源使用较大、时钟频率加高的场合,流水灯程序资源较少,时钟频率较低,这一部分不加上实际上也无所谓。
当然,最后可以加上该部分。
在led.xdc文件上可以加上这一句:

create_clock -period 20 -name clk -waveform {0 10} [get_ports clk]

你可能感兴趣的:(FPGA)