UART+DDR3+HDMI联合图像存储与显示系统

整个项目的整体流程是上位机将一张分辨率为1024*768的彩色图片通过UART串口发到FPGA,FPAG接收到数据后写入DDR3存储器,最后VGA将图像数据从DDR3中读出通过HDMI显示在屏幕上。

整个项目的系统框图如下所示:

项目的核心点主要在于uart模块与ddr3写控制模块的跨位宽处理以及ddr3读数据与hdmi显示模块的带宽匹配处理。

整个项目在准备好基于MIG IP核的DDR3驱动代码基础上,还需以下几步:

一、基于A7的DDR3与HDMI显示系统的搭建

本章的主要内容在下面基于A7的DDR3控制模块基础上,加入HDMI显示模块。

HDMI显示模块就是在vga显示的基础上,加上编码及串并转换处理,这是处理高速信号的常见方法(GT收发器也是如此)。HDMI发送器处理流程为图像数据转成R G B三个通道,每个通道的数据位宽均需要是8bit,然后由8b/10b编码模块转化为10bit数据,这个目的在于保证直流平衡,最后由并行转串行模块将10bit的数据转化成串行差分信号,并输出到FPGA的引脚端。时钟源可以由固定的数据替代,即10'b11111_00000。示意图如下:

这部分显示系统的核心问题在于HDMI心事模块与DDR3读控制模块的带宽处理,模块思想为设计一个状态机,实现的功能为判断精准计数的fifo内写入数据的个数,如果小于1.5行数据,启动读数据状态(从DDR3读数据写入fifo),否则在每突发写入64个128bit数据返回到JUDGE状态,继续判断

状态转移图如下图所示:

对应的模块框图如下:

整个过程为复位结束后,会进入JUDGE状态,此时wr_data_count<192将触发ddr3用户端rd_start信号,同时进入RD状态,这时ddr3用户侧将反馈出读有效rd_data_valid和读数据rd_data给到该模块,同时突发读完一次user_rd_end信号拉高一次进入JUDGE状态判断写入数据是否达到了1.5行以上,到了停止读;在大于1.5行数据的情况下将hdmi_rst_n信号传给vga模块使其工作,它会反馈过来rd_fifo_en,再将读出的rgb数据rd_fifo_data给到hdmi显示模块即可完成跨带宽处理。

对应代码如下:

