67.基于 DDR3 SDRAM 的 TFT_LCD 图像显示

(1)实验目标:在PC机上使用串口助手将一幅像素点为480*480的图片以分辨率800*480@60 的形式发给FPGA,FPGA以外接DDR3 SDRAM 做缓存,将接收到的图片通过TFT显示屏(显色模式:RGB565)显示出来。

(2)硬件设备:

  • TFT显示屏(采用800*600@60Hz的触摸tft显示屏)

(3)程序参考66实验,此处仅提供顶层程序:

module rs232_ddr_tft
(
    input   wire                clk                 ,
    input   wire                reset_n             ,
    input   wire                rx                  ,
    //vga-hdmi接口
    output  wire                tft_hsync           ,
    output  wire                tft_vsync           ,
    output  wire                tft_clk             ,
    output  wire                tft_bl              ,
    output  wire    [15:0]      tft_rgb             ,
    output  wire                tft_DE              ,
    //DDR3物理接口
    output  wire    [14:0]		ddr3_addr           ,
    output  wire    [2:0]		ddr3_ba             ,
    output  wire    			ddr3_cas_n          ,
    output  wire    		    ddr3_ck_n           ,
    output  wire    		    ddr3_ck_p           ,
    output  wire    		    ddr3_cke            ,
    output  wire    			ddr3_ras_n          ,
    output  wire    			ddr3_reset_n        ,
    output  wire    			ddr3_we_n           ,
    inout   wire    [31:0]		ddr3_dq             ,
    inout   wire    [3:0]		ddr3_dqs_n          ,
    inout   wire    [3:0]		ddr3_dqs_p          ,
    output  wire        		ddr3_cs_n           ,
    output  wire    [3:0]		ddr3_dm             ,
    output  wire        		ddr3_odt                    
);

wire            clk_33M             ;
wire            clk_320M            ;
wire            locked              ;
wire            rst_n               ;
wire            ui_clk              ; 
wire            ui_rst              ; 
wire            data_rden           ;
wire    [15:0]  data_rd             ;
wire            init_rst_n          ;
wire            init_calib_complete ;
wire    [7:0]   rx_data             ;
wire            rx_done             ;
wire    [15:0]  data_in             ;
wire    [9:0]   hang                ;
wire    [9:0]   lie                 ;
wire            img_valid           ;

reg     [20:0]  done_cnt            ;
reg     [15:0]  temp_wrdata         ;
reg             data_wren           ;

parameter IMG_LENGTH    =   480;
parameter IMG_WIDE      =   480;

pll     pll_inst
(
    .clk_33M    (clk_33M    ),    
    .clk_320M   (clk_320M   ),   
    
    .reset      (~reset_n   ),
    .locked     (locked     ),   
    
    .clk_in1    (clk        )
);   

assign tft_clk = clk_33M;

always@(posedge clk or negedge init_rst_n)
    if(!init_rst_n)
        done_cnt <= 21'd0;
    else if(rx_done)
        done_cnt <= done_cnt + 21'd1;
    else 
        done_cnt <= done_cnt;
        
always@(posedge clk or negedge init_rst_n)
    if(!init_rst_n)
        temp_wrdata <= 16'd0;
    else if(rx_done)
        temp_wrdata <= {temp_wrdata[7:0],rx_data};
    else 
        temp_wrdata <= temp_wrdata;
        
always@(posedge clk or negedge init_rst_n)
    if(!init_rst_n)
        data_wren <= 1'd0;
    else if(rx_done && done_cnt[0])
        data_wren <= 1'd1;
    else 
        data_wren <= 1'd0;  
        
assign rst_n = reset_n & locked ;
        
