版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_46621272/article/details/126439519
System Verilog 视频缩放图像缩放 vivado 仿真
文章目录
- System Verilog 视频缩放图像缩放 vivado 仿真
- 前言
- 一、Verilog 图像视频临近缩小算法仿真,代码大部分采用 Syetem Verilog 语言编写。
- 1. testbench 逻辑框图
- 2. testbench 激励文件 video_scale_down_near_testbench.sv System verilog 代码
- 3. [图片文件产生视频数据流 bmp_for_videoStream.sv verilog 代码](https://blog.csdn.net/qq_46621272/article/details/126441071)
- 4. [临近缩小 video_scale_down_near.sv verilog 代码](https://blog.csdn.net/qq_46621272/article/details/120917913)
- 5. [临近缩放 video_scale_near_v1.sv 代码](https://blog.csdn.net/qq_46621272/article/details/126520389)
- 6. [将视频流输出写入 BMP 图片文件 bmp_to_videoStream.sv verilog 代码](https://blog.csdn.net/qq_46621272/article/details/126441149)
- 7. [用 C 语言编写的临近缩放算法](https://blog.csdn.net/qq_46621272/article/details/126459136)
- 二、部分图像视频算法效果图片。
- 三、系列文章陆续更新相关连接
- 四、下载链接
前言
- Verilog 做图像视频算法仿真时,只能看见相关波形,不能直观查看计算后的图像视频效果。本文以临近缩放算法为例,用 BMP 图片文件代替视频数据来做图像视频缩放算法仿真。最终输出缩放后的 BMP 图片文件。可以通过查看图片的办法直观显示图像缩放算法产生的效果。本文中阐述的仿真环境适合很多采用 Verilog FPGA 实现的视频图像算法的仿真。比如各种视频缩放、旋转、拉伸等算法,比如视频滤波、降噪等算法。
一、Verilog 图像视频临近缩小算法仿真,代码大部分采用 Syetem Verilog 语言编写。
1. testbench 逻辑框图
2. testbench 激励文件 video_scale_down_near_testbench.sv System verilog 代码
- 本仿真激励文件,运行后能产生十几张不同缩放比例的图片,运行时间大概几分钟时间。
//video_scale_down_near_testbench.sv
`timescale 1ns/100ps
module video_scale_down_near_testbench;
reg rst_n;
reg vclk;
reg frame_sync_n;
parameter RESET_PERIOD = 1000000.00;
parameter FRAME_H_PERIOD = 16*1000*1000; //16ms
parameter FRAME_L_PERIOD = 60*1000; //60us
parameter VIN_CLK_PERIOD_A = 10; //100MHz
initial vclk = 0;
always vclk = #(VIN_CLK_PERIOD_A/2.0) ~vclk;
initial begin
#0 frame_sync_n = 1;
#RESET_PERIOD frame_sync_n = 0; // 16.7ms 帧脉冲
while(1)
begin
#FRAME_L_PERIOD frame_sync_n = 1;
#FRAME_H_PERIOD frame_sync_n = 0;
end
end
initial begin
rst_n = 0;
#RESET_PERIOD
rst_n = 1;
end
logic [23:0] v1_dat;
logic v1_valid;
logic v1_ready;
logic [15:0] v1_xres;
logic [15:0] v1_yres;
logic [23:0] v2_dat;
logic v2_valid;
logic v2_ready;
logic [15:0] v2_xres;
logic [15:0] v2_yres;
parameter VIN_BMP_FILE = "vin.bmp";
parameter VIN_BMP_PATH = "../../../../../";
parameter VOUT_BMP_PATH = {VIN_BMP_PATH,"vouBmpV/"};//"../../../../../vouBmpV/";
bmp_to_videoStream #
(
.iBMP_FILE_PATH (VIN_BMP_PATH),
.iBMP_FILE_NAME (VIN_BMP_FILE)
)
u01
(
.clk (vclk),
.rst_n (rst_n),
.vout_dat (v1_dat), //视频数据
.vout_valid (v1_valid), //视频数据有效
.vout_ready (v1_ready), //准备好
.frame_sync_n (frame_sync_n), //视频帧同步复位,低有效
.vout_xres (v1_xres), //视频水平分辨率
.vout_yres (v1_yres) //视频垂直分辨率
);
video_scale_down_near u02
(
.vin_clk (vclk),
.rst_n (rst_n),
.frame_sync_n (frame_sync_n), //输入视频帧同步复位,低有效
.vin_dat (v1_dat), //输入视频数据
.vin_valid (v1_valid), //输入视频数据有效
.vin_ready (v1_ready), //输入准备好
.vout_dat (v2_dat), //输出视频数据
.vout_valid (v2_valid), //输出视频数据有效
.vout_ready (v2_ready), //输出准备好
.vin_xres (v1_xres), //输入视频水平分辨率
.vin_yres (v1_yres), //输入视频垂直分辨率
.vout_xres (v2_xres), //输出视频水平分辨率
.vout_yres (v2_yres) //输出视频垂直分辨率
);
bmp_for_videoStream #
(
.iREADY (7), //插入 0-10 级流控信号, 10 是满级全速无等待
.iBMP_FILE_PATH (VOUT_BMP_PATH)
)
u03
(
.clk (vclk),
.rst_n (rst_n),
.vin_dat (v2_dat), //视频数据
.vin_valid (v2_valid), //视频数据有效
.vin_ready (v2_ready), //准备好
.frame_sync_n (frame_sync_n), //视频帧同步复位,低有效
.vin_xres (v2_xres), //视频水平分辨率
.vin_yres (v2_yres) //视频垂直分辨率
);
// assign v2_xres = v1_xres-1;//*1.3;
// assign v2_yres = v1_yres-1;//*1.1; //0.13,0.22,0.32,0.41,0.52,0.61,0.83,0.99
logic [15:0] fn = 0;
always_ff@(negedge frame_sync_n)
begin
fn <= #1 fn + 1;
case(fn)
0: begin v2_xres <= #1 v1_xres/1 - 0; v2_yres <= #1 v1_yres/1 - 0; end
1: begin v2_xres <= #1 v1_xres/1 - 1; v2_yres <= #1 v1_yres/1 - 1; end
2: begin v2_xres <= #1 v1_xres/2 + 1; v2_yres <= #1 v1_yres/2 + 1; end
3: begin v2_xres <= #1 v1_xres/2 + 0; v2_yres <= #1 v1_yres/2 + 0; end
4: begin v2_xres <= #1 v1_xres/2 - 1; v2_yres <= #1 v1_yres/2 - 1; end
5: begin v2_xres <= #1 v1_xres/3 + 1; v2_yres <= #1 v1_yres/3 + 1; end
6: begin v2_xres <= #1 v1_xres/3 + 0; v2_yres <= #1 v1_yres/3 + 0; end
7: begin v2_xres <= #1 v1_xres/3 - 1; v2_yres <= #1 v1_yres/3 - 1; end
8: begin v2_xres <= #1 v1_xres/5 + 1; v2_yres <= #1 v1_yres/5 + 1; end
9: begin v2_xres <= #1 v1_xres/5 + 0; v2_yres <= #1 v1_yres/5 + 0; end
10: begin v2_xres <= #1 v1_xres/5 - 1; v2_yres <= #1 v1_yres/5 - 1; end
11: begin v2_xres <= #1 v1_xres/7 + 1; v2_yres <= #1 v1_yres/7 + 1; end
12: begin v2_xres <= #1 v1_xres/7 + 0; v2_yres <= #1 v1_yres/7 + 0; end
13: begin v2_xres <= #1 v1_xres/7 - 1; v2_yres <= #1 v1_yres/7 - 1; end
default : $stop;
endcase
end
endmodule
3. 图片文件产生视频数据流 bmp_for_videoStream.sv verilog 代码
- https://blog.csdn.net/qq_46621272/article/details/126441071
- 用 BMP 图片文件产生视频数据流,BMP 转视频流模块,读取图片文件,转换成视频数据流输出。
4. 临近缩小 video_scale_down_near.sv verilog 代码
- https://blog.csdn.net/qq_46621272/article/details/120917913
- 临近插值任意比例视频缩小 verilog 代码,很短的不到 100 行的代码。
5. 临近缩放 video_scale_near_v1.sv 代码
- https://blog.csdn.net/qq_46621272/article/details/126520389
- 临近插值任意比例视频缩放 verilog 代码,很短的不到 300 行的代码。
6. 将视频流输出写入 BMP 图片文件 bmp_to_videoStream.sv verilog 代码
- https://blog.csdn.net/qq_46621272/article/details/126441149
- 将视频流输出写入 BMP 图片文件并保存 verilog 代码。
7. 用 C 语言编写的临近缩放算法
- https://blog.csdn.net/qq_46621272/article/details/126459136
- 在我们做 verilog 算法时,输出的结果是否正确?需要一个正确的参考。需要一组正确的输出图片与本仿真结果做比对。采用与本实验中相同的算法,用 C 语言实现,可以帮助阅读”临近缩小 video_scale_down_near.sv“算法的理解。C 语言执行后输出的图片文件与本仿真运行产生的 BMP 用软件二进制比对无任何差异。
二、部分图像视频算法效果图片。
1.缩小原始图片
原始 960x540 图片
2. 临近缩小效果图 verilog 代码实现
临近缩小 2:1 480x270 图片
3. 双线性缩小效果图 verilog 代码实现
双线性缩小 2:1 480x270 图片,可以对比临近缩小图中间的文字部分
4.放大原始图片
原始 160x120 图片
5. 大比例临近放大效果图 verilog 代码实现
临近1:5 放大800x600 图片
4. 大比例双线性放大效果图 verilog 代码实现
双线性1:5 放大800x600 图片
5. 椒盐降噪中值滤波效果拼图 verilog 代码实现
椒盐降噪效果拼图
6. 锐化算法效果图 verilog 代码实现
原始月亮环形山图片
锐化后月亮环形山图片
三、系列文章陆续更新相关连接
-
- system verilog 双线性缩放仿真实验(陆续更新)
-
- system verilog 图像处理行缓存 linebuffer 仿真实验(陆续更新)
-
- system verilog linebuffer 应用图像中值滤波仿真实验(陆续更新)
-
- system verilog linebuffer 应用图像高斯滤波仿真实验(陆续更新)
-
- system verilog linebuffer 应用图像拉普拉斯滤波仿真实验(陆续更新)
四、下载链接
本仿真工程文件下载,采用 Xilinx vivado 2017.4 版本
system verilog vivado 图像视频缩放代码,仿真工程
system verilog vivado 图像视频缩小代码,仿真工程