赞
踩
虽说回头再看的时候这东西很基础,但也是一开始花了些时间一点点啃下来的。勿忘初心。
总结gamma矫正模块的总体设计、详细设计及仿真测试、后期优化。
编写gamma矫正模块。
从BRAM数据源读取图像数据,进行gamma矫正,然后存入RAM中。
后期将RAM2接口改为AXIS型,只取RAM2_gamma模块,将其放入整个工程中。修改后的模块结构应为:
(接口对应工程中的前后两个模块分别为:alinx_ov5640_0,System_i)
Top:
功能:顶层模块,调用下面三个模块,加一个ila的IP核以实时仿真时探取信号
输入:clk,rst
Module1:
功能:存放图像数据源,导入.coe文件
输入:clk,rst_b 输出:dout_b
Module2:
功能:存放matlab计算结果,调取像素值相对应的gamma矫正结果
输入:clk,rst_g,din_g 输出:dout_g
Module3:
功能:存放矫正后的数据
输入:clk,rst_g,dina_a 输出:doutb_a
后期将Module2模块改为AXIS接口,则该模块应为:
RAM_gamma:
功能:存放matlab计算结果,调取像素值相对应的gamma矫正结果
输入:clk,resetn, 输出:
s_axis_gamma_rdata, m_axis_gamma_tdata,
s_axis_gamma_rvalid, m_axis_gamma_tvalid,
m_axis_gamma_rready, s_axis_gamma_tready,
s_axis_gamma_rlast, m_axis_gamma_tlast,
s_axis_gamma_ruser, m_axis_gamma_tuser,
s_axis_gamma_rkeep m_axis_gamma_tkeep
verilogHDL,c语言
Vivado 2017.4,modelsim,ALINX黑金AX7020开发板,matlab 2014
① 从matlab中提取图像的一维数组元素存入.COE文档;
src_path = 'rice.jpg';
I = imread(src_path);
x = I(:,:,1);
my_write(x,'E:\practice\gamma\RAM1.COE','%0.2x\n');
② 将文档中的数据作为数据源,存入RAM1中,RAM1选择single port ROM,导入.COE文件;
③ 在matlab上计算0~255之间所有整数的gamma矫正结果,并存入RAM2;
i = [0:1:255]; //生成0~255的整数数组
A = (i+0.5)/256; //归一化
f = A.^(1/2.2); //预补偿
s = f*256 - 0.5; //反归一化
r=round(s); //四舍五入取整
my_write(r,'E:\gamma.dat','%0.2x\n') //数据读出到.dat文档中
④ 将每个时钟周期从RAM1输出的数据作为地址在RAM2中查找计算结果;
⑤ RAM2输出的值存入到RAM3中,RAM3可选选择Block Memory Generator中的Simple Dual Port RAM。
⑥ 在testbench中导出RAM3中的数据:
//宏定义
define stor_file "E:/practice/gamma/out.dat"
//变量声明
integer fid1;
initial begin
//打开输出数据文件
fid1 = $fopen(`stor_file,"w");
end
//-----------导出输出数据----------
always@(posedge clk) begin
$fdisplay(fid1,"%x",doutb_a[7:0]);
end
⑦ 在top文件中加入IP核ila,探取需要知道的信号波形。这里举例探取dout_b和doutb_a信号。
ila_0 ila_0(
.clk(clk),
.probe0(dout_b),
.probe1(doutb_a)
);
⑧ 将top模块例化,加入到整个工程中去,clk和resetn分别对应工程中的FCLK_CLK1和FCLK- CLK1RESETN。在综合布线后生成bit文件,将bit文件名改为fpga.bit,替换板子上sd卡里 的bit文件。在vivado中open target,连接开发板,进行时序仿真。
⑨ 在matlab里对比分析matlab矫正的结果和verilog矫正的结果是否一致。
matlab代码:
src_path = 'rice.jpg'; gamma = 2.2 ; N = 256; S = 0.5; %读取数据 I = imread(src_path); %gamma矫正 i = double(I); A = (i + 0.5) / 256; F = A.^(1/gamma); B = F*N - S; b = uint8(B); %画图分析 figure; subplot(1, 2, 1); imshow(I, []); title('原图'); subplot(1, 2, 2); imshow(b, []); title('matlab处理后');
将verilog矫正后的数据提取出来,输出图像:
fid = fopen('out.dat');
a = textscan(fid,'%s'); %读取矫正后的数据
b = a{1}; %textscan生成的是cell型的数组
c = cell2mat(b); %cell转换为矩阵
d = hex2dec(c); %转为十进制
s = cat(3,d,d,d);
e = reshape(s,124,128,3); %重组回原图像的像素值
f = uint8(e); %强制转换为uint8的格式
imshow(f); %显示图像
title('verilog处理后');
⑩ 后期将RAM2改为AXIS型接口,单独作为一个模块整合进工程代码中。
① 将RAM3存储的处理后的数据与matlab处理后的数据对比
② 将上两组数据转化为图像,进行对比
① matlab correction:
Verilog correction:
② matlab:
Verilog:
modelsim仿真,ila的探针探取的结果与之前仿真结果对比
不足:仿真中波形为随机抓取,可以考虑将触发改为从地址0开始。
后期将RAM2接口改为AXIS型,只取RAM2_gamma模块,将其放入整个工程中。修改后的模块结构应为:
(接口对应工程中的前后两个模块分别为:alinx_ov5640_0,System_i)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。