芯路恒电子技术论坛

 找回密码
 立即注册
热搜: 合集
查看: 2898|回复: 1

【zynq课程笔记】【裸机】【第20课 】【基于VDMA的RGB TFT显示】

[复制链接]
  • TA的每日心情
    慵懒
    2021-2-24 10:16
  • 428

    主题

    811

    帖子

    1万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    16107
    QQ
    发表于 2023-6-8 20:21:27 | 显示全部楼层 |阅读模式
    ZYNQ核配置流程
    1、根据开发板上内存容量配置好DDR3型号,选择MT41K128M16(单片256MB),或MT41K256M16(单片512MB),后缀任意,位宽根据硬件结构选择16bit(1片)或32bit(2片)
    2、配置好MIO的电压,将Bank1的切换为1.8V
    3、如需要将程序固化到QSPI,请打开QSPI控制器,管脚选择MIO1~MIO6
    4、如需将程序固化到SD卡,请打开SD0控制器,管脚选择MIO40-MIO45
    5、如需使用串口打印调试信息,请使能UART1,管脚选择MIO48和MIO49
    6、如需通过PS给PL提供时钟,配置PL Fabric Clocks中的时钟频率和个数
    7、如需通过AXI-Lite读写FPGA侧的逻辑,使能PS-PL Configuration中的GP Master AXI Interface
    8、如需使用FPGA获取PS侧存储器中的内容,使能PS-PL Configuration中的HP Slave AXI Interface
    9、更多内容,根据自己需求配置



    本系统用到2路时钟,一路给AXI总线使用,用来完成各个外设的寄存器读写,以及VDMA读取PS的DDR3使用。另一路给显示时序生成器和同步器使用,并输出给TFT显示屏作为像素时钟。

    RGB TFT管脚信息约束内容

    1. set_property IOSTANDARD LVCMOS33 [get_ports lcd_pclk]
    2. set_property IOSTANDARD LVCMOS33 [get_ports {lcd_data[15]}]
    3. set_property IOSTANDARD LVCMOS33 [get_ports {lcd_data[14]}]
    4. set_property IOSTANDARD LVCMOS33 [get_ports {lcd_data[13]}]
    5. set_property IOSTANDARD LVCMOS33 [get_ports {lcd_data[12]}]
    6. set_property IOSTANDARD LVCMOS33 [get_ports {lcd_data[11]}]
    7. set_property IOSTANDARD LVCMOS33 [get_ports {lcd_data[10]}]
    8. set_property IOSTANDARD LVCMOS33 [get_ports {lcd_data[9]}]
    9. set_property IOSTANDARD LVCMOS33 [get_ports {lcd_data[8]}]
    10. set_property IOSTANDARD LVCMOS33 [get_ports {lcd_data[7]}]
    11. set_property IOSTANDARD LVCMOS33 [get_ports {lcd_data[6]}]
    12. set_property IOSTANDARD LVCMOS33 [get_ports {lcd_data[5]}]
    13. set_property IOSTANDARD LVCMOS33 [get_ports {lcd_data[4]}]
    14. set_property IOSTANDARD LVCMOS33 [get_ports {lcd_data[3]}]
    15. set_property IOSTANDARD LVCMOS33 [get_ports {lcd_data[2]}]
    16. set_property IOSTANDARD LVCMOS33 [get_ports {lcd_data[1]}]
    17. set_property IOSTANDARD LVCMOS33 [get_ports {lcd_data[0]}]
    18. set_property IOSTANDARD LVCMOS33 [get_ports lcd_de]
    19. set_property IOSTANDARD LVCMOS33 [get_ports lcd_hs]
    20. set_property IOSTANDARD LVCMOS33 [get_ports lcd_vs]
    21. set_property IOSTANDARD LVCMOS33 [get_ports lcd_bl]
    22. set_property PACKAGE_PIN U15 [get_ports lcd_pclk]
    23. set_property PACKAGE_PIN W20 [get_ports {lcd_data[15]}]
    24. set_property PACKAGE_PIN W19 [get_ports {lcd_data[14]}]
    25. set_property PACKAGE_PIN V17 [get_ports {lcd_data[13]}]
    26. set_property PACKAGE_PIN V16 [get_ports {lcd_data[12]}]
    27. set_property PACKAGE_PIN T15 [get_ports {lcd_data[11]}]
    28. set_property PACKAGE_PIN V20 [get_ports {lcd_data[10]}]
    29. set_property PACKAGE_PIN U17 [get_ports {lcd_data[9]}]
    30. set_property PACKAGE_PIN V18 [get_ports {lcd_data[8]}]
    31. set_property PACKAGE_PIN T16 [get_ports {lcd_data[7]}]
    32. set_property PACKAGE_PIN R16 [get_ports {lcd_data[6]}]
    33. set_property PACKAGE_PIN U19 [get_ports {lcd_data[5]}]
    34. set_property PACKAGE_PIN Y19 [get_ports {lcd_data[4]}]
    35. set_property PACKAGE_PIN W18 [get_ports {lcd_data[3]}]
    36. set_property PACKAGE_PIN Y18 [get_ports {lcd_data[2]}]
    37. set_property PACKAGE_PIN W16 [get_ports {lcd_data[1]}]
    38. set_property PACKAGE_PIN Y17 [get_ports {lcd_data[0]}]
    39. set_property PACKAGE_PIN W15 [get_ports lcd_de]
    40. set_property PACKAGE_PIN U14 [get_ports lcd_hs]
    41. set_property PACKAGE_PIN W14 [get_ports lcd_vs]
    42. set_property PACKAGE_PIN R17 [get_ports lcd_bl]
    复制代码


    RGB888转RGB565代码

    1. module rgb888to565(
    2.         input [23:0]rgb888_data,
    3.         output [15:0]rgb565_data
    4. );
    5.         wire [4:0]r_data;
    6.         wire [5:0]g_data;
    7.         wire [4:0]b_data;

    8.         assign r_data = rgb888_data[23:19];
    9.         assign g_data = rgb888_data[15:10];
    10.         assign b_data = rgb888_data[ 7:3];

    11.         assign rgb565_data = {r_data,g_data,b_data};

    12. endmodule
    复制代码



    SDK中软件C代码

    1. #include "xparameters.h"
    2. #include "xaxivdma.h"
    3. #include "xvtc.h"
    4. #include "xil_cache.h"
    5. #include "pic0.h"

    6. int run_triple_frame_buffer(XAxiVdma* InstancePtr, int DeviceId, int hsize,
    7.                 int vsize, int buf_base_addr, int number_frame_count,
    8.                 int enable_frm_cnt_intr);

    9. unsigned int srcBuffer = (XPAR_PS7_DDR_0_S_AXI_BASEADDR + 0x1000000);

    10. void Vtc_Init(XVtc *Vtc_Inst)
    11. {
    12.         XVtc_Config *vtcConfig;
    13.         vtcConfig = XVtc_LookupConfig(XPAR_VTC_0_DEVICE_ID);
    14.         XVtc_CfgInitialize(Vtc_Inst, vtcConfig, vtcConfig->BaseAddress);
    15. }

    16. //显示图片
    17. void Pic_Display(uint8_t *frame,const uint8_t *Pic)
    18. {
    19.         uint16_t width,height;
    20.         uint16_t x_pos, y_pos;
    21.         uint16_t x_max, y_max;
    22.         uint32_t stride_mm = 0;
    23.         uint32_t stride_pic = 8;
    24.         uint16_t Cnt = 0;

    25.         width = (Pic[2]<<8) + Pic[3];//读取图片宽度
    26.         height = (Pic[4]<<8) + Pic[5];//读取图片高度

    27.         if(width < 800)
    28.                 x_max = width;
    29.         else
    30.                 x_max = 800;

    31.         if(height < 480)
    32.                 y_max = height;
    33.         else
    34.                 y_max = 480;

    35.         for(y_pos=0;y_pos<y_max;y_pos++)
    36.         {
    37.                 for(x_pos=0;x_pos<x_max;x_pos++)
    38.                 {
    39.                         frame[stride_mm + Cnt] =  Pic[stride_pic + Cnt];
    40.                         frame[stride_mm + Cnt + 1] = Pic[stride_pic + Cnt + 1];
    41.                         frame[stride_mm + Cnt + 2] = Pic[stride_pic + Cnt + 2];
    42.                         Cnt+=3;
    43.                 }
    44.                 stride_mm += 800*3;
    45.                 stride_pic += width*3;
    46.                 Cnt = 0;
    47.         }

    48.         //刷新Cache,更新图像
    49.         Xil_DCacheFlush();
    50. }

    51. int main(void)
    52. {
    53.         XAxiVdma Vdma_Inst;
    54.         XVtc Vtc_Inst;

    55.         //清空Buffer
    56.         memset((uint8_t*)srcBuffer,0x00,800*480*3);

    57.         run_triple_frame_buffer(&Vdma_Inst, 0, 800, 480,srcBuffer, 0, 0);

    58.         Vtc_Init(&Vtc_Inst);

    59.         XVtc_EnableGenerator(&Vtc_Inst);

    60.         Pic_Display((uint8_t*)srcBuffer,gImage_pic0);

    61.         return 0;
    62. }

    复制代码


    图片数据文件: pic0.rar (845.25 KB, 下载次数: 363)
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2021-2-24 10:16
  • 428

    主题

    811

    帖子

    1万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    16107
    QQ
     楼主| 发表于 2023-6-8 22:32:06 | 显示全部楼层
    课程随堂工程文件,方便大家做的时候比对着做。
    VDMA_RGBTFT.rar (5.93 MB, 下载次数: 409)


    pg044_v_axis_vid_out.pdf (1.07 MB, 下载次数: 264)
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|小黑屋|Archiver|芯路恒电子技术论坛 |鄂ICP备2021003648号

    GMT+8, 2024-11-22 01:21 , Processed in 0.122597 second(s), 34 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc. Template By 【未来科技】【 www.wekei.cn 】

    快速回复 返回顶部 返回列表