FPGA纯verilog代码实现图像对数变换,提供工程源码和技术支持
目录
- 1、图像对数变换理论
- 2、log系数的matlab生成
- 3、FPGA实现图像对数变换
- 4、vivado与matlab联合仿真
- 5、vivado工程介绍
- 6、上板调试验证并演示
- 7、福利:工程代码的获取
1、图像对数变换理论
对数变换可以将图像的低灰度值部分扩展,显示出低灰度部分更多的细节,将其高灰度值部分压缩,减少高灰度值部分的细节,从而达到强调图像低灰度部分的目的。
图像对数变换一般公式为:g = c*log(1 + f)
其中 c 为常数系数,f 为像素值范围 0~255。
如图所示,对数曲线在像素值较低的区域斜率较大,像素值较高的区域斜率比较低,所以图像经过对数变换之后,在较暗的区域对比度将得到提升,因而能增强图像暗部的细节。
2、log系数的matlab生成
由g = c*log(1 + f)公式可知,只要给出系数c,就能得到log系数,但对数计算不是FPGA的长项,所以使用matlab生成,并转换为.coe 文件
matlab部分代码如下:完整代码请看到文章最后;
clear;clear all;clc;% g = c*log(1 + f) num = 256;f = [0:1:255]; c =40;g = c*log(1+f);%=================================================================
%创建coe文件保存参数
fid = fopen('log_para_256.coe','w');fprintf(fid,'memory_initialization_radix = 10;\n');
fprintf(fid,'memory_initialization_vector =\n');
再经系数用verilog代码固化到rom,形成一个log系数查找表;
3、FPGA实现图像对数变换
既然已经有了log系数查找表,那么只需要将图像像素数据与查找表逐一对应输出即可,这是FPGA的强项,FPGA图像对数变换顶层代码如下:
module helai_log_algorithm (input i_vid_hs ,input i_vid_vs ,input i_vid_de ,input [7:0] i_vid_rgb , output o_vout_hs ,output o_vout_vs ,output o_vout_de ,output [7:0] o_vout_rgb,
);//同步输出使能信号assign o_vout_hs = i_vid_hs;assign o_vout_vs = i_vid_vs;assign o_vout_de = i_vid_de;helai_log_para r_log_para(.addra(i_vid_rgb[23:16]),.doutao_vout_rgb([23:16])
);helai_log_para g_log_para(.addra(i_vid_rgb[15:8]),.doutao_vout_rgb([15:8])
);helai_log_para g_log_para(.addra(i_vid_rgb[7:0]),.doutao_vout_rgb([7:0])
);endmodule
4、vivado与matlab联合仿真
仿真结果如下:
这张图的暗黑区域很少,只有我女友黑色秀发区域,可以看到输出图像整体变白了;
在看另一组仿真:
这张图原图是黑夜,对数变换后的图像就很明显了;
5、vivado工程介绍
工程设计思路和框架如下:
HDMI输入和输出由编解码器由Silion Image 公 司的SIL9013和SIL9134完成,芯片工作需要iic配置,关于SIL9013和SIL9134的使用和配置,请参考我之前写的文章点击查看:SIL9013和SIL9134的使用和配置
数据采集后经FDMA将通过AXI总线图像写入到DDR3做3帧缓存再输出,关于FDMA三帧缓存,请参考我之前写的文章点击查看:FDMA三帧缓存方案
工程BD如下:
代码架构如下:
顶层代码如下:
`timescale 1ns / 1ps
//
// Company:
// Engineer:
//
// Create Date: 2022/12/12 21:42:17
// Design Name:
// Module Name: top
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//module top(
//ddr3output [14:0]DDR3_0_addr,output [2:0]DDR3_0_ba ,output DDR3_0_cas_n ,output [0:0]DDR3_0_ck_n ,output [0:0]DDR3_0_ck_p ,output [0:0]DDR3_0_cke ,output [0:0]DDR3_0_cs_n ,output [3:0]DDR3_0_dm ,inout [31:0]DDR3_0_dq ,inout [3:0]DDR3_0_dqs_n ,inout [3:0]DDR3_0_dqs_p ,output [0:0]DDR3_0_odt ,output DDR3_0_ras_n ,output DDR3_0_reset_n ,output DDR3_0_we_n , input CLK_IN1_D_0_clk_n,input CLK_IN1_D_0_clk_p,output ddr3_ok ,
//hdmi_inoutput hdmi_in_nreset , //9011/9013 resetinput vin_clk , //clock for 9111/9013input vin_hs , //horizontal synchronization for 9011/9013input vin_vs , //vertical synchronization for 9011/9013input vin_de , //data valid for 9011/9013input[23:0] vin_data , //data for 9011/9013inout hdmi_scl , //HDMI I2C clockinout hdmi_sda , //HDMI I2C dataoutput hdmi_nreset , //9134 reset
//hdmi_outoutput vout_hs , //horizontal synchronization for 9134output vout_vs , //vertical synchronization for 9134output vout_de , //data valid for 9134output vout_clk , //clock for 9134output[23:0] vout_data //data for 9134
);wire clk_200m ;
wire clk_hdmi ;
wire pll_resetn;
wire [0:0] resetn;
wire ud_r_0_ud_rclk;
wire [31:0] ud_r_0_ud_rdata;
wire ud_r_0_ud_rde;
wire ud_r_0_ud_rvs;
wire ud_w_0_ud_wclk;
wire [31:0] ud_w_0_ud_wdata;
wire ud_w_0_ud_wde;
wire ud_w_0_ud_wvs;
wire ui_clk_100m;wire [9:0] lut_index;
wire [31:0] lut_data; wire [23:0] log_rgb;
wire [23:0] i_rgb;
wire o_hs ;
wire o_vs ;
wire o_de ;
wire [23:0] o_rgb;
wire hdmi_clk_rstn;
assign hdmi_nreset =pll_resetn;
assign hdmi_in_nreset=pll_resetn;
assign ud_w_0_ud_wclk =vin_clk ;
assign ud_w_0_ud_wvs =vin_vs ;
assign ud_w_0_ud_wde =vin_de ;
assign ud_w_0_ud_wdata=vin_data;
assign ud_r_0_ud_rclk=clk_hdmi;
assign ud_r_0_ud_rvs=o_vs;
assign ud_r_0_ud_rde=o_de;
assign i_rgb=ud_r_0_ud_rdata[23:0];
assign vout_clk=clk_hdmi;
assign vout_hs=o_hs;
assign vout_vs=o_vs;
assign vout_de=o_de;
assign vout_data=o_rgb;i2c_config i2c_config_m0(
.rst (~pll_resetn ),
.clk (clk_200m ),
.clk_div_cnt (16'd500 ),
.i2c_addr_2byte (1'b0 ),
.lut_index (lut_index ),
.lut_dev_addr (lut_data[31:24]),
.lut_reg_addr (lut_data[23:8] ),
.lut_reg_data (lut_data[7:0] ),
.error ( ),
.done ( ),
.i2c_scl (hdmi_scl ),
.i2c_sda (hdmi_sda )
);lut_hdmi lut_hdmi_m0
(
.lut_index (lut_index),
.lut_data (lut_data )
);design_1_wrapper u_design_1_wrapper(.CLK_IN1_D_0_clk_n(CLK_IN1_D_0_clk_n),.CLK_IN1_D_0_clk_p(CLK_IN1_D_0_clk_p),.DDR3_0_addr (DDR3_0_addr ),.DDR3_0_ba (DDR3_0_ba ),.DDR3_0_cas_n (DDR3_0_cas_n ),.DDR3_0_ck_n (DDR3_0_ck_n ),.DDR3_0_ck_p (DDR3_0_ck_p ),.DDR3_0_cke (DDR3_0_cke ),.DDR3_0_cs_n (DDR3_0_cs_n ),.DDR3_0_dm (DDR3_0_dm ),.DDR3_0_dq (DDR3_0_dq ),.DDR3_0_dqs_n (DDR3_0_dqs_n ),.DDR3_0_dqs_p (DDR3_0_dqs_p ),.DDR3_0_odt (DDR3_0_odt ),.DDR3_0_ras_n (DDR3_0_ras_n ),.DDR3_0_reset_n (DDR3_0_reset_n ),.DDR3_0_we_n (DDR3_0_we_n ),.clk_200m (clk_200m ),.clk_hdmi (clk_hdmi ),.ddr3_ok (ddr3_ok ),.pll_resetn (pll_resetn ),.resetn (resetn ),.ud_r_0_ud_rclk (ud_r_0_ud_rclk ),.ud_r_0_ud_rdata (ud_r_0_ud_rdata ),.ud_r_0_ud_rde (ud_r_0_ud_rde ),.ud_r_0_ud_rempty (ud_r_0_ud_rempty ),.ud_r_0_ud_rvs (ud_r_0_ud_rvs ),.ud_w_0_ud_wclk (ud_w_0_ud_wclk ),.ud_w_0_ud_wdata (ud_w_0_ud_wdata ),.ud_w_0_ud_wde (ud_w_0_ud_wde ),.ud_w_0_ud_wfull (ud_w_0_ud_wfull ),.ud_w_0_ud_wvs (ud_w_0_ud_wvs ),.ui_clk_100m (ui_clk_100m )); helai_log_algorithm u_helai_log_algorithm(.i_vid_hs (),.i_vid_vs (),.i_vid_de (),.i_vid_rgb (i_rgb), .o_vout_hs (),.o_vout_vs (),.o_vout_de (),.o_vout_rgb(log_rgb)
);video_timing_control vga(.i_clk (clk_hdmi ), .i_rst_n(pll_resetn ), .i_rgb (log_rgb ),.o_hs (o_hs ),.o_vs (o_vs ),.o_de (o_de ),.o_rgb (o_rgb ),.o_x_pos(),.o_y_pos()
);
endmodule
6、上板调试验证并演示
FPGA纯verilog代码实现图像对数变换,提供工程源码和
7、福利:工程代码的获取
福利:工程代码的获取
代码太大,无法邮箱发送,以某度网盘链接方式发送,
资料获取方式:私,或者文章末尾的V名片。
网盘资料如下:
FPGA纯verilog代码实现图像对数变换,提供工程源码和技术支持相关推荐
- FPGA驱动24C04实现读写操作,提供工程源码和技术支持
目录 1.24c04芯片手册解读 2.纯verilog的i2c驱动 3.24c04读写状态机设计 4.上板调试验证 5.福利:工程源码获取 1.24c04芯片手册解读 24c04芯片手册很简单,原理图 ...
- FPGA纯Verilog实现任意尺寸图像缩放,串口指令控制切换,贴近真实项目,提供工程源码和技术支持
目录 1.前言 2.目前主流的FPGA图像缩放方案 3.本方案的优越性 4.详细设计方案 5.vivado工程详解 6.上板调试验证并演示 7.福利:工程源码获取 1.前言 代码使用纯verilog实 ...
- FPGA纯vhdl实现MIPI CSI2 RX 4K视频解码输出,OV13850采集,提供工程源码和技术支持
目录 1.前言 2.Xilinx官方主推的MIPI解码方案 3.纯Vhdl方案解码MIPI 4.vivado工程介绍 5.上板调试验证 6.福利:工程代码的获取 1.前言 FPGA图像采集领域目前协议 ...
- FPGA实现CSI-2 解码MIPI视频 2line 720P分辨率 OV5647采集 提供工程源码和技术支持
目录 1.前言 2.Xilinx官方主推的MIPI解码方案 3.纯Vhdl方案解码MIPI 4.vivado工程介绍 5.上板调试验证 6.福利:工程代码的获取 1.前言 FPGA图像采集领域目前协议 ...
- FPGA找工作写简历,你离高薪offer只差一个高端项目,提供工程源码和技术支持
这里写目录标题 1.前言 2.你或许很菜 3.工程源码 4.技术支持 5.工程源码和技术支持获取方式 1.前言 如果你是即将毕业的学生或是想转行做FPGA的工程师,你都会面临一个问题,那就是找工作,找 ...
- FPGA实现JPEG-LS图像压缩,有损无损可配置,提供工程源码和技术支持
目录 1.前言 2.JPEG-LS图像压缩理论 3.JPEG-LS图像压缩性能介绍 4.JPEG-LS图像压缩时序介绍 5.JPEG-LS图像压缩输出压缩流 6.工程源码和仿真 7.福利:工程代码的获 ...
- FPGA解码4line MIPI视频 IMX291/IMX290摄像头采集 提供工程源码和技术支持
目录 1.前言 2.Xilinx官方主推的MIPI解码方案 3.我已有的MIPI解码方案 4.纯Vhdl代码解码MIPI 5.vivado工程介绍 6.上板调试验证 7.福利:工程代码的获取 1.前言 ...
- FPGA使用GTX实现SFP光纤收发SDI视频 全网首创略显高端 提供工程源码和技术支持
目录 1.前言 2.设计思路和框架 3.vivado工程详解 4.上板调试验证并演示 5.福利:工程代码的获取 1.前言 FPGA实现SDI视频编解码目前有两种方案: 一是使用专用编解码芯片,比如典型 ...
- FPGA实现MPEG2视频压缩 提供工程源码和技术支持
1.前言 MJPEG.MPEG2.MPEG4.H264 是流行且兼容性很高的 4 种视频编码格式.其中 MJPEG 对每帧独立进行 JPEG 图象压缩,而不利用帧间相关性,因此压缩效果较差. MPEG ...
最新文章
- 微型计算机的什么接口主要作为打印机接口,微型计算机及其接口技术试题及答案(2006年10月)...
- 通过脚本禁用域内XP自带防火墙(附收集报告功能)
- JDK7和JDK9流中异常的处理
- DokuWiki的发现之旅
- CODE[VS] 1474 十进制转m进制
- 【第六课】Smart 3d常见问题集锦
- linux手机刷机包制作工具_安卓10刷机包
- 基于北斗卫星的输电杆塔在线监测系统
- linux cat用法退出,Linux常用命令 - cat命令用法详解
- Buck-Boost电路
- 10个超实用的小程序,你一定用得到!
- 短期出差北京个人所见所闻所感
- 基数排序-LSD-golang
- 力扣刷题 DAY_83 贪心
- 每一天的邂逅......
- 如何快速撰写文章—伪原创
- 【学生管理系统】班级管理
- tomcat 启动时报错:To prevent a memory leak, the JDBC Driver has been forcibly unregistered
- linux抓包pppoe,pppoe抓包流程和拨号流程
- knockoutjs中的visible绑定
热门文章
- 前端权限设计实现——按钮级
- EBS INV 计算现有量(标准API)、保留量、可用量 ---根据批次、库存组织、子库
- 迪文DWIN串口屏的使用经验分享(最新添加了T5L新产品体验)
- 计算机bios无法进入安全模式,电脑安全模式进不去怎么办 电脑安全模式进不去解决方法【图文】...
- 电机与拖动 - 2 变压器
- unity中使用的3D模型类型
- 微软暑期实习面试总结
- bootstrap 表格 ajax,bootstrap-table实现ajax分页
- QQ直接跳过原手机验证更换密保手机和绑定手机号
- 计算机网络:网络层的功能概述