草庐IT

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

老皮芽子 2024-02-11 原文

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_46621272/article/details/126439519


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


文章目录


前言

  • 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 代码

4. 临近缩小 video_scale_down_near.sv verilog 代码

5. 临近缩放 video_scale_near_v1.sv 代码

6. 将视频流输出写入 BMP 图片文件 bmp_to_videoStream.sv 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 代码实现

原始月亮环形山图片

锐化后月亮环形山图片

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

    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 版本
system verilog vivado 图像视频缩放代码,仿真工程
system verilog vivado 图像视频缩小代码,仿真工程

有关System Verilog 视频缩放图像缩放 vivado 仿真的更多相关文章

  1. ruby-on-rails - 添加回形针新样式不影响旧上传的图像 - 2

    我有带有Logo图像的公司模型has_attached_file:logo我用他们的Logo创建了许多公司。现在,我需要添加新样式has_attached_file:logo,:styles=>{:small=>"30x15>",:medium=>"155x85>"}我是否应该重新上传所有旧数据以重新生成新样式?我不这么认为……或者有什么rake任务可以重新生成样式吗? 最佳答案 参见Thumbnail-Generation.如果rake任务不适合你,你应该能够在控制台中使用一个片段来调用重新处理!关于相关公司

  2. ruby-on-rails - 在 Ruby (on Rails) 中使用 imgur API 获取图像 - 2

    我正在尝试使用Ruby2.0.0和Rails4.0.0提供的API从imgur中提取图像。我已尝试按照Ruby2.0.0文档中列出的各种方式构建http请求,但均无济于事。代码如下:require'net/http'require'net/https'defimgurheaders={"Authorization"=>"Client-ID"+my_client_id}path="/3/gallery/image/#{img_id}.json"uri=URI("https://api.imgur.com"+path)request,data=Net::HTTP::Get.new(path

  3. 动漫制作技巧如何制作动漫视频 - 2

    动漫制作技巧是很多新人想了解的问题,今天小编就来解答与大家分享一下动漫制作流程,为了帮助有兴趣的同学理解,大多数人会选择动漫培训机构,那么今天小编就带大家来看看动漫制作要掌握哪些技巧?一、动漫作品首先完成草图设计和原型制作。设计草图要有目的、有对象、有步骤、要形象、要简单、符合实际。设计图要一致性,以保证制作的顺利进行。二、原型制作是根据设计图纸和制作材料,可以是手绘也可以是3d软件创建。在此步骤中,要注意的问题是色彩和平面布局。三、动漫制作制作完成后,加工成型。完成不同的表现形式后,就要对设计稿进行加工处理,使加工的难易度降低,并得到一些基本准确的概念,以便于后续的大样、准确的尺寸制定。四、

  4. python ffmpeg 使用 pyav 转换 一组图像 到 视频 - 2

    2022/8/4更新支持加入水印水印必须包含透明图像,并且水印图像大小要等于原图像的大小pythonconvert_image_to_video.py-f30-mwatermark.pngim_dirout.mkv2022/6/21更新让命令行参数更加易用新的命令行使用方法pythonconvert_image_to_video.py-f30im_dirout.mkvFFMPEG命令行转换一组JPG图像到视频时,是将这组图像视为MJPG流。我需要转换一组PNG图像到视频,FFMPEG就不认了。pyav内置了ffmpeg库,不需要系统带有ffmpeg工具因此我使用ffmpeg的python包装p

  5. TimeSformer:抛弃CNN的Transformer视频理解框架 - 2

    Transformers开始在视频识别领域的“猪突猛进”,各种改进和魔改层出不穷。由此作者将开启VideoTransformer系列的讲解,本篇主要介绍了FBAI团队的TimeSformer,这也是第一篇使用纯Transformer结构在视频识别上的文章。如果觉得有用,就请点赞、收藏、关注!paper:https://arxiv.org/abs/2102.05095code(offical):https://github.com/facebookresearch/TimeSformeraccept:ICML2021author:FacebookAI一、前言Transformers(VIT)在图

  6. ruby - 是否有将图像文件转换为 ASCII 艺术的命令行程序或库? - 2

    有这样的事吗?我想在Ruby程序中使用它。 最佳答案 试试这个http://csl.sublevel3.org/jp2a/此外,Imagemagick可能还有一些东西 关于ruby-是否有将图像文件转换为ASCII艺术的命令行程序或库?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/6510445/

  7. ruby-on-rails - 使用 Dragonfly 从 URL 分配图像 - 2

    我正在使用Dragonfly在Rails3.1应用程序上处理图像。我正在努力通过url将图像分配给模型。我有一个很好的表格:{:multipart=>true}do|f|%>RemovePicture?Dragonfly的文档指出:Dragonfly提供了一个直接从url分配的访问器:@album.cover_image_url='http://some.url/file.jpg'但是当我在控制台中尝试时:=>#ruby-1.9.2-p290>picture.image_url="http://i.imgur.com/QQiMz.jpg"=>"http://i.imgur.com/QQ

  8. Ruby-vips 图像处理库。有什么好的使用示例吗? - 2

    我对图像处理完全陌生。我对JPEG内部是什么以及它是如何工作一无所知。我想知道,是否可以在某处找到执行以下简单操作的ruby​​代码:打开jpeg文件。遍历每个像素并将其颜色设置为fx绿色。将结果写入另一个文件。我对如何使用ruby​​-vips库实现这一点特别感兴趣https://github.com/ender672/ruby-vips我的目标-学习如何使用ruby​​-vips执行基本的图像处理操作(Gamma校正、亮度、色调……)任何指向比“helloworld”更复杂的工作示例的链接——比如ruby​​-vips的github页面上的链接,我们将不胜感激!如果有ruby​​-

  9. ruby-on-rails - 如何播种图像的路径? - 2

    Organization和Image具有一对一的关系。Image有一个名为filename的列,它存储文件的路径。我在Assets管道中包含这样一个文件:app/assets/other/image.jpg。播种时如何包含此文件的路径?我已经在我的种子文件中尝试过:@organization=...@organization.image.create!(filename:File.open('app/assets/other/image.jpg'))#Ialsotried:#@organization.image.create!(filename:'app/assets/other/i

  10. ruby-on-rails - 安全地显示使用回形针 gem 上传的图像 - 2

    默认情况下:回形针gem将所有附件存储在公共(public)目录中。出于安全原因,我不想将附件存储在公共(public)目录中,所以我将它们保存在应用程序根目录的uploads目录中:classPost我没有指定url选项,因为我不希望每个图像附件都有一个url。如果指定了url:那么拥有该url的任何人都可以访问该图像。这是不安全的。在user#show页面中:我想实际显示图像。如果我使用所有回形针默认设置,那么我可以这样做,因为图像将在公共(public)目录中并且图像将具有一个url:Someimage:看来,如果我将图像附件保存在公共(public)目录之外并且不指定url(同

随机推荐