当前位置: 首页 > article >正文

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显示模块即可完成跨带宽处理。

对应代码如下:

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程序及处理完的数据形式如下所示:

% 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配置如下:

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

位宽转换模块如下:

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

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

附顶层模块代码:


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


http://www.kler.cn/a/429682.html

相关文章:

  • 3D目标检测数据集——Nusence数据集
  • SpringBoot配置文件
  • 2025 年 UI 大屏设计新风向
  • 【数据可视化-12】数据分析岗位招聘分析
  • C++内存泄露排查
  • 科研绘图系列:R语言绘制Y轴截断分组柱状图(y-axis break bar plot)
  • git 过滤检出包含windows平台不兼容文件
  • FSC认证是什么?FSC认证费用
  • Elasticsearch一分钟
  • 如何借助 LLM Gateway (LLM网关)同时接入多款 AI 大模型?
  • 2024年深圳杯数学建模C题编译器版本的识别问题解题全过程文档及程序
  • C语言 字符数组/多维数组/函数/作用域
  • 【MySQL 进阶之路】存储引擎和SQL优化技巧分析
  • 力扣刷题TOP101: 24.BM30 二叉搜索树与双向链表
  • STELLA软件入门:应用STELLA软件建立系统动态模型的过程;STELLA软件安装、界面及功能讲解等;在农业、生态及环境等科学领域应用
  • 模拟退火算法
  • 计算机网络练习题
  • Python教程104:生成26个英文字母有哪些方法?
  • LEED认证是什么?LEED认证银级和金级之间的区别在哪里
  • Agent AI: Surveying the Horizons of Multimodal Interaction---医疗保健、视频音频、多模态
  • python学习笔记—4—数据类型与数据类型转换
  • Linux上的C语言编程实践
  • JVM(Java虚拟机)类加载子系统是Java运行时环境的重要组成部分
  • 【opencv入门教程】14. 矩阵乘除运算
  • 企业防盗版:SPN安全上网解决方案,您的智能防护盾
  • 基于Hadoop大数据音乐推荐系统的设计与实现