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

FPGA图像处理(5)------ 图片水平镜像

利用bram形成双缓冲,如下图配置所示:

wr_flag 表明 buffer0写 还是 buffer1写             rd_flag 表明 buffer0读 还是 buffer1读

通过写入逻辑控制(结合wr_finish)  写哪个buffer ;写地址  进而控制ip的写使能

通过状态缓存来跳转buffer的写和读

通过读取逻辑(结合rd_finish)         读哪个buffer ;读地址

最后通过时序控制,调整输出数据及数据有效对齐

`timescale 1ns / 1ps
//
// Description: 水平镜像
//
module image_horizion_flip(input wire clk,input wire reset,input wire [10:0] img_width,input wire valid_i,input wire [23:0] data_i,output reg valid_o,output reg [23:0] data_o
);///有关写逻辑部分的变量申明
reg         wr_flag ;
reg [10:0]  addra   ;
//一行像素写入buffer结束标志
wire        wr_finish;
assign      wr_finish = (valid_i && (addra == img_width - 1))? 1'b1 : 1'b0;
//buffer0/1的写使能
wire        buffer0_wr, buffer1_wr; 
assign      buffer0_wr = valid_i&(~wr_flag);
assign      buffer1_wr = valid_i&wr_flag;///有关读逻辑部分的变量申明
reg         buffer0_status, buffer1_status;
//读数据使能         读取数据 缓存完一行,启动读数据。
wire        rd_en;
assign      rd_en = buffer0_status|buffer1_status;reg         rd_flag;
reg  [10:0] addrb;
//一行像素读出buffer结束标志
wire        rd_finish;
assign      rd_finish = rd_en&&(addrb == img_width - 1) ? 1'b1 : 1'b0;wire [23:0] buffer0_dout, buffer1_dout;
reg         rd_en_d;
reg         rd_flag_d;
///写入逻辑//
//写入地址,wr_flag等于0时,写入buffer0,等于1时,写入buffer1
always@(posedge clk or posedge reset) beginif(reset) beginwr_flag <= 0;addra   <= 0;end else beginwr_flag <= wr_finish ? ~wr_flag : wr_flag;addra   <= wr_finish ? 0 : (valid_i ? (addra + 1'b1) : addra);end
end/缓存状态保存///
//先判断buffer是否写满,写满开始读;继而判断是否读空,读空则开始写
always@(posedge clk or posedge reset) beginif(reset) beginbuffer0_status <= 0;buffer1_status <= 0;end else beginbuffer0_status <= ((~wr_flag) && wr_finish) ? 1'b1 :(((~rd_flag) && rd_finish) ? 1'b0 : buffer0_status);buffer1_status <= (wr_flag && wr_finish) ? 1'b1:((rd_flag && rd_finish) ? 1'b0 : buffer1_status);end
end /读取逻辑///
//读地址一般逻辑
always@(posedge clk or posedge reset) beginif(reset) beginaddrb   <= 0;rd_flag <= 0;end else beginaddrb   <= rd_en ? ((addrb == img_width - 1) ? 'b0 : addrb + 1'b1) : addrb;rd_flag <= rd_finish ? ~rd_flag : rd_flag;end
end 
//镜像读数据地址 水平镜像,从右往左
wire [10:0] addrb_flip;
assign      addrb_flip = img_width - 1 - addrb;bram_line_buffer u0 (.clka (clk         ),   // input wire clka.wea  (buffer0_wr  ),   // input wire [0 : 0] wea.addra(addra       ),   // input wire [10 : 0] addra.dina (data_i      ),   // input wire [23 : 0] dina.clkb (clk         ),   // input wire clkb.addrb(addrb_flip  ),   // input wire [10 : 0] addrb.doutb(buffer0_dout)    // output wire [23 : 0] doutb
);bram_line_buffer u1 (.clka (clk         ),   // input wire clka.wea  (buffer1_wr  ),   // input wire [0 : 0] wea.addra(addra       ),   // input wire [10 : 0] addra.dina (data_i      ),   // input wire [23 : 0] dina.clkb (clk         ),   // input wire clkb.addrb(addrb_flip  ),   // input wire [10 : 0] addrb.doutb(buffer1_dout)    // output wire [23 : 0] doutb
);//输出数据打一拍延时
always@(posedge clk or posedge reset) beginif(reset) beginrd_en_d <= 0;rd_flag_d <= 0;end else beginrd_en_d <= rd_en;rd_flag_d <= rd_flag;endend 
//输出
always@(posedge clk or posedge reset) beginif(reset) beginvalid_o <= 0;data_o <= 0;end else beginvalid_o <= rd_en_d;data_o <= rd_flag_d ? buffer1_dout : buffer0_dout;end
end    endmodule

 

相关文章:

FPGA图像处理(5)------ 图片水平镜像

利用bram形成双缓冲&#xff0c;如下图配置所示&#xff1a; wr_flag 表明 buffer0写 还是 buffer1写 rd_flag 表明 buffer0读 还是 buffer1读 通过写入逻辑控制(结合wr_finish) 写哪个buffer &#xff1b;写地址 进而控制ip的写使能 通过状态缓存来跳转buffer的…...

[python] 类

一 介绍 具有相同属性和行为的事物的通称,是一个抽象的概念 三要素: 类名,属性&#xff0c;方法 格式: class 类名: 代码块 class Pepole:name "stitchcool"def getname(self):return self.name 1.1 创建对象(实例化) 格式: 对象名 类名() p1 Pepole()…...

day21python打卡

知识点回顾&#xff1a; LDA线性判别PCA主成分分析t-sne降维 还有一些其他的降维方式&#xff0c;也就是最重要的词向量的加工&#xff0c;我们未来再说 作业&#xff1a; 自由作业&#xff1a;探索下什么时候用到降维&#xff1f;降维的主要应用&#xff1f;或者让ai给你出题&…...

Android开发-Activity启停

在Android应用开发中&#xff0c;Activity是构建用户界面的基本组件之一。它代表了一个单一的、专注的操作&#xff0c;比如查看一张图片或者撰写一封电子邮件。每个Activity都有其生命周期&#xff0c;从创建到销毁&#xff0c;会经历一系列的状态变化。了解并正确管理这些状态…...

ERP学习(一): 用友u8安装

安装&#xff1a; https://www.bilibili.com/video/BV1Pp4y187ot/?spm_id_from333.337.search-card.all.click&vd_sourced514093d85ee628d1f12310b13b1e59b 我个人用vmware16&#xff0c;这位up已经把用友软件和环境&#xff08;sqlserver2008&#xff09; 都封城vmx文件了…...

01 | 大模型微调 | 从0学习到实战微调 | AI发展与模型技术介绍

一、导读 作为非AI专业技术开发者&#xff08;我是小小爬虫开发工程师&#x1f60b;&#xff09; 本系列文章将围绕《大模型微调》进行学习&#xff08;也是我个人学习的笔记&#xff0c;所以会持续更新&#xff09;&#xff0c;最后以上手实操模型微调的目的。 (本文如若有…...

海康相机无损压缩

设置无损压缩得到更高的带宽和帧率&#xff01;...

从机器人到调度平台:超低延迟RTMP|RTSP播放器系统级部署之道

✅ 一、模块定位&#xff1a;跨平台、超低延迟、系统级稳定的音视频直播播放器内核 在无人机、机器人、远程操控手柄等场景中&#xff0c;低延迟的 RTSP/RTMP 播放器并不是“可有可无的体验优化”&#xff0c;而是系统能否闭环、操控是否安全的关键组成。 Windows和安卓播放RT…...

研发效率破局之道阅读总结(5)管理文化

研发效率破局之道阅读总结(5)管理文化 Author: Once Day Date: 2025年5月10日 一位热衷于Linux学习和开发的菜鸟&#xff0c;试图谱写一场冒险之旅&#xff0c;也许终点只是一场白日梦… 漫漫长路&#xff0c;有人对你微笑过嘛… 全系列文章可参考专栏: 程序的艺术_Once-Day…...

单因子实验 方差分析

本文是实验设计与分析&#xff08;第6版&#xff0c;Montgomery著傅珏生译)第3章单因子实验 方差分析python解决方案。本文尽量避免重复书中的理论&#xff0c;着于提供python解决方案&#xff0c;并与原书的运算结果进行对比。您可以从 下载实验设计与分析&#xff08;第6版&a…...

一、ArkTS语法学习

一、ArkTS语法学习 1 ArkTS语法简介2 声明2.1 变量声明2.2 常量声明2.3 自动类型推断 3 类型3.1 基本类型和引用类型3.2 基本数据类型3.2.1 number类型3.2.2 boolean类型3.2.3 string类型3.2.4 void类型 3.3 引用类型3.3.1 Object类型3.3.2 arry类型3.3.3 enum类型3.3.4 Union类…...

MySQL 1366 - Incorrect string value:错误

MySQL 1366 - Incorrect string value:错误 错误如何发生发生原因&#xff1a; 解决方法第一种尝试第二种尝试 错误 如何发生 在给MySQL添加数据的时候发生了下面的错误 insert into sys_dept values(100, 0, 0, 若依科技, 0, 若依, 15888888888, ryqq.com, 0,…...

Bitacora:基因组组件中基因家族识别和注释的综合工具

软件教程 | Bitacora&#xff1a;基因组组件中基因家族识别和注释的综合工具 https://zhangzl96.github.io/tags#生物信息工具) &#x1f4c5; 官方地址&#xff1a;https://github.com/molevol-ub/bitacora &#x1f52c; 教程版本&#xff1a;BITACORA 1.4 &#x1f4cb; …...

【WebRTC-13】是在哪,什么时候,创建编解码器?

Android-RTC系列软重启&#xff0c;改变以往细读源代码的方式 改为 带上实际问题分析代码。增加实用性&#xff0c;方便形成肌肉记忆。同时不分种类、不分难易程度&#xff0c;在线征集问题切入点。 问题&#xff1a;编解码器的关键实体类是什么&#xff1f;在哪里&什么时候…...

青少年编程与数学 02-019 Rust 编程基础 01课题、环境准备

青少年编程与数学 02-019 Rust 编程基础 01课题、环境准备 一、Rust核心特性应用场景开发工具社区与生态 二、Rust 和 Python 比较1. **内存安全与并发编程**2. **性能**3. **零成本抽象**4. **跨平台支持**5. **社区与生态系统**6. **错误处理**7. **安全性**适用场景总结 三、…...

Redis持久化存储介质评估:NFS与Ceph的适用性分析

#作者&#xff1a;朱雷 文章目录 一、背景二、Redis持久化的必要性与影响1. 持久化的必要性2. 性能与稳定性问题 三、NFS作为持久化存储介质的问题1. 性能瓶颈2. 数据一致性问题3. 存储服务单点故障4. 高延迟影响持久化效率.5. 吞吐量瓶颈 四、Ceph作为持久化存储介质的问题1.…...

Ceph 原理与集群配置

一、Ceph 工作原理 1.1.为什么学习 Ceph&#xff1f; 在学习了 NFS 存储之后&#xff0c;我们仍然需要学习 Ceph 存储。这主要是因为不同的存储系统适用于不同的场景&#xff0c;NFS 虽然有其适用之处&#xff0c;但也存在一定的局限性。而 Ceph 能够满足现代分布式、大规模、…...

MYSQL中的RR隔离级别实现原理,它是如何解决不可重复读

在数据库管理系统中&#xff0c;RR&#xff08;Repeatable Read&#xff09;隔离级别是为了保证在一个事务执行期间&#xff0c;多次读取同一数据时&#xff0c;所读取的数据值始终保持一致&#xff0c;从而避免了不可重复读的问题。不可重复读的问题指的是&#xff0c;在同一个…...

Linux的web服务器的部署和优化

http中访问请求中I/O结构 在HTTP协议中&#xff0c;I/O&#xff08;输入/输出&#xff09;结构主要涉及客户端与服务器之间的请求和响应交互。以下是HTTP请求和响应的基本结构及其关键组成部分&#xff1a; HTTP请求结构 HTTP请求由请求行、请求头和请求体三部分组成 请求行…...

天线的PCB设计

目录 天线模块设计的重要性 天线模块的PCB设计 天线模块设计的重要性 当智能手表突然断连、无人机信号飘忽不定——你可能正在经历一场来自天线模块的"无声抗议"。这个隐藏在电子设备深处的关键组件&#xff0c;就像数字世界的隐形信使&#xff0c;用毫米级的精密结…...

C++笔记-set和map的使用(包含multiset和multimap的讲解)

1.序列式容器和关联式容器 前面我们已经接触过STL中的部分容器如:string、vector、list、deque、array、forward_list等&#xff0c;这些容器统称为序列式容器&#xff0c;因为逻辑结构为线性序列的数据结构&#xff0c;两个位置存储的值之间一般没有紧密的关联关系&#xff0…...

宝蓝德中间件部署war包时,配置的绝对路径读取错误。

文章目录 问题场景解决办法宝蓝德是什么&#xff1f;&#xff1f;一、基础环境与依赖配置二、自动化部署工具链三、高可用性与集群配置四、安全与合规性措施五、产品线差异化部署六、典型部署流程示例七、运维与优化 原因1. 明确“当前工作目录”与“绝对路径”的关系2. 问题根…...

Linux `ifconfig` 指令深度解析与替代方案指南

Linux `ifconfig` 指令深度解析与替代方案指南 一、核心功能与现状1. 基础作用2. 版本适配二、基础语法与常用操作1. 标准语法2. 常用操作速查显示所有接口信息启用/禁用接口配置IPv4地址修改MAC地址(临时)三、高级配置技巧1. 虚拟接口创建2. MTU调整3. 多播配置4. ARP控制四…...

Python pandas 向excel追加数据,不覆盖之前的数据

最近突然看了一下pandas向excel追加数据的方法&#xff0c;发现有很多人出了一些馊主意&#xff1b; 比如用concat,append等方法&#xff0c;这种方法的会先将旧数据df_1读取到内存&#xff0c;再把新数据df_2与旧的合并&#xff0c;形成df_new,再覆盖写入&#xff0c;消耗和速…...

【金仓数据库征文】政府项目数据库迁移:从MySQL 5.7到KingbaseES的蜕变之路

摘要&#xff1a;本文详细阐述了政府项目中将 MySQL 5.7 数据库迁移至 KingbaseES 的全过程&#xff0c;涵盖迁移前的环境评估、数据梳理和工具准备&#xff0c;迁移实战中的数据源与目标库连接配置、迁移任务详细设定、执行迁移与过程监控&#xff0c;以及迁移后的质量验证、系…...

Go语言——goflow工作流使用

一、引入依赖 这个很坑&#xff0c;他不允许连接带密码的redis&#xff0c;只能使用不带密码的redis&#xff0c;要带密码的话得自己改一下源代码&#xff0c;无语 go get github.com/s8sg/goflow二、画出我们的工作流程 三、编写代码 package mainimport ("encoding/j…...

yarn npm pnpm

1 下载方式 npm 之前串行下载 现在并行下载 yarn 并行下载 加入缓存复用 pnpm 硬连接 避免重复下载&#xff0c;先检查本地是否存在&#xff0c;存在的话直接连接过去...

Block Styler——字符串控件

字符串控件的应用 参考官方帮助案例&#xff1a;&#xff08;这个方式感觉更好&#xff0c;第二种方式也可以&#xff09;E:\NX1980\UGOPEN\SampleNXOpenApplications\C\BlockStyler\ColoredBlock 普通格式&#xff1a; 读取&#xff1a; //方法一 string0->GetProperti…...

LangGraph(三)——添加记忆

目录 1. 创建MemorySaver检查指针2. 构建并编译Graph3. 与聊天机器人互动4. 问一个后续问题5. 检查State参考 1. 创建MemorySaver检查指针 创建MemorySaver检查指针&#xff1a; from langgraph.checkpoint.memory import MemorySavermemory MemorySaver()这是位于内存中的检…...

【无标题】I/O复用(epoll)三者区别▲

一、SOCKET-IO复用技术 定义&#xff1a;SOCKET - IO复用技术是一种高效处理多个套接字&#xff08;socket&#xff09;的手段&#xff0c;能让单个线程同时监听多个文件描述符&#xff08;如套接字&#xff09;上的I/O事件&#xff08;像可读、可写、异常&#xff09;&#x…...