ZYNQ EMIO UART串口实验

客官°小女子只卖身不卖艺 2022-04-01 08:23 1474阅读 0赞

在市面上能见到的zynq教程中,看的到的uart实验,都是使用的MIO,这是最简单的,但是有一个问题,那就是MIO是只连接到PS的,对PL端口是透明的,这就产生了一个问题:当我想使用任意分配在引脚的UART时该怎么办?换句话说,我有一个需求,要把串口的tx和rx分配在指定的EMIO上。

  1. 其实是很简单的,首先双击ZYNQ配置芯片。这是使用MIO的配置,我们点击UART的IO口,选择EMIO,注意UART1下的Modem signals一般不需勾选。

1240

然后我们可以看到UART1被自动引了出来,如下图。

1240 1

  1. 然后Generate Output Products -> Create HDL Wrapper,看到的底层模块是这样的

    `timescale 1 ps / 1 ps

    module design_1_wrapper

    (DDR_addr,

    1. DDR_ba,
    2. DDR_cas_n,
    3. DDR_ck_n,
    4. DDR_ck_p,
    5. DDR_cke,
    6. DDR_cs_n,
    7. DDR_dm,
    8. DDR_dq,
    9. DDR_dqs_n,
    10. DDR_dqs_p,
    11. DDR_odt,
    12. DDR_ras_n,
    13. DDR_reset_n,
    14. DDR_we_n,
    15. FIXED_IO_ddr_vrn,
    16. FIXED_IO_ddr_vrp,
    17. FIXED_IO_mio,
    18. FIXED_IO_ps_clk,
    19. FIXED_IO_ps_porb,
    20. FIXED_IO_ps_srstb,
    21. UART_1_rxd,
    22. UART_1_txd);

    inout [14:0]DDR_addr;

    inout [2:0]DDR_ba;

    inout DDR_cas_n;

    inout DDR_ck_n;

    inout DDR_ck_p;

    inout DDR_cke;

    inout DDR_cs_n;

    inout [3:0]DDR_dm;

    inout [31:0]DDR_dq;

    inout [3:0]DDR_dqs_n;

    inout [3:0]DDR_dqs_p;

    inout DDR_odt;

    inout DDR_ras_n;

    inout DDR_reset_n;

    inout DDR_we_n;

    inout FIXED_IO_ddr_vrn;

    inout FIXED_IO_ddr_vrp;

    inout [53:0]FIXED_IO_mio;

    inout FIXED_IO_ps_clk;

    inout FIXED_IO_ps_porb;

    inout FIXED_IO_ps_srstb;

    input UART_1_rxd;

    output UART_1_txd;

    wire [14:0]DDR_addr;

    wire [2:0]DDR_ba;

    wire DDR_cas_n;

    wire DDR_ck_n;

    wire DDR_ck_p;

    wire DDR_cke;

    wire DDR_cs_n;

    wire [3:0]DDR_dm;

    wire [31:0]DDR_dq;

    wire [3:0]DDR_dqs_n;

    wire [3:0]DDR_dqs_p;

    wire DDR_odt;

    wire DDR_ras_n;

    wire DDR_reset_n;

    wire DDR_we_n;

    wire FIXED_IO_ddr_vrn;

    wire FIXED_IO_ddr_vrp;

    wire [53:0]FIXED_IO_mio;

    wire FIXED_IO_ps_clk;

    wire FIXED_IO_ps_porb;

    wire FIXED_IO_ps_srstb;

    wire UART_1_rxd;

    wire UART_1_txd;

    design_1 design_1_i

    1. (.DDR_addr(DDR_addr),
    2. .DDR_ba(DDR_ba),
    3. .DDR_cas_n(DDR_cas_n),
    4. .DDR_ck_n(DDR_ck_n),
    5. .DDR_ck_p(DDR_ck_p),
    6. .DDR_cke(DDR_cke),
    7. .DDR_cs_n(DDR_cs_n),
    8. .DDR_dm(DDR_dm),
    9. .DDR_dq(DDR_dq),
    10. .DDR_dqs_n(DDR_dqs_n),
    11. .DDR_dqs_p(DDR_dqs_p),
    12. .DDR_odt(DDR_odt),
    13. .DDR_ras_n(DDR_ras_n),
    14. .DDR_reset_n(DDR_reset_n),
    15. .DDR_we_n(DDR_we_n),
    16. .FIXED_IO_ddr_vrn(FIXED_IO_ddr_vrn),
    17. .FIXED_IO_ddr_vrp(FIXED_IO_ddr_vrp),
    18. .FIXED_IO_mio(FIXED_IO_mio),
    19. .FIXED_IO_ps_clk(FIXED_IO_ps_clk),
    20. .FIXED_IO_ps_porb(FIXED_IO_ps_porb),
    21. .FIXED_IO_ps_srstb(FIXED_IO_ps_srstb),
    22. .UART_1_rxd(UART_1_rxd),
    23. .UART_1_txd(UART_1_txd));

    endmodule

在verilog代码中,UART_1_rxd和UART_1_tx也已经能够看到且引在了顶层模块的端口,剩下的就是为其分配引脚。

  1. 然后添加约束文件,这里我命名为pins.xdc

set_property SEVERITY {Warning} [get_drc_checks NSTD-1]

set_property SEVERITY {Warning} [get_drc_checks RTSTAT-1]

set_property SEVERITY {Warning} [get_drc_checks UCIO-1]

set_property IOSTANDARD LVCMOS33 [get_ports UART_1_tx]

set_property IOSTANDARD LVCMOS25 [get_ports UART_1_rxd]

set_property PACKAGE_PIN P22 [get_ports UART_1_tx]

set_property PACKAGE_PIN M22 [get_ports UART_1_rxd]

其中T22和F22是底板上两个EMIO引脚。

  1. 编译,生成bit文件,把P22和M22这两个引脚接线到你的CH340或者CP2012这种串口头上去,sdk中使用hello_world例程即可跑通。

发表评论

表情:
评论列表 (有 0 条评论,1474人围观)

还没有评论,来说两句吧...

相关阅读

    相关 51单片机串口通信(UART)

    项目描述: 1.串口工作方式为1(8位UART,波特率可变),无校验位; 2.通信数据格式为:1位起始位 + 8位数据位 + 1位停止位; 3.上电后MCU给上位机

    相关 串口Uart)的基础知识

    一、串口 1.串口定义:串行接口简称串口,也称串行通信接口或串行通讯接口(通常指COM接口),是采用串行通信方式的扩展接口。 2.串口的特点:数据一位一位的传输。