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

//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
原始 960x540 图片
临近缩小 2:1 480x270 图片
双线性缩小 2:1 480x270 图片,可以对比临近缩小图中间的文字部分
原始 160x120 图片
临近1:5 放大800x600 图片
双线性1:5 放大800x600 图片
椒盐降噪效果拼图
原始月亮环形山图片
锐化后月亮环形山图片
本仿真工程文件下载,采用 Xilinx vivado 2017.4 版本
system verilog vivado 图像视频缩放代码,仿真工程
system verilog vivado 图像视频缩小代码,仿真工程