block例程:搭建字符串rom,并驱动uart_tx - minichao9901/TangNano-20k-Zynq-7020 GitHub Wiki

D1 仿真框图

  • uart_tx波特率是115200, 需要注意binary counter位数 image

D2 rom_gen代码

  • 注意字符串的定义方式,是定义一个位宽很大reg
  • 注意字符串的索引方式,verilog不支持变量为范围的索引,例如str[8index: 8index+7]不行。我们只好采用了拼接的方式,或者用str[(8*index)+:8]这种新方法。
`timescale 1ns / 1ps

module rom_gen(
input sys_clk,
input sys_rst_n,
input xfer_req,

output reg [7:0] xfer_data,
output reg xfer_start

    );

parameter N=14;
reg [0:8*N-1] str="hello world!\r\n";
reg [3:0] index;
    
always @(posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n==0) begin
    index<=0;
    xfer_data<=8'h00;
    xfer_start<=0;
end
else if(xfer_req) begin
    //xfer_data<={str[8*index],str[8*index+1],str[8*index+2],str[8*index+3],str[8*index+4],str[8*index+5],str[8*index+6],str[8*index+7]};
    xfer_data<=str[(8*index) +:8];    
    xfer_start<=1;
    index<=index+1;
    if(index==N-1)
        index<=0;
end
else
    xfer_start<=0;
    
endmodule

D3 仿真结果

image image

在xfer_req的下一个周期,输出xfer_data, xfer_start,并更新index

D4 上板验证结果

image

image

测试结果,非常ok!