verilog 复制代码
module hdmi_buffer(
    input  wire                         wrclk                      ,
    input  wire                         hdmiclk                    ,
    input  wire                         rst                        ,
    output wire                         rd_start                   ,
    input  wire                         user_rd_end                ,
    input  wire                         rd_data_valid              ,
    input  wire        [255:0]          rd_data                    , //read data from ddr3 
    output wire                         hdmi_rst_n                 ,
    input  wire                         rd_fifo_en                 ,
    output wire [23:0]                  rd_fifo_data
    
);

    reg [2:0] state ;

    parameter IDLE = 3'b001;
    parameter JUDGE = 3'b010;
    parameter RD = 3'b100;

    wire        [   9:0]         wr_data_count             ; 
    wire        [  11:0]         rd_data_count             ;
    // wire [4:0] red0,blue0,red1,blue1;
    // wire [5:0] green0,green1;
    wire [7:0] red,blue,green;
    wire [7:0] add_0;
    wire empty ;
    wire rd_start_r1;

    //用于拼接两个数据

    reg rd_start_r;
    reg hdmi_rst_n_r = 0;

    assign rd_start = rd_start_r | rd_start_r1 ;
    assign hdmi_rst_n = hdmi_rst_n_r;

    vio_0 vio_rd_start (
        .clk(wrclk),                // input wire clk
        .probe_out0(rd_start_r1)  // output wire [0 : 0] probe_out0
      );

    

    always@(posedge wrclk)begin
        if(rst==1'b1)
            state <= IDLE;
        else case(state)
            IDLE:
                state <= JUDGE;
            JUDGE:
                if(wr_data_count < 96)
                    state <= RD;
            RD:
                if(user_rd_end == 1'b1)
                    state <= JUDGE;
            default : state <= IDLE;
        endcase
    end

    //rd_start_r
    always@(posedge wrclk)
        if(rst)
            rd_start_r <= 1'b0;
        else if(state==JUDGE &&  wr_data_count < 96)//one clock
            rd_start_r <= 1'b1;
        else
            rd_start_r <= 1'b0;

    //(1024+512)*16/256 = 96
    as_fifo asfifo_ddr3_hdmi (
        .wr_clk(wrclk),                // input wire wr_clk
        .rd_clk(hdmiclk),                // input wire rd_clk
        .din(rd_data),                      // input wire [255 : 0] din
        .wr_en(rd_data_valid),                  // input wire wr_en
        .rd_en(rd_fifo_en),                  // input wire rd_en
        .dout({red,green,blue,add_0}),                    // output wire [31 : 0] dout
        .full(),                    // output wire full
        .empty(empty),                  // output wire empty
        .rd_data_count(rd_data_count),  // output wire [12 : 0] rd_data_count
        .wr_data_count(wr_data_count)  // output wire [9 : 0] wr_data_count
      );

    // assign rd_fifo_data = {red0,3'b000,green0,2'b0,blue0,3'b0};
      assign rd_fifo_data = {red,green,blue};

    always@(posedge hdmiclk)
        if(rst==1'b1)
            hdmi_rst_n_r <= 1'b0;
        else if(rd_data_count >= 750)
            hdmi_rst_n_r <= 1'b1;

endmodule

二、基于matlab的彩色图像预处理

根据分辨率的要求,可以先准备好一张1024*768的图像数据,然后通过matlab将其处理为16进制数,每8bit数据为一组,对应matlab程序及处理完的数据形式如下所示:

verilog 复制代码
% MATLAB程序:每行保存1024个像素,每个通道和像素用16进制表示并用空格分隔
% 读取图片
image = imread('D:\\MATLAB\\RGB_YCrCb\\test.png'); % 请替换为实际图片路径
[h, w, ~] = size(image);

% 打开文件写入
fileID = fopen('txt2.txt', 'w'); % 请替换为实际输出文件路径

% 遍历图片的每一行
for y = 1:h
    row_data = ''; % 初始化当前行的数据字符串
    for x = 1:w
        % 提取RGB通道
        R = uint8(image(y, x, 1)); % 红色通道
        G = uint8(image(y, x, 2)); % 绿色通道
        B = uint8(image(y, x, 3)); % 蓝色通道
        A = uint8(0); % Alpha通道,固定为0

        % 将每个通道转换为16进制格式并用空格分隔
        pixel_hex = sprintf('%02X %02X %02X %02X', R, G, B, A);

        % 将当前像素的16进制字符串添加到当前行的数据字符串
        row_data = [row_data, pixel_hex, ' ']; % 在每个像素后添加一个空格
    end

    % 去除行末尾的多余空格
    row_data = strtrim(row_data);

    % 将当前行的数据写入文件
    fprintf(fileID, '%s\n', row_data);
end

% 关闭文件
fclose(fileID);

% 提示完成
disp('像素数据已保存,每个通道和像素用16进制表示并用空格分隔,每行包含1024个像素。');

致此,便将适合串口发送的8bit数据准备好了。

三、联合UATR接收数据模块与基于A7的DDR3与HDMI显示系统工程

这部分主要完成的任务是将串口接收到的8bit数据写入DDR3中,核心地方在于实现8bit数据到256bit数据的跨位宽处理,由于UART串口接收到的数据转换完是8bit的数据,而DDR3写数据端口对应的数据位宽是256bit的,因此需要例化一个fifo做位宽的转换,同时由于一次突发写需要64个数据,因此要等存够64个256bit数据后再开启读FIFO。写深度对应256*64/8 = 2048个

实例化的fifo配置如下:

由于没有合适的位宽,因此后面需要做拼接处理(移位寄存器):

位宽转换模块如下:

该模块即可完成数据位宽的转换功能,对应代码如下所示:

verilog 复制代码
module bit8to256(
    input  wire                         sclk                       ,
    input  wire                         rst                        ,
    input  wire                         rx_flag                    ,
    input  wire        [   7:0]         rx_data                    ,
    output wire                         rd_en                      ,//fifo rd -----ddr3 wr
    output wire        [ 255:0]         rd_data                     
);
    parameter                           BURST_LEN = 64             ;

//由于输入数据的深度是32bit的,而uart接收到的数据是32bit的,因此需要做移位拼接操作
reg                    [  31:0]         shift_reg                  ;
reg                    [   1:0]         rx_cnt = 0                 ;
reg                                     wr_en                      ;
wire                   [  31:0]         wr_data                    ;
wire                   [   7:0]         rd_data_count              ;
reg                                     rd_en_r                    ;
reg                    [   7:0]         rd_en_cnt                  ;//用于计数rd_en拉高的拍数

assign wr_data = shift_reg;

always@(posedge sclk)begin
    if(rx_flag==1'b1)
        shift_reg <= {shift_reg[23:0],rx_data} ;
end

always@(posedge sclk)begin
    if(rst==1'b1)
        rx_cnt <= 'd0;
    else if(rx_flag==1'b1)
        rx_cnt <= rx_cnt + 1'b1;
end

always@(posedge sclk)begin
    if(rst == 1'b1)
        wr_en <= 1'b0;
    else if(rx_cnt=='d3 && rx_flag == 1'b1)
        wr_en <= 1'b1;
    else
        wr_en <= 1'b0; 
end

always@(posedge sclk)begin
    if(rst==1'b1)
        rd_en_r <= 1'b0;
    else if(rd_en_cnt == BURST_LEN-1)
        rd_en_r <= 1'b0;
    else if(rd_data_count >= BURST_LEN)
        rd_en_r <= 1'b1; 
end

always@(posedge sclk)begin
    if(rst==1'b1)
        rd_en_cnt <= 'd0;
    else if(rd_en_cnt == BURST_LEN-1 && rd_en_r == 1'b1)
        rd_en_cnt <= 'd0;
    else if(rd_en_r == 1'b1)
        rd_en_cnt <= rd_en_cnt + 1'b1;
end

assign rd_en = rd_en_r;

fifo_8_256 fifo8to256 (
  .clk(sclk),                      // input wire clk
  .din(wr_data),                      // input wire [31 : 0] din
  .wr_en(wr_en),                  // input wire wr_en
  .rd_en(rd_en),                  // input wire rd_en
  .dout(rd_data),                    // output wire [255 : 0] dout
  .full(),                    // output wire full
  .empty(),                  // output wire empty
  .rd_data_count(rd_data_count)  // output wire [7 : 0] rd_data_count
);


endmodule

附顶层模块代码:

verilog 复制代码
module top_ddr3_hdmi(
    inout              [  31:0]         ddr3_dq                    ,//ddr3数据位宽16bit
    inout              [   3:0]         ddr3_dqs_n                 ,
    inout              [   3:0]         ddr3_dqs_p                 ,
    // Outputs
    output             [  13:0]         ddr3_addr                  ,
    output             [   2:0]         ddr3_ba                    ,
    output                              ddr3_ras_n                 ,
    output                              ddr3_cas_n                 ,
    output                              ddr3_we_n                  ,
    output                              ddr3_reset_n               ,
    output             [   0:0]         ddr3_ck_p                  ,
    output             [   0:0]         ddr3_ck_n                  ,
    output             [   0:0]         ddr3_cke                   ,
    output             [   0:0]         ddr3_cs_n                  ,
    output             [   3:0]         ddr3_dm                    ,
    output             [   0:0]         ddr3_odt                   ,
    // Inputs
    // Single-ended system clock
    input                               sys_clk                 ,//50MHz
    input                               sys_rst_n               ,
    // Single-ended iodelayctrl clk (reference clock)
    //input                               clk_ref_i                  ,
    //output                              init_calib_complete        ,
    //input                               sys_rst                     //actice low
    //hdmi output 
    output wire                         hdmi_clk_p                 ,
    output wire                         hdmi_clk_n                 ,
    // output wire                         hdmi_chn0_p                ,
    // output wire                         hdmi_chn0_n                ,
    // output wire                         hdmi_chn1_p                ,
    // output wire                         hdmi_chn1_n                ,
    // output wire                         hdmi_chn2_p                ,
    // output wire                         hdmi_chn2_n                 
    output wire        [   2:0]         tmds_data_p                ,
    output wire        [   2:0]         tmds_data_n                ,
    //usrt rx
    input  wire                         uart_rxd                          

    );

    wire                                    sys_clk_i                  ;//200MHz
    wire                                    sys_rst                    ;//低电平有效 用locked信号即可
    wire                                    clk_ref_i                  ;//200MHz
    wire                                    init_calib_complete        ;
    wire                                    locked                     ;
    wire                                    probe0                     ;
    wire                                    clk_100M                   ;
    wire                                    rst                        ;

    wire                                    wr_cmd_start               ;
    wire                   [   2:0]         wr_cmd_instr               ;
    wire                   [   6:0]         wr_cmd_bl                  ;
    wire                   [  27:0]         wr_cmd_addr                ;
    wire                   [ 255:0]         data_256bit                ;
    wire                   [  31:0]         wr_cmd_mask                ;
    wire                                    data_req                   ;
    wire                                    wr_end                     ;
    wire                                    app_wdf_wren               ;
    wire                   [ 255:0]         app_wdf_data               ;
    wire                                    app_wdf_rdy                ;
    wire                                    app_en                     ;
    wire                                    app_rdy                    ;
    wire                   [  27:0]         app_addr                   ;
    wire                   [   2:0]         app_cmd                    ;
    wire                   [ 255:0]         app_rd_data                ;
    wire                                    app_rd_data_valid          ;
  
    wire                                    rd_cmd_start               ;
    wire                   [   2:0]         rd_cmd_instr               ;
    wire                   [   6:0]         rd_cmd_bl                  ;
    wire                   [  27:0]         rd_cmd_addr                ;
    wire                   [ 255:0]         rd_data_256bit             ;
    wire                                    rd_data_valid              ;
    wire                                    rd_end                     ;
    wire                   [   2:0]         app_wr_cmd,app_rd_cmd      ;
  
    wire                                    wr_req,rd_req              ;
    wire                                    app_wr_en,app_rd_en        ;
    wire                   [  27:0]         app_wr_addr,app_rd_addr    ;
  
    wire                                    p1_clk                     ;
    wire                                    p1_rd_en                   ;
    wire                   [ 255:0]         p1_rd_data                 ;
    wire                                    p1_rd_data_full            ;
    wire                                    p1_rd_data_empty           ;
    wire                   [   6:0]         p1_rd_data_count           ;
    wire                   [   2:0]         p1_cmd_instr               ;
    wire                   [   6:0]         p1_cmd_bl                  ;
    wire                   [  27:0]         p1_cmd_addr                ;
    wire                                    p1_cmd_en                  ;
    wire                                    p1_cmd_empty               ;
    wire                                    user_rd_end                ;
  
    wire                                    p2_clk                     ;
    wire                   [   2:0]         p2_cmd_instr               ;
    wire                   [   6:0]         p2_cmd_bl                  ;
    wire                   [  27:0]         p2_cmd_addr                ;
    wire                                    p2_cmd_en                  ;
    wire                                    p2_cmd_empty               ;
    wire                   [ 255:0]         p2_wr_data                 ;
    wire                                    p2_wr_en                   ;
    wire                   [  31:0]         p2_wr_mask                 ;
    wire                                    p2_wr_data_full            ;
    wire                                    p2_wr_data_empty           ;
    wire                   [   6:0]         p2_wr_data_count           ;
  
    wire                                    wr_en                      ;
    wire                   [ 255:0]         wr_data                    ;
  
    wire                                    rd_start                   ;
    wire                                    locked1                     ;
    wire                                    clk_1x                     ;//65Mhz
    wire                                    clk_5x                     ;

    wire                   [   7:0]         po_data                    ;
    wire                                    po_flag                    ;

    //hdmi
    wire                         hdmi_chn0_p    ;
    wire                         hdmi_chn0_n    ;
    wire                         hdmi_chn1_p    ;
    wire                         hdmi_chn1_n    ;
    wire                         hdmi_chn2_p    ;
    wire                         hdmi_chn2_n    ;

    assign p2_clk = p1_clk;

    assign  hdmi_chn0_p = tmds_data_p[0];
    assign  hdmi_chn1_p = tmds_data_p[1];
    assign  hdmi_chn2_p = tmds_data_p[2];
    assign  hdmi_chn0_n = tmds_data_n[0];
    assign  hdmi_chn1_n = tmds_data_n[1];
    assign  hdmi_chn2_n = tmds_data_n[2];

    assign app_en = app_wr_en | app_rd_en;
    assign app_addr = app_wr_addr | app_rd_addr;
    assign app_cmd = (app_wr_en == 1)?app_wr_cmd:app_rd_cmd;

    user_rd_ctrl  inst_user_rd_ctrl (
        .sclk         (p1_clk),
        .rst          (ui_clk_sync_rst |(~init_calib_complete)),
        .rd_start     (rd_start),
        .p1_cmd_en    (p1_cmd_en),
        .p1_cmd_bl    (p1_cmd_bl),
        .p1_cmd_instr (p1_cmd_instr),
        .p1_cmd_addr  (p1_cmd_addr),
        .p1_rd_count  (p1_rd_data_count),
        .p1_rd_en     (p1_rd_en),
        .user_rd_end  (user_rd_end)
      );
  
      user_wr_ctrl inst_user_wr_ctrl (
        .sclk         (p2_clk),
        .rst          (ui_clk_sync_rst |(~init_calib_complete)),
        .wr_en        (wr_en),
        .wr_data      (wr_data),
        .p2_wr_en     (p2_wr_en),
        .p2_wr_data   (p2_wr_data),
        .p2_wr_mask   (p2_wr_mask),
        .p2_cmd_en    (p2_cmd_en),
        .p2_cmd_bl    (p2_cmd_bl),
        .p2_cmd_instr (p2_cmd_instr),
        .p2_cmd_addr  (p2_cmd_addr),
        .user_wr_end  (user_wr_end),
        .p2_wr_empty  (p2_wr_data_empty)
      );

      ila_3 ila3 (
        .clk(p2_clk), // input wire clk
      
        .probe0(wr_en), // input wire [0:0]  probe0  
        .probe1(wr_data), // input wire [255:0]  probe1 
        .probe2(p2_wr_en), // input wire [0:0]  probe2 
        .probe3(p2_wr_data), // input wire [255:0]  probe3 
        .probe4(p2_cmd_en), // input wire [0:0]  probe4 
        .probe5(p2_cmd_instr), // input wire [2:0]  probe5 
        .probe6(p2_cmd_addr), // input wire [27:0]  probe6 
        .probe7(user_wr_end) // input wire [0:0]  probe7
      );
  
  
    rd_data_fifo_ctrl rd_data_fifo_inst (
      .rst(1'b0),//(ui_clk_sync_rst |(~init_calib_complete)),                      // input wire rst
      .wr_clk(ui_clk),                // input wire wr_clk
      .rd_clk(p1_clk),                // input wire rd_clk
      .din(app_rd_data),                      //  input wire [255 : 0] din
      .wr_en(app_rd_data_valid),                  // input wire wr_en
      .rd_en(p1_rd_en),                  // input wire rd_en
      .dout(p1_rd_data),                    // output wire [255 : 0] dout
      .full(p1_rd_data_full),                    // output wire full
      .empty(p1_rd_data_empty),                  // output wire empty
      .rd_data_count(p1_rd_data_count),  // output wire [6 : 0] rd_data_count
      .wr_rst_busy(),      // output wire wr_rst_busy
      .rd_rst_busy()      // output wire rd_rst_busy
    );

   assign  rd_req	= ~p1_cmd_empty;
  
  rd_cmd_fifo_ctrl rd_cmd_fifo_ctrl (
      .rst(1'b0),//(ui_clk_sync_rst |(~init_calib_complete)),               // input wire rst
      .wr_clk(p1_clk),            // input wire wr_clk
      .rd_clk(ui_clk),            // input wire rd_clk
      .din({p1_cmd_instr,p1_cmd_bl,p1_cmd_addr}),                  // input wire [37 : 0] din
      .wr_en(p1_cmd_en),              // input wire wr_en
      .rd_en(rd_cmd_start),              // input wire rd_en
      .dout({rd_cmd_instr,rd_cmd_bl,rd_cmd_addr}),                // output wire [37 : 0] dout
      .full(),                // output wire full
      .empty(p1_cmd_empty),              // output wire empty
      .wr_rst_busy(),  // output wire wr_rst_busy
      .rd_rst_busy()  // output wire rd_rst_busy
  );

  ila_1 ila1 (
    .clk(p1_clk), // input wire clk
  
    .probe0(p1_rd_data_count), // input wire [6:0]  probe0  
    .probe1(p1_rd_data), // input wire [255:0]  probe1 
    .probe2(p1_cmd_en), // input wire [0:0]  probe2 
    .probe3(p1_cmd_empty), // input wire [0:0]  probe3 
    .probe4(p1_rd_data_empty), // input wire [0:0]  probe4 
    .probe5(rd_cmd_start), // input wire [0:0]  probe5 
    .probe6(p1_rd_en), // input wire [0:0]  probe6 
    .probe7(rd_req) // input wire [0:0]  probe7
  );


  
  assign wr_req = ~p2_cmd_empty;
  
  wr_cmd_fifo_ctrl wr_cmd_fifo_ctrl_inst (
      .rst(1'b0),//(ui_clk_sync_rst |(~init_calib_complete)),                  // input wire rst
      .wr_clk(p2_clk),            // input wire wr_clk
      .rd_clk(ui_clk),            // input wire rd_clk
      .din({p2_cmd_instr,p2_cmd_bl,p2_cmd_addr}),                  // input wire [37 : 0] din
      .wr_en(p2_cmd_en),              // input wire wr_en
      .rd_en(wr_cmd_start),              // input wire rd_en
      .dout({wr_cmd_instr,wr_cmd_bl,wr_cmd_addr}),                // output wire [37 : 0] dout
      .full(),                // output wire full
      .empty(p2_cmd_empty),              // output wire empty
      .wr_rst_busy(wr_rst_busy),  // output wire wr_rst_busy
      .rd_rst_busy(rd_rst_busy)  // output wire rd_rst_busy
  );
  
  wr_data_fifo_ctrl wr_data_fifo_ctrl_inst (
      .rst(1'b0),//(ui_clk_sync_rst |(~init_calib_complete)),                      // input wire rst
      .wr_clk(p2_clk),                // input wire wr_clk
      .rd_clk(ui_clk),                // input wire rd_clk
      .din({p2_wr_mask,p2_wr_data}),                      // input wire [287: 0] din
      .wr_en(p2_wr_en),                  // input wire wr_en
      .rd_en(data_req),                  // input wire rd_en
      .dout({wr_cmd_mask,data_256bit}),                    // output wire [287 : 0] dout
      .full(p2_wr_data_full),                    // output wire full
      .empty(p2_wr_data_empty),                  // output wire empty
      .wr_data_count(p2_wr_data_count),  // output wire [6 : 0] wr_data_count
      .wr_rst_busy(),      // output wire wr_rst_busy
      .rd_rst_busy()      // output wire rd_rst_busy
  );
  
    a7_ddr3_wr_ctrl inst_a7_ddr3_wr_ctrl
      (
        .sclk         (ui_clk),
        .rst          (ui_clk_sync_rst |(~init_calib_complete)),
        .wr_cmd_start (wr_cmd_start),
        .wr_cmd_instr (wr_cmd_instr),
        .wr_cmd_bl    (wr_cmd_bl),
        .wr_cmd_addr  (wr_cmd_addr),
        .data_256bit  (data_256bit),
        .wr_cmd_mask  (wr_cmd_mask),
        .data_req     (data_req),
        .wr_end       (wr_end),
        .app_wdf_wren (app_wdf_wren),
        .app_wdf_data (app_wdf_data),
        .app_wdf_rdy  (app_wdf_rdy),
        .app_en       (app_wr_en),//app_en),
        .app_rdy      (app_rdy),//app_rdy),
        .app_addr     (app_wr_addr),//app_addr),
        .app_cmd      (app_wr_cmd)//app_cmd)
      );
  
    a7_ddr3_rd_ctrl inst_a7_ddr3_rd_ctrl
      (
        .sclk              (ui_clk),
        .rst               (ui_clk_sync_rst |(~init_calib_complete)),
        .rd_cmd_start      (rd_cmd_start),
        .rd_cmd_instr      (rd_cmd_instr),
        .rd_cmd_bl         (rd_cmd_bl),
        .rd_cmd_addr       (rd_cmd_addr),
        .rd_data_256bit    (rd_data_256bit),
        .rd_data_valid     (rd_data_valid),
        .rd_end            (rd_end),
        .app_rd_data       (app_rd_data),
        .app_rd_data_valid (app_rd_data_valid),
        .app_en            (app_rd_en),
        .app_rdy           (app_rdy),
        .app_addr          (app_rd_addr),
        .app_cmd           (app_rd_cmd)
      );
  
    arbit  inst_arbit (
        .sclk         (ui_clk),
        .rst          (ui_clk_sync_rst |(~init_calib_complete)),
        .rd_req       (rd_req),
        .wr_req       (wr_req),
        .rd_end       (rd_end),
        .wr_end       (wr_end),
        .rd_cmd_start (rd_cmd_start),
        .wr_cmd_start (wr_cmd_start)
      );


    clk_ddr3 clk_ddr3
    (
     // Clock out ports
     .clk_out1(sys_clk_i),     // output clk_out1
     .clk_out2(clk_ref_i),     // output clk_out2 200MHz
     .clk_out3(clk_100M),     // output clk_out3
     // Status and control signals
     .resetn(sys_rst_n), // input resetn
     .locked(locked),       // output locked
    // Clock in ports
     .clk_in1(sys_clk)      // input clk_in1 50MHz
    );

    mig u_mig (
    // Memory interface ports
    .ddr3_addr                      (ddr3_addr),  // output [13:0]		ddr3_addr
    .ddr3_ba                        (ddr3_ba),  // output [2:0]		ddr3_ba
    .ddr3_cas_n                     (ddr3_cas_n),  // output			ddr3_cas_n
    .ddr3_ck_n                      (ddr3_ck_n),  // output [0:0]		ddr3_ck_n
    .ddr3_ck_p                      (ddr3_ck_p),  // output [0:0]		ddr3_ck_p
    .ddr3_cke                       (ddr3_cke),  // output [0:0]		ddr3_cke
    .ddr3_ras_n                     (ddr3_ras_n),  // output			ddr3_ras_n
    .ddr3_reset_n                   (ddr3_reset_n),  // output			ddr3_reset_n
    .ddr3_we_n                      (ddr3_we_n),  // output			ddr3_we_n
    .ddr3_dq                        (ddr3_dq),  // inout [31:0]		ddr3_dq
    .ddr3_dqs_n                     (ddr3_dqs_n),  // inout [3:0]		ddr3_dqs_n
    .ddr3_dqs_p                     (ddr3_dqs_p),  // inout [3:0]		ddr3_dqs_p
    .init_calib_complete            (init_calib_complete),  // output			init_calib_complete
	  .ddr3_cs_n                      (ddr3_cs_n),  // output [0:0]		ddr3_cs_n
    .ddr3_dm                        (ddr3_dm),  // output [3:0]		ddr3_d
    .ddr3_odt                       (ddr3_odt),  // output [0:0]		ddr3_odt
    // Application interface ports
    .app_addr                       (app_addr),  // input [27:0]		app_add
    .app_cmd                        (app_cmd),  // input [2:0]		app_cmd
    .app_en                         (app_en ),  // input				app_en
    .app_wdf_data                   (app_wdf_data),  // input [255:0]		app_wdf_data
    .app_wdf_end                    (app_wdf_end),  // input				app_wdf_end
    .app_wdf_wren                   (app_wdf_wren),  // input				app_wdf_wren
    .app_rd_data                    (app_rd_data),  // output [255:0]		app_rd_data
    .app_rd_data_end                (app_rd_data_end),  // output			app_rd_data_end
    .app_rd_data_valid              (app_rd_data_valid),  // output			app_rd_data_valid
    .app_rdy                        (app_rdy),  // output			app_rdy
    .app_wdf_rdy                    (app_wdf_rdy),  // output			app_wdf_rdy
    .app_sr_req                     (1'b0),  // input			app_sr_req
    .app_ref_req                    (1'b0),  // input			app_ref_req
    .app_zq_req                     (1'b0),  // input			app_zq_req
    .app_sr_active                  (app_sr_active),  // output			app_sr_active
    .app_ref_ack                    (app_ref_ack),  // output			app_ref_ack
    .app_zq_ack                     (app_zq_ack),  // output			app_zq_ack
    .ui_clk                         (ui_clk),  // output			ui_clk
    .ui_clk_sync_rst                (ui_clk_sync_rst),  // output			ui_clk_sync_rst
    .app_wdf_mask                   (wr_cmd_mask),  // input [31:0]		app_wdf_mask
    // System Clock Ports
    .sys_clk_i                      (sys_clk_i),
    // Reference Clock Ports
    .clk_ref_i                      (clk_ref_i),
    .sys_rst                        (locked|rst) // input sys_rst
    );

    //hdmi(clock trans and hdmi show)
    top_hdmi  u_top_hdmi (
      .wrclk                   ( p1_clk                 ),
      .rst                    (1'b0),// ( ui_clk_sync_rst |(~init_calib_complete )),
      .locked                  ( locked1                 ),
      .clk1x                   ( clk_1x                  ),//65Mhz
      .clk5x                   ( clk_5x                  ),
      .user_rd_end             ( user_rd_end            ),
      .rd_data_valid           ( p1_rd_en               ),//一直为低电平
      .rd_data                 ( p1_rd_data             ),
  
      .rd_start                ( rd_start               ),
      .hdmi_clk_p              ( hdmi_clk_p             ),
      .hdmi_clk_n              ( hdmi_clk_n             ),
      .hdmi_chn0_p             ( hdmi_chn0_p            ),
      .hdmi_chn0_n             ( hdmi_chn0_n            ),
      .hdmi_chn1_p             ( hdmi_chn1_p            ),
      .hdmi_chn1_n             ( hdmi_chn1_n            ),
      .hdmi_chn2_p             ( hdmi_chn2_p            ),
      .hdmi_chn2_n             ( hdmi_chn2_n            )
  );

    hdmi_clk hdmi_clk
    (
     // Clock out ports
     .clk_1x(clk_1x),     // output clk_1x
     .clk_5x(clk_5x),     // output clk_5x
     .p1_clk(p1_clk),     // output p1_clk
     // Status and control signals
     .locked(locked1),       // output locked
    // Clock in ports
     .clk_in(clk_100M)      // input clk_in
 );

  bit8to256 u_bit8to256 (
      .sclk                    ( p1_clk            ),
      .rst                     ( ui_clk_sync_rst |(~init_calib_complete)),
      .rx_flag                 ( po_flag           ),
      .rx_data                 ( po_data           ),

      .rd_en                   ( wr_en             ),
      .rd_data                 ( wr_data           )   
  );

  ila_4 ila4 (
	.clk(p1_clk), // input wire clk
	.probe0(po_data), // input wire [7:0]  probe0  
	.probe1(po_flag) // input wire [0:0]  probe1
);

  uart_rx u_uart_rx (
    .sclk                    ( p1_clk           ),
    .rst_n                   ( ~(ui_clk_sync_rst |(~init_calib_complete))),
    .rx                      ( uart_rxd             ),

    .po_data                 ( po_data       ),
    .po_flag                 ( po_flag        )
);

    ila_0 ila_0 (
    .clk(ui_clk), // input wire clk

    .probe0(app_rd_cmd), // input wire [2:0]  probe0  
    .probe1(app_rd_data), // input wire [255:0]  probe1 
    .probe2(app_rd_en), // input wire [0:0]  probe2 
    .probe3(app_rdy), // input wire [0:0]  probe3 
    .probe4(rd_end), // input wire [0:0]  probe4 
    .probe5(app_rd_data_valid), // input wire [0:0]  probe5
    .probe6(rd_cmd_start)
  );

  
endmodule
相关推荐
仲南音2 天前
Xilinx FPGA——时钟IP核MMCM、PLL
fpga开发
I'm a winner3 天前
基于Xilinx FPGA的LVDS高速串行通信系统(三)--数据训练及握手机制【文末源码】
fpga开发
upper20203 天前
coremark移植坑之-nostartfiles -nostdlib参数
学习·fpga开发·coremark移植·riscv设计
Eloudy3 天前
Vivado 纯命令行构建 FPGA 项目教程
fpga开发
Rambo.xia3 天前
AXI跨时钟域与数据一致性——CDC FIFO深度不够、写后读冒险、多Master仲裁、乱序返回,出了Bug根本查不出来
fpga开发·bug
upper20203 天前
FPGA部署卷积神经网络识别MINST图片
fpga开发·卷积神经网络·minst·minst识别·部署神经网络·神经网络识别图片
你是我的解忧王子4 天前
嵌入式 ADC采样 原始数据分析上层(平均值 波动率 正态分布 线性补偿 系统误差)
fpga开发·数据挖掘·数据分析
9527华安4 天前
FPGA纯verilog代码ISP图像处理培训教程,基于IMX214,提供工程源码+视频教程+FPGA开发板
图像处理·fpga开发·isp·imx214·mipi
千寻xun5 天前
二、实战篇-NVME SSD控制之ZYNQ实现(六)-读写NVME SSD硬盘数据
fpga开发·nvme·nvme ssd
千寻xun5 天前
二、实战篇-NVME SSD控制之ZYNQ实现(三)
fpga开发·nvme ssd·nvme协议