版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_46621272/article/details/126441071
Syetem Verilog 用BMP图片文件产生视频流 testbench 激励代码
文章目录
- 前言
-
- 一、 testbench 激励文件 bmp_to_videoStream.sv 代码
- 二、相关连接
- 三、[本仿真工程文件下载,采用 Xilinx vivado 2017.4 版本](https://download.csdn.net/download/qq_46621272/86406386)
前言
- Verilog 做图像视频算法仿真时,只能看见相关波形,不能直观查看计算后的图像视频效果。本文以临近缩放算法为例,用 BMP 图片文件代替视频数据来做图像视频缩放算法仿真。最终输出缩放后的 BMP 图片文件。可以通过查看图片的办法直观显示图像缩放算法产生的效果。
- 本文中阐述的仿真环境适合很多采用 Verilog FPGA 实现的视频图像算法的仿真。比如各种视频缩放、旋转、拉伸等算法,比如视频滤波、降噪等算法。
//bmp_to_videoStream.sv
//用BMP图片文件产生视频流
//本模块不能被综合,只能用来当仿真module bmp_to_videoStream #
(
parameter iMODE= "BMP",//"BMP" 用BMP文件的图像数据产生视频流
// parameter iMODE= "NUM",//用水平垂直扫描的数字产生视频流,在定位BUG时,需要一些有规律的数字去定位
parameter iBMP_FILE_PATH= "",//缺省的 bmp 文件路径
parameter iBMP_FILE_NAME= "vin.bmp"//缺省的 bmp 文件名
)
(
inputclk,
inputrst_n,
output logic[2:0][7:0]vout_dat,//输出视频数据
output logicvout_valid,//输出视频数据有效
inputvout_ready,//输出准备好
inputframe_sync_n,//输入视频帧同步复位,低有效
output [15:0]vout_xres,//输出视频水平分辨率
output [15:0]vout_yres//输出视频垂直分辨率
);
logic [0:53][7:0] bmp_header;
//BMP 图像文件头
logic [31:0]offsetBits;
//BMP 图像数据位置
logic [31:0]width;
//BMP 图像宽度
logic [31:0]height;
//BMP 图像高度
logic [31:0]sizeImage;
//BMP 图像大小(字节)
logic [31:0]sizePixel;
//BMP 像素数量(像素个数)
logic [31:0]sizeBmpFile;
//BMP 图像文件大小(字节)
logic [31:0]BufferLineWidth;
//BMP 每行大小,单位字节,每行大小需要4字节对齐
logicpixel_valid;
logic [0:2][7:0] pixel_dat;
logic [15:0]sx;
logic [15:0]sy;
logic [2:0][7:0] num_dat;
logic [7:0]cnt = '1;
integer bmp_rp;
initial
begin
$display("iBMP_FILE_NAME = %s%s\n",iBMP_FILE_PATH,iBMP_FILE_NAME);
bmp_rp = $fopen({iBMP_FILE_PATH,iBMP_FILE_NAME},"rb");
$fread(bmp_header,bmp_rp);
//读图片文件头信息if(bmp_header[0] != 8'h42 || bmp_header[1] != 8'h4d || bmp_rp == 0) begin
$display("bmp file format error!!!!!!!!!!!!!!!!\n");
$fclose(bmp_rp);
$stop;
end
else begin
sizeBmpFile= {bmp_header[05],bmp_header[04],bmp_header[03],bmp_header[02]};
offsetBits= {bmp_header[13],bmp_header[12],bmp_header[11],bmp_header[10]};
width= {bmp_header[21],bmp_header[20],bmp_header[19],bmp_header[18]};
height= {bmp_header[25],bmp_header[24],bmp_header[23],bmp_header[22]};
sizeImage= {bmp_header[37],bmp_header[36],bmp_header[35],bmp_header[34]};
sizePixel= width * height;
BufferLineWidth = (width*3+3) & 32'hffff_fffc;
//BMP 文件,每行需要4字节对齐
$display("vin BMP File Size= 0x%h",sizeBmpFile);
$display("vin Image data offset= 0x%h",offsetBits);
$display("vin Image width= 0x%h",width);
$display("vin Image heigh= 0x%h",height);
$display("vin Image size= 0x%h",sizeImage);
$display("vin Image pixel number= 0x%h",sizePixel);
$display("vin Image BufferLineWidth = 0x%h\n",BufferLineWidth);
$fseek(bmp_rp,offsetBits,0);
//将读文件指针移到图片数据去
end
end assign vout_valid= pixel_valid;
assign vout_xres= width;
assign vout_yres= height;
if(iMODE == "NUM")begin
assign vout_dat= num_dat;
//用水平垂直扫描的数字产生视频流,在定位BUG时,需要一些有规律的数字去定位
end
if(iMODE == "BMP")begin
assign vout_dat[0]= pixel_dat[0];
assign vout_dat[1]= pixel_dat[1];
assign vout_dat[2]= pixel_dat[2];
end always_ff@(posedge clk)
begin
if(rst_n == 0)
cnt <= '1;
else if(frame_sync_n == 0)
cnt <= 0;
else if( cnt != '1 )
cnt <= cnt + 1;
end always_ff@(posedge clk)begin
if(rst_n == 0 || frame_sync_n == 0 || cnt != '1)begin
sx<= 0;
sy<= 0;
end
else if(vout_ready == 1)begin
if(sy < height)begin
num_dat <= {sy[11:0],sx[11:0]};
//iMODE = "NUM" 时,num_dat 代替图片数据输出
if(sx < width - 1)begin
sx<= sx + 1;
end
else if(sy < height)begin
sx<= 0;
sy<= sy + 1;
end
end
end
end always_ff@(posedge clk)
begin
if(rst_n == 0 || frame_sync_n == 0 || cnt != '1)begin
pixel_valid <= 0;
pixel_dat <= 0;
end
else if(vout_ready == 1)begin
if(sy < height)begin
pixel_valid <= 1;
if(sx == 0)begin//判断行首
$fseek(bmp_rp,offsetBits+(BufferLineWidth*sy),0);
//将读文件指针移到图片数据的当前行首
$fread(pixel_dat,bmp_rp);
end
else begin
$fread(pixel_dat,bmp_rp);
end
end
else begin
pixel_valid <= 0;
end
end
end // always_ffendmodule
二、相关连接
- System Verilog 视频缩放图像缩放 vivado 仿真 https://blog.csdn.net/qq_46621272/article/details/126439519
- https://download.csdn.net/download/qq_46621272/86406386
推荐阅读
- 视频处理|Syetem Verilog 将视频流输出写入 BMP 图片文件 testbench 激励代码
- 视频处理|FPGA 处理视频SDRAM带宽计算
- fpga|【入门学习四】基于 FPGA 使用 Verilog 实现串口回传通信代码及原理讲解
- fpga开发|基于 FPGA 使用 Verilog 实现 DS18B20 温度采集以及数码管显示项目源码
- 简单接口开发|Verilog实现IIC协议读写EEPROM
- i2c|用verilog 实现的 i2c控制模块
- Xilinx|Xilinx ISE系列教程(2)(LED点灯工程、仿真、bit下载和mcs固化)
- FPGA时序分析
- FPGA刷题——信号发生器+冒泡法求6个数中的最小值