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

板级调试小助手(3)基于PYNQ的OLED视频显示

一、前言

        在之前的文章中介绍了《板级调试小助手》的系统结构和DDS自定义外设的搭建。这篇文章主要介绍一下如何在PYNQ中驱动平时长剑的OLED12864显示屏,并显示BadApple(毕竟有屏幕的地方就要有BadApple)。效果如下:

BadApple

本项目完全开源,开源地址请查看《板级调试小助手(1)系统结构和原理》文章最后

二、OLED驱动设计

        OLED显示屏使用了IIC协议,为了能方便PS端控制,我们需要将其设计成自动读取BRAM中的数据,并显示,OLED驱动的顶层如下所示。

module oled_top #
(parameter   SLAVE_ADDR =  7'b0111100,       //从机地址parameter   CLK_FREQ   = 26'd100_000_000,   //系统时钟(Hz)parameter   I2C_FREQ   = 19'd350_000,       //IIC频率parameter   BIT_CTRL   =  1'b0              //字地址位控制(16b/8b)
)
(input sysClk,           //系统时钟input sysRst,           //全局复位//RAM数据接口output [9:0]rd_addr,        //读RAM地址input  [7:0]ram_rd_data,    //读RAM数据//IIC接口output      oled_scl,inout       oled_sda
);wire            i2c_dir_clk     ;
wire            i2c_exec        ;
wire    [15:0]  i2c_data        ;
wire            i2c_done        ;i2c_dri #(.SLAVE_ADDR (SLAVE_ADDR    ) ,.CLK_FREQ   (CLK_FREQ      ) ,   .I2C_FREQ   (I2C_FREQ      )     
)
i2c_dri_u (//global clock.clk        (sysClk          ), .rst_n      (~sysRst         ), .i2c_exec   (i2c_exec      ), .bit_ctrl   (BIT_CTRL        ), .i2c_rh_wl  (1'b0            ), .i2c_addr   (i2c_data[15:8]), .i2c_data_w (i2c_data[7:0] ), .i2c_data_r (                ), .i2c_done   (i2c_done      ), .scl        (oled_scl      ), .sda        (oled_sda     ), .dri_clk    (i2c_dir_clk   )  );oled_ctrl oled_ctrl_u(.I_sys_clk    (i2c_dir_clk),.I_reset_n    (~sysRst      ),.I_i2c_done   (i2c_done   ),.O_i2c_data   (i2c_data   ),.O_i2c_exec   (i2c_exec   ),.O_rd_addr    (rd_addr    ),.I_ram_rd_data(ram_rd_data)
);endmodule

        可以看到顶层代码中,除了IIC接口,也具有一个RAM数据读接口。 i2c_dri 模块是OLED驱动模块,oled_ctrl模块用于读取BRAM数据写入OLED的控制模块,具体代码这里就不展示了,需要请移步第一章最后的开源地址。

三、PS端的python代码处理

PL端设计好之后PS端就很好设计的,主要分为一下几个步骤:

1、调用OpenCV库读取.mp4文件,逐帧解析;

2、将解析后的视频帧转换成OLED可以显示的数据;

3、将数据通过AXI总线写入BRAM

PS端代码如下:

#显示开机动画
video_path = '123.mp4';
cap = cv2.VideoCapture(video_path);  #创建VideoCapture对象
while True:ret, frame = cap.read()     #读一帧数据# 如果正确读取帧,ret为Trueif not ret:print("Error: No more frames to read.")breakgray_image = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)_, binary_image = cv2.threshold(gray_image, 170, 255, cv2.THRESH_BINARY)#变成numpy可以处理的数组numpy_image = np.array(binary_image)#获取转换后的数据re_Addr,re_Data = oled.oled_show(numpy_image)#写入oled显示缓存for i in range(0, 256):bram_ip.write(re_Addr[i],re_Data[i])

http://www.lryc.cn/news/400477.html

相关文章:

  • git批量删除本地包含某字符串的特定分支
  • Android中RecyclerView使用详解(一)
  • 坑3.上传图片(阿里云空间,oss验证)(未验证)
  • 注册登录后上传文件到本地数据库项目
  • 【学习笔记】无人机(UAV)在3GPP系统中的增强支持(十三)-更换无人机控制器
  • react 组件通信 —— 父子传值 【 函数式/类式 】
  • 【SpringBoot】95、SpringBoot中使用MyBatis-Plus实现自动加密存储和查询自动解密
  • [数仓]十二、离线数仓(Atlas元数据管理)
  • 机器学习——决策树(笔记)
  • 翁恺-C语言程序设计-08-1. 求一批整数中出现最多的个位数字
  • ROM修改进阶教程------深度解析小米设备锁机型不解锁bl 刷写特殊类固件的步骤
  • 论文翻译 | LEAST-TO-MOST: 从最少到最多的提示使大型语言模型中的复杂推理成为可能
  • 【区块链 + 智慧政务】都江堰区块链公共服务应用平台 | FISCO BCOS应用案例
  • Python从0到100(三十九):数据提取之正则(文末免费送书)
  • redis redisson(仅供自己参考)
  • 【C语言初阶】探索编程基础:深入理解分支与循环语句的奥秘
  • ERP基础知识
  • C++是否可以使用.获取union、struct中的成员变量的地址
  • 【前端】包管理器:npm、Yarn 和 pnpm 的全面比较
  • C++ 类和对象 赋值运算符重载
  • 【Python实战因果推断】35_双重差分6
  • 【HarmonyOS】关于官方推荐的组件级路由Navigation的心得体会
  • Spring中事件监听器
  • 案例|LabVIEW连接S7-1200PLC
  • 正点原子STM32(基于HAL库)6
  • flutter Android端权限
  • ant design form动态增减表单项Form.List如何进行动态校验规则
  • 7.16做题总结
  • unity使用 MQTT复现plant simulate仿真
  • MATLAB激光通信和-积消息传递算法(Python图形模型算法)模拟调制