System Verilog 视频缩放图像缩放 vivado 仿真


版权声明:本文为博主原创文章,遵循 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_testbench.sv verilog 代码](https://blog.csdn.net/qq_46621272/article/details/120917913)
      • 5. [将视频流输出写入 BMP 图片文件 bmp_to_videoStream.sv verilog 代码](https://blog.csdn.net/qq_46621272/article/details/126441149)
      • 6. [用 C 语言编写的临近缩放算法](https://blog.csdn.net/qq_46621272/article/details/126459136)
    • 二、部分图像视频算法效果图片。
      • 1.缩小原始图片
      • 2. 临近缩小效果图 verilog 代码实现
      • 3. 双线性缩小效果图 verilog 代码实现
      • 4.放大原始图片
      • 5. 大比例临近放大效果图 verilog 代码实现
      • 4. 大比例双线性放大效果图 verilog 代码实现
      • 5. 椒盐降噪中值滤波效果拼图 verilog 代码实现
      • 6. 锐化算法效果图 verilog 代码实现
    • 三、系列文章陆续更新相关连接
    • 四、[本仿真工程文件下载,采用 Xilinx vivado 2017.4 版本](https://download.csdn.net/download/qq_46621272/86406386)


前言

  • Verilog 做图像视频算法仿真时,只能看见相关波形,不能直观查看计算后的图像视频效果。本文以临近缩放算法为例,用 BMP 图片文件代替视频数据来做图像视频缩放算法仿真。最终输出缩放后的 BMP 图片文件。可以通过查看图片的办法直观显示图像缩放算法产生的效果。本文中阐述的仿真环境适合很多采用 Verilog FPGA 实现的视频图像算法的仿真。比如各种视频缩放、旋转、拉伸等算法,比如视频滤波、降噪等算法。

一、Verilog 图像视频临近缩小算法仿真,代码大部分采用 Syetem Verilog 语言编写。

1. testbench 逻辑框图

System Verilog 视频缩放图像缩放 vivado 仿真_第1张图片

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_testbench.sv verilog 代码

  • https://blog.csdn.net/qq_46621272/article/details/120917913
  • 临近插值任意比例视频缩小 verilog 代码,很短的不到 100 行的代码。

5. 将视频流输出写入 BMP 图片文件 bmp_to_videoStream.sv verilog 代码

  • https://blog.csdn.net/qq_46621272/article/details/126441149
  • 将视频流输出写入 BMP 图片文件并保存 verilog 代码。

6. 用 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 图片
System Verilog 视频缩放图像缩放 vivado 仿真_第2张图片

3. 双线性缩小效果图 verilog 代码实现

双线性缩小 2:1 480x270 图片,可以对比临近缩小图中间的文字部分
System Verilog 视频缩放图像缩放 vivado 仿真_第3张图片

4.放大原始图片

原始 160x120 图片
System Verilog 视频缩放图像缩放 vivado 仿真_第4张图片

5. 大比例临近放大效果图 verilog 代码实现

临近1:5 放大800x600 图片

4. 大比例双线性放大效果图 verilog 代码实现

双线性1:5 放大800x600 图片

5. 椒盐降噪中值滤波效果拼图 verilog 代码实现

椒盐降噪效果拼图

6. 锐化算法效果图 verilog 代码实现

原始月亮环形山图片
System Verilog 视频缩放图像缩放 vivado 仿真_第5张图片

锐化后月亮环形山图片
System Verilog 视频缩放图像缩放 vivado 仿真_第6张图片

三、系列文章陆续更新相关连接

    1. system verilog 临近缩放仿真实验(陆续更新)
    1. system verilog 双线性缩放仿真实验(陆续更新)
    1. system verilog 图像处理行缓存 linebuffer 仿真实验(陆续更新)
    1. system verilog linebuffer 应用图像中值滤波仿真实验(陆续更新)
    1. system verilog linebuffer 应用图像高斯滤波仿真实验(陆续更新)
    1. system verilog linebuffer 应用图像拉普拉斯滤波仿真实验(陆续更新)

四、本仿真工程文件下载,采用 Xilinx vivado 2017.4 版本

  • https://download.csdn.net/download/qq_46621272/86406386

你可能感兴趣的:(视频处理,fpga开发,verilog,systemverilog,视频缩放,图像缩放)