axi_ddr3_top    axi_ddr3_top_inst
(
    .ddr3_clk            (clk_320M              ),
    .reset_n             (rst_n                 ),
    .pingpang            (1'd0                  ),
    .ui_clk              (ui_clk                ),
    .ui_rst              (ui_rst                ),
    
    .wr_b_addr           (32'd0                 ),
    .wr_e_addr           (IMG_LENGTH*IMG_WIDE*2 ),
    .wr_clk              (clk                   ),
    .data_wren           (data_wren             ),
    .data_wr             (temp_wrdata           ),
    .wr_rst              (1'd0                  ),

    .rd_b_addr           (32'd0                 ),
    .rd_e_addr           (IMG_LENGTH*IMG_WIDE*2 ),
    .rd_clk              (clk_33M               ),
    .data_rden           (data_rden             ),
    .data_rd             (data_rd               ),
    .rd_rst              (1'd0                  ),
    .read_enable         (1'd1                  ),
    .rd_data_valid       (),

    .ddr3_addr           (ddr3_addr             ),
    .ddr3_ba             (ddr3_ba               ),
    .ddr3_cas_n          (ddr3_cas_n            ),
    .ddr3_ck_n           (ddr3_ck_n             ),
    .ddr3_ck_p           (ddr3_ck_p             ),
    .ddr3_cke            (ddr3_cke              ),
    .ddr3_ras_n          (ddr3_ras_n            ),
    .ddr3_reset_n        (ddr3_reset_n          ),
    .ddr3_we_n           (ddr3_we_n             ),
    .ddr3_dq             (ddr3_dq               ),
    .ddr3_dqs_n          (ddr3_dqs_n            ),
    .ddr3_dqs_p          (ddr3_dqs_p            ),
    .init_calib_complete (init_calib_complete   ),
    .ddr3_cs_n           (ddr3_cs_n             ),
    .ddr3_dm             (ddr3_dm               ),
    .ddr3_odt            (ddr3_odt              )  
);

assign init_rst_n = reset_n & init_calib_complete ;

rs232_rx    rs232_rx_inst
(
    .clk         (clk       ),
    .reset_n     (init_rst_n),
    .rx          (rx        ),
    .rx_start    (1'd1      ),

    .rx_data     (rx_data   ),
    .rx_done     (rx_done   )
);

tft_ctrl    tft_ctrl_inst
(
    .tft_clk     (clk_33M       ),
    .reset_n     (init_rst_n    ),
    .data_in     (data_in       ),

    .hang        (hang          ),
    .lie         (lie           ),
    .hsync       (tft_hsync     ),
    .vsync       (tft_vsync     ),
    .rgb_tft     (tft_rgb       ),
    .tft_DE      (tft_DE        )  
);

assign data_in      = (img_valid) ? data_rd : 16'hffff;
assign img_valid    =  (hang >= 160) && (hang < 640) && (lie >= 1);
assign data_rden    =  img_valid;

assign tft_bl       =   1'd1;

endmodule

(3)XDC文件:

set_property IOSTANDARD LVCMOS33 [get_ports clk]
set_property IOSTANDARD LVCMOS33 [get_ports reset_n]
set_property IOSTANDARD LVCMOS33 [get_ports rx]
set_property IOSTANDARD LVCMOS33 [get_ports tft_bl]
set_property IOSTANDARD LVCMOS33 [get_ports tft_clk]
set_property IOSTANDARD LVCMOS33 [get_ports tft_DE]
set_property IOSTANDARD LVCMOS33 [get_ports tft_hsync]
set_property IOSTANDARD LVCMOS33 [get_ports {tft_rgb[0]}]
set_property IOSTANDARD LVCMOS33 [get_ports {tft_rgb[1]}]
set_property IOSTANDARD LVCMOS33 [get_ports {tft_rgb[2]}]
set_property IOSTANDARD LVCMOS33 [get_ports {tft_rgb[3]}]
set_property IOSTANDARD LVCMOS33 [get_ports {tft_rgb[4]}]
set_property IOSTANDARD LVCMOS33 [get_ports {tft_rgb[5]}]
set_property IOSTANDARD LVCMOS33 [get_ports {tft_rgb[6]}]
set_property IOSTANDARD LVCMOS33 [get_ports {tft_rgb[7]}]
set_property IOSTANDARD LVCMOS33 [get_ports {tft_rgb[8]}]
set_property IOSTANDARD LVCMOS33 [get_ports {tft_rgb[9]}]
set_property IOSTANDARD LVCMOS33 [get_ports {tft_rgb[10]}]
set_property IOSTANDARD LVCMOS33 [get_ports {tft_rgb[11]}]
set_property IOSTANDARD LVCMOS33 [get_ports {tft_rgb[12]}]
set_property IOSTANDARD LVCMOS33 [get_ports {tft_rgb[13]}]
set_property IOSTANDARD LVCMOS33 [get_ports {tft_rgb[14]}]
set_property IOSTANDARD LVCMOS33 [get_ports {tft_rgb[15]}]
set_property IOSTANDARD LVCMOS33 [get_ports tft_vsync]
set_property PACKAGE_PIN W19 [get_ports clk]
set_property PACKAGE_PIN N15 [get_ports reset_n]
set_property PACKAGE_PIN P17 [get_ports rx]
set_property PACKAGE_PIN W10 [get_ports tft_bl]
set_property PACKAGE_PIN T14 [get_ports tft_DE]
set_property PACKAGE_PIN Y13 [get_ports tft_hsync]
set_property PACKAGE_PIN AA11 [get_ports tft_clk]
set_property PACKAGE_PIN W12 [get_ports tft_vsync]
set_property PACKAGE_PIN W16 [get_ports {tft_rgb[15]}]
set_property PACKAGE_PIN W14 [get_ports {tft_rgb[14]}]
set_property PACKAGE_PIN U16 [get_ports {tft_rgb[13]}]
set_property PACKAGE_PIN W15 [get_ports {tft_rgb[12]}]
set_property PACKAGE_PIN T16 [get_ports {tft_rgb[11]}]
set_property PACKAGE_PIN AB13 [get_ports {tft_rgb[10]}]
set_property PACKAGE_PIN AA10 [get_ports {tft_rgb[9]}]
set_property PACKAGE_PIN Y14 [get_ports {tft_rgb[8]}]
set_property PACKAGE_PIN Y11 [get_ports {tft_rgb[7]}]
set_property PACKAGE_PIN V13 [get_ports {tft_rgb[6]}]
set_property PACKAGE_PIN AA13 [get_ports {tft_rgb[5]}]
set_property PACKAGE_PIN AB11 [get_ports {tft_rgb[4]}]
set_property PACKAGE_PIN Y12 [get_ports {tft_rgb[3]}]
set_property PACKAGE_PIN V10 [get_ports {tft_rgb[2]}]
set_property PACKAGE_PIN V14 [get_ports {tft_rgb[1]}]
set_property PACKAGE_PIN W11 [get_ports {tft_rgb[0]}]

(4)引脚分配(XDC文件可以体现部分)以及实验现象

相关推荐
ikun的男人10 小时前
FPGA图像处理仿真:生成数据源的方法
fpga开发
北京太速科技股份有限公司12 小时前
太速科技-430-基于RFSOC的8路5G ADC和8路10G的DAC PCIe卡
fpga开发
RIGOL小普14 小时前
如何用李萨如图形测正弦信号的频率?若不使用李萨如图形,如何用示波器测交流信号频率?
单片机·嵌入式硬件·fpga开发·硬件工程·射频工程
小眼睛FPGA1 天前
紫光同创——盘古 50KN 网口板
fpga开发·开发板·国产fpga
皮皮宽1 天前
数字IC开发:布局布线
fpga开发·bug·verilog·数字电路设计
北京太速科技股份有限公司2 天前
太速科技-217-A(B)-Base Camera link 转光纤传输双向模块
fpga开发
Q8343158192 天前
JL5109C 9口交换机芯片集成MAC RMII/MII百兆以太网交换机芯片
arm开发·网络协议·web安全·网络安全·fpga开发·信息与通信·信号处理
hi942 天前
基于KV260的基础视频链路通路(MIPI+Demosaic+VDMA)
fpga开发·视频·1024程序员节·mipi·vdma
FlechazoCLF2 天前
小柴冲刺软考中级嵌入式系统设计师系列二、嵌入式系统硬件基础知识(6)嵌入式系统总线及通信接口
c语言·单片机·fpga开发
望森FPGA2 天前
FPGA接口专题 | I2C总线 / 集成电路总线 / Inter-Integrated Circuit
学习·fpga开发·fpga