板级调试小助手(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])
相关文章:
板级调试小助手(3)基于PYNQ的OLED视频显示
一、前言 在之前的文章中介绍了《板级调试小助手》的系统结构和DDS自定义外设的搭建。这篇文章主要介绍一下如何在PYNQ中驱动平时长剑的OLED12864显示屏,并显示BadApple(毕竟有屏幕的地方就要有BadApple)。效果如下: BadApple 本项…...
git批量删除本地包含某字符串的特定分支
git批量删除本地包含某字符串的特定分支 git branch -a | grep 分支中包含的字符串 | xargs git branch -D git删除本地分支_git查看删除本地分支-CSDN博客文章浏览阅读989次。git branch -d <分支名>可以通过: git branch 查看所有本地分支及其名字,然后删…...
Android中RecyclerView使用详解(一)
目录 概述优点列表布局RecyclerView一、创建RecyclerView并且在布局中绑定二、实现RecyclerView单个item的布局三、给RecyclerView写一个对应的适配器Adapter1.创建自定义的ViewHolder2.继承Adapter,泛型使用我们自定义的ViewHolder3.重写Adapter的三个方法onCreate…...
坑3.上传图片(阿里云空间,oss验证)(未验证)
笔记 20240710 未验证,现在还没有阿里云空间,等买个sit环境就可以验证一下。 前端 页面 <!--页面--> <el-form-item label"优惠券图片" prop"couponImg"><single-upload v-model"dataForm.couponImg"&g…...
注册登录后上传文件到本地数据库项目
在上一篇的基础上我有添加了登录注册功能文件上传 更新一下代码添加登录注册功能 app.js // app.js const express require(express); const bodyParser require(body-parser); const cors require(cors); const db require(./models/db); const User require(./models…...
【学习笔记】无人机(UAV)在3GPP系统中的增强支持(十三)-更换无人机控制器
引言 本文是3GPP TR 22.829 V17.1.0技术报告,专注于无人机(UAV)在3GPP系统中的增强支持。文章提出了多个无人机应用场景,分析了相应的能力要求,并建议了新的服务级别要求和关键性能指标(KPIs)。…...
react 组件通信 —— 父子传值 【 函数式/类式 】
1、函数式组件通信 父子间通信 —— 父传子 父组件 export default function father() {return (<div style{{width:400px,height:200px,background:pink,marginLeft:500px}}>我是父组件<hr /><Son name{"韩小刀"}/></div>) } 子组件 ex…...
【SpringBoot】95、SpringBoot中使用MyBatis-Plus实现自动加密存储和查询自动解密
有的业务需要将敏感数据加密存储到 DB,如果我们每个都手动去加密,再设值,再保存 DB,不仅麻烦,还对开发者不友好,在 MyBatis-Plus 中我们可以使用 BaseTypeHandler 来解决这个问题 1、新增 TypeHandler import com.baomidou.mybatisplus.core.toolkit.AES; import com.b…...
[数仓]十二、离线数仓(Atlas元数据管理)
第1章 Atlas入门 1.1 Atlas概述 Apache Atlas为组织提供开放式元数据管理和治理功能,用以构建其数据资产目录,对这些资产进行分类和管理,并为数据分析师和数据治理团队,提供围绕这些数据资产的协作功能。 Atlas的具体功能如下: 元数据分类 支持对元数据进行分类管理,例…...
机器学习——决策树(笔记)
目录 一、认识决策树 1. 介绍 2. 决策树生成过程 二、sklearn中的决策树 1. tree.DecisionTreeClassifier(分类树) (1)模型基本参数 (2)模型属性 (3)接口 2. tree.Decision…...
翁恺-C语言程序设计-08-1. 求一批整数中出现最多的个位数字
08-1. 求一批整数中出现最多的个位数字 给定一批整数,分析每个整数的每一位数字,求出现次数最多的个位数字。例如给定3个整数1234、2345、3456,其中出现最多次数的数字是3和4,均出现了3次。 输入格式: 输入在第1行中…...
ROM修改进阶教程------深度解析小米设备锁机型不解锁bl 刷写特殊类固件的步骤
在玩机过程中会遇到很多自己机型忘记密码或者手机号不用导致机型出现账号锁。无法正常使用。那么此类机型如果无法正常售后解锁。只能通过第三方渠道。例如在早期小米机型有强解bl锁资源。然后刷入完美解锁包。这种可以登陆新账号。但后期新机型只能通过修改分区来屏蔽原设备锁…...
论文翻译 | LEAST-TO-MOST: 从最少到最多的提示使大型语言模型中的复杂推理成为可能
摘要 思维链提示(Chain-of-thought prompting)在多种自然语言推理任务上展现了卓越的性能。然而,在需要解决的问题比提示中展示的示例更难的任务上,它的表现往往不佳。为了克服从简单到困难的泛化挑战,我们提出了一种新…...
【区块链 + 智慧政务】都江堰区块链公共服务应用平台 | FISCO BCOS应用案例
都江堰区块链公共服务应用平台是四川开源观科技有限公司运用 FISCO BCOS 区块链技术为都江堰市建设的市级 区块链节点平台,该平台上线运营一年以来已在政务服务、社区养老和慈善公益领域落地 3 个应用,上链数据超 过 30 万条。 区块链 政务服务应用&am…...
Python从0到100(三十九):数据提取之正则(文末免费送书)
前言: 零基础学Python:Python从0到100最新最全教程。 想做这件事情很久了,这次我更新了自己所写过的所有博客,汇集成了Python从0到100,共一百节课,帮助大家一个月时间里从零基础到学习Python基础语法、Pyth…...
redis redisson(仅供自己参考)
redis 通过setnx实现的分布式锁有问题 如图: 解决的新的工具为(闪亮登场):redisson redisson可重入锁的原理 实现语言lua: 加锁实现脚本语言: 释放锁的脚本语言: 加锁的lua -- 首先判断这个锁…...
【C语言初阶】探索编程基础:深入理解分支与循环语句的奥秘
📝个人主页🌹:Eternity._ ⏩收录专栏⏪:C语言 “ 登神长阶 ” 🤡往期回顾🤡:C语言入门 🌹🌹期待您的关注 🌹🌹 ❀分支与循环语句 📒1.…...
ERP基础知识
ERP 一、概述 ERP是Event-related Potentials的简称。外加一种特定的刺激,作用于感觉系统或脑 的某一部位,在给予刺激或撤销刺激时,或和当某种心理因素出现时在脑区所产生的电位变化,成为事件相关电位,是一种特殊…...
C++是否可以使用.获取union、struct中的成员变量的地址
C可以使用.获取union、struct中的成员变量的地址 示例代码如下所示 #include <stdio.h> #include <stdint.h>struct u128 { uint64_t v64; uint64_t v0; };int main() {union { unsigned __int128 ui; struct u128 s; } union_temp_m128;void* p1 &union_te…...
【前端】包管理器:npm、Yarn 和 pnpm 的全面比较
前端开发中的包管理器:npm、Yarn 和 pnpm 的全面比较 在现代前端开发中,包管理器是开发者必不可少的工具。它们不仅能帮我们管理项目的依赖,还能极大地提高开发效率。本文将详细介绍三种主流的前端包管理器:npm、Yarn 和 pnpm&am…...
基于uniapp+WebSocket实现聊天对话、消息监听、消息推送、聊天室等功能,多端兼容
基于 UniApp + WebSocket实现多端兼容的实时通讯系统,涵盖WebSocket连接建立、消息收发机制、多端兼容性配置、消息实时监听等功能,适配微信小程序、H5、Android、iOS等终端 目录 技术选型分析WebSocket协议优势UniApp跨平台特性WebSocket 基础实现连接管理消息收发连接…...
HTML前端开发:JavaScript 常用事件详解
作为前端开发的核心,JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例: 1. onclick - 点击事件 当元素被单击时触发(左键点击) button.onclick function() {alert("按钮被点击了!&…...
基于Springboot+Vue的办公管理系统
角色: 管理员、员工 技术: 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能: 该办公管理系统是一个综合性的企业内部管理平台,旨在提升企业运营效率和员工管理水…...
LangFlow技术架构分析
🔧 LangFlow 的可视化技术栈 前端节点编辑器 底层框架:基于 (一个现代化的 React 节点绘图库) 功能: 拖拽式构建 LangGraph 状态机 实时连线定义节点依赖关系 可视化调试循环和分支逻辑 与 LangGraph 的深…...
嵌入式常见 CPU 架构
架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集,单周期执行;低功耗、CIP 独立外设;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel(原始…...
沙箱虚拟化技术虚拟机容器之间的关系详解
问题 沙箱、虚拟化、容器三者分开一一介绍的话我知道他们各自都是什么东西,但是如果把三者放在一起,它们之间到底什么关系?又有什么联系呢?我不是很明白!!! 就比如说: 沙箱&#…...
es6+和css3新增的特性有哪些
一:ECMAScript 新特性(ES6) ES6 (2015) - 革命性更新 1,记住的方法,从一个方法里面用到了哪些技术 1,let /const块级作用域声明2,**默认参数**:函数参数可以设置默认值。3&#x…...
土建施工员考试:建筑施工技术重点知识有哪些?
《管理实务》是土建施工员考试中侧重实操应用与管理能力的科目,核心考查施工组织、质量安全、进度成本等现场管理要点。以下是结合考试大纲与高频考点整理的重点内容,附学习方向和应试技巧: 一、施工组织与进度管理 核心目标: 规…...
Linux安全加固:从攻防视角构建系统免疫
Linux安全加固:从攻防视角构建系统免疫 构建坚不可摧的数字堡垒 引言:攻防对抗的新纪元 在日益复杂的网络威胁环境中,Linux系统安全已从被动防御转向主动免疫。2023年全球网络安全报告显示,高级持续性威胁(APT)攻击同比增长65%,平均入侵停留时间缩短至48小时。本章将从…...
flow_controllers
关键点: 流控制器类型: 同步(Sync):发布操作会阻塞,直到数据被确认发送。异步(Async):发布操作非阻塞,数据发送由后台线程处理。纯同步(PureSync…...
