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