Image Sub-pixel interpolation by Verilog
bilinear interpolation
--------------------------------------------------------
input
a0 a1
b0 b1
--------------------------------------------------------
- t1 = a0*(1-dx) + a1*dx
- t2 = b0*(1-dx) + b1*dx
- c = t1*(1-dy) + t2*dy
c is the output
-------------------------------------------------------
`define _DEBUG
module sub_pixel(clk
, rst_n
, a_en
, a0
, a1
, b0
, b1
, dx
, dy
, c
, c_en
`ifdef _DEBUG
, _sum_a0_s2
, _sum_a1_s2
, _sum_b0_s2
, _sum_b1_s2
`endif
);
parameter SHIFT_BITS = 4'd10;
localparam SCALE = 32'd1<<SHIFT_BITS;
input clk, rst_n, a_en;
input [7:0]a0, a1, b0, b1;
input [(SHIFT_BITS-1):0]dx, dy;
output [7:0]c;
output c_en;
`ifdef _DEBUG
output [31:0]_sum_a0_s2;
output [31:0]_sum_a1_s2;
output [31:0]_sum_b0_s2;
output [31:0]_sum_b1_s2;
`endif
//////////////////////////////////////////
//Step 1
reg [7:0]a0_s1, a1_s1, b0_s1, b1_s1;
reg [31:0]_dx_s1, _dy_s1, _1_dx_s1, _1_dy_s1;
reg a_en_s1;
always@(posedge clk or negedge rst_n)
begin
if (!rst_n)
begin
_dx_s1 <= 32'd0;
_dy_s1 <= 32'd0;
_1_dx_s1 <= 32'd0;
_1_dy_s1 <= 32'd0;
a0_s1 <= 8'd0;
a1_s1 <= 8'd0;
b0_s1 <= 8'd0;
b1_s1 <= 8'd0;
a_en_s1 <= 1'd0;
end
else
begin
_dx_s1 <= dx;
_dy_s1 <= dy;
_1_dx_s1 <= SCALE - dx;
_1_dy_s1 <= SCALE - dy;
a0_s1 <= a0;
a1_s1 <= a1;
b0_s1 <= b0;
b1_s1 <= b1;
a_en_s1 <= a_en;
end
end
//////////////////////////////////////////
//Step 2
reg a_en_s2 = 1'd0;
reg [31:0]_dy_s2, _1_dy_s2;
reg [31:0]sum_a0_s2 = 32'd0;
reg [31:0]sum_a1_s2 = 32'd0;
reg [31:0]sum_b0_s2 = 32'd0;
reg [31:0]sum_b1_s2 = 32'd0;
always@(posedge clk or negedge rst_n)
begin
if (!rst_n)
begin
a_en_s2 <= 1'd0;
_dy_s2 <= 32'd0;
_1_dy_s2 <= 32'd0;
sum_a0_s2 <= 32'd0;
sum_a1_s2 <= 32'd0;
sum_b0_s2 <= 32'd0;
sum_b1_s2 <= 32'd0;
end
else
begin
a_en_s2 <= a_en_s1;
_dy_s2 <= _dy_s1;
_1_dy_s2 <= _1_dy_s1;
sum_a0_s2 <= a0_s1*_1_dx_s1;
sum_a1_s2 <= a1_s1*_dx_s1;
sum_b0_s2 <= b0_s1*_1_dx_s1;
sum_b1_s2 <= b1_s1*_dx_s1;
end
end
//////////////////////////////////////////
//Step 3
reg a_en_s3 = 1'd0;
reg [31:0]_dy_s3, _1_dy_s3;
reg [31:0]sum_a_s3 = 32'd0;
reg [31:0]sum_b_s3 = 32'd0;
always@(posedge clk or negedge rst_n)
begin
if (!rst_n)
begin
a_en_s3 <= 1'd0;
_dy_s3 <= 32'd0;
_1_dy_s3 <= 32'd0;
sum_a_s3 <= 32'd0;
sum_b_s3 <= 32'd0;
end
else
begin
a_en_s3 <= a_en_s2;
_dy_s3 <= _dy_s2;
_1_dy_s3 <= _1_dy_s2;
sum_a_s3 <= sum_a0_s2 + sum_a1_s2;
sum_b_s3 <= sum_b0_s2 + sum_b1_s2;
end
end
//////////////////////////////////////////
//Step 4
reg a_en_s4 = 1'd0;
reg [31:0]sum_a_s4 = 32'd0;
reg [31:0]sum_b_s4 = 32'd0;
always@(posedge clk or negedge rst_n)
begin
if (!rst_n)
begin
a_en_s4 <= 1'd0;
sum_a_s4 <= 32'd0;
sum_b_s4 <= 32'd0;
end
else
begin
a_en_s4 <= a_en_s3;
sum_a_s4 <= sum_a_s3[31:(SHIFT_BITS-1)]*_1_dy_s3;
sum_b_s4 <= sum_b_s3[31:(SHIFT_BITS-1)]*_dy_s3;
end
end
//////////////////////////////////////////
//Step 5
reg a_en_s5 = 1'd0;
reg [31:0]sum_s5 = 1'd0;
always@(posedge clk or negedge rst_n)
begin
if (!rst_n)
begin
a_en_s5 <= 1'd0;
sum_s5 <= 1'd0;
end
else
begin
a_en_s5 <= a_en_s4;
sum_s5 <= sum_a_s4 + sum_b_s4;
end
end
assign c = sum_s5[(SHIFT_BITS+8):(SHIFT_BITS+1)];
assign c_en = a_en_s5;
`ifdef _DEBUG
assign _sum_a0_s2 = sum_a0_s2;
assign _sum_a1_s2 = sum_a1_s2;
assign _sum_b0_s2 = sum_b0_s2;
assign _sum_b1_s2 = sum_b1_s2;
`endif
endmodule
----------------------------------------------------------------------------
////////////////TEST BENCH/////////////////////////
////////////////////////////////////////////////////////
`define _DEBUG
`timescale 1 ns/ 1 ns
module sub_pixel_vlg_tst();
parameter SHIFT_BITS = 4'd10;
localparam SCALE = 32'd1<<SHIFT_BITS;
// test vector input registers
reg [7:0] a0;
reg [7:0] a1;
reg a_en;
reg [7:0] b0;
reg [7:0] b1;
reg clk;
reg [9:0] dx;
reg [9:0] dy;
reg rst_n;
// wires
wire [7:0]c;
wire c_en;
`ifdef _DEBUG
wire [31:0]_sum_a0_s2;
wire [31:0]_sum_a1_s2;
wire [31:0]_sum_b0_s2;
wire [31:0]_sum_b1_s2;
`endif
// assign statements (if any)
sub_pixel i1 (
.clk(clk)
, .rst_n(rst_n)
, .a_en(a_en)
, .a0(a0)
, .a1(a1)
, .b0(b0)
, .b1(b1)
, .dx(dx)
, .dy(dy)
, .c(c)
, .c_en(c_en)
`ifdef _DEBUG
, ._sum_a0_s2(_sum_a0_s2)
, ._sum_a1_s2(_sum_a1_s2)
, ._sum_b0_s2(_sum_b0_s2)
, ._sum_b1_s2(_sum_b1_s2)
`endif
);
initial
begin
clk = 0;
forever #5 clk <= ~clk;
end
initial
begin
rst_n <= 0;
a_en <= 0;
#(5 + 100) rst_n <= 1;
@(posedge clk)
begin
a_en <= 1; a0 <= 4; a1 <= 6; b0 <= 8; b1 <= 10; dx <= SCALE/2; dy <= SCALE/2;
end
@(posedge clk)
begin
a_en <= 1; a0 <= 40; a1 <= 60; b0 <= 80; b1 <= 100; dx <= SCALE/2; dy <= SCALE/2;
end
@(posedge clk)
begin
a_en <= 1; a0 <= 40; a1 <= 60; b0 <= 80; b1 <= 100; dx <= SCALE/4; dy <= SCALE/4;
end
@(posedge clk)
begin
a_en <= 1; a0 <= 40; a1 <= 60; b0 <= 80; b1 <= 100; dx <= SCALE/10; dy <= SCALE/10;
end
@(posedge clk)
begin
a_en <= 1; a0 <= 40; a1 <= 60; b0 <= 80; b1 <= 100; dx <= SCALE - SCALE/10; dy <= SCALE - SCALE/10;
end
@(posedge clk)
begin
a_en = 0;
end
#5000 $stop;
end
endmodule

Image Sub-pixel interpolation by Verilog的更多相关文章
- Research Guide for Video Frame Interpolation with Deep Learning
Research Guide for Video Frame Interpolation with Deep Learning This blog is from: https://heartbeat ...
- On-Demand Learning for Deep Image Restoration
摘要 论文来源:ICCV 2017 之前的缺点:目前的机器学习方法只专注于在特定困难程度的图像损坏(如一定程度的噪声或模糊)情况下进行良好的训练模型. 改进的方法:提出了一种基于深度卷积神经网络的按需 ...
- Atitit 图像处理Depixelizing Pixel Art像素风格画的矢量化
Atitit 图像处理Depixelizing Pixel Art像素风格画的矢量化 在去年的时候,偶然看到hqx算法. 一个高质量的插值放大算法. 与双线性插值等插值算法相比,这个算法放大后对人眼 ...
- UnderStand Perspective Rasterization, SV_POSITION(gl_FragCoord) to Pixel, SV mean Systems Value
Shader "UnderStandPRR" { Properties { _MainTex ("Texture", 2D) = "white&quo ...
- verilog 代码分析与仿真
verilog 代码分析与仿真 注意:使用vivado 自带的仿真工具, reg和wire等信号需要赋予初始值 边沿检测 module signal_test( input wire cmos_pcl ...
- 【接口时序】7、VGA接口原理与Verilog实现
一. 软件平台与硬件平台 软件平台: 1.操作系统:Windows-8.1 2.开发套件:ISE14.7 3.仿真工具:ModelSim-10.4-SE 硬件平台: 1. FPGA型号:Xilinx公 ...
- verilog实现中值滤波
前言 项目需要,想要实现算法中的其中一步即中值滤波,同时,因为图像处理部分中值滤波相对来说还是比较简单的,将中值滤波的硬件实现作为进入FPGA领域的第一次尝试.虽然说网上有较多关于中值滤波的文档,可是 ...
- BT.656 NTSC制式彩条生成模块(verilog)
BT.656 NTSC制式彩条生成模块(verilog) 1.知识储备 隔行扫描是将一副图像分成两场扫描,第一场扫描第1,2,5,7...等奇数行,第二场扫描2,4,6,8...等偶数行,并把扫奇数行 ...
- verilog版插值
开发环境:IDE:LIBERO 9.0(ACTEL公司的)芯片:AFS600 (BGA256),是混合系列的FPGA仿真软件:modelsim atcel 6.5d综合软件:synplify pr ...
随机推荐
- jar -cmf file1 file2 file3命令
jar -cmf file1 file2 file3中的参数c.m.f和file1.file2.file3是一一对应的. 也就是说,file1是输出的.jar文件,file2是往META-INF/MA ...
- iOS 导航引发坐标高度问题
iOS7 后导航结构发生变化,有新的控制属性诞生,一下为两个属性引发的控制器视图高度问题 translucent = YES 导航透明 (默认) translucent = NO 导航 ...
- 为什么不写 @RequestParam 也能拿到参数?
三种写法,test(String name), test(@RequestParam String name), test(@RequestParam("userName") St ...
- [luogu3393]逃离僵尸岛
[luogu3393]逃离僵尸岛 luogu 先把被禁止的点和新建的虚点n+1连0边 跑最短路,dis<=s的点价格为Q,否则为P, 再建图跑最短路 #define ll long long # ...
- MyBaits面试题
原文地址 Mybatis技术内幕系列博客,从原理和源码角度,介绍了其内部实现细节,无论是写的好与不好,我确实是用心写了,由于并不是介绍如何使用Mybatis的文章,所以,一些参数使用细节略掉了,我们的 ...
- value too great for base (error token is "08")
shell 中,经常有定时任务, 这时候shell脚本中一般会对时间进行一些判断,或者相关逻辑的操作 这时候,如果你获取的小时或者分钟是08,09,如果要再对其进行运算符或者比较的话,就会报标题的错误 ...
- MySQL——存储过程
核心知识点: 1.什么存储过程?它都有哪些优点? 2.存储过程的语法和参数? 3.存储过程有哪些操作? 4.存储过程常用的控制语句? 一.存储过程概论 SQL语句需要先编译然后执行,而存储过程是一组为 ...
- JDK线程池的实现
线程池 接口Executor 该接口只有一个方法,JDK解释如下 执行已提交的Runnable 任务的对象.此接口提供一种将任务提交与每个任务将如何运行的机制(包括线程使用的细节.调度等)分离开来的方 ...
- Yii2 关于电子商务的开源项目
https://github.com/samdark/yii2-shop https://github.com/omnilight/yii2-shopping-cart https://github. ...
- [算法]在数组中找到出现次数大于N/K的数
题目: 1.给定一个整型数组,打印其中出现次数大于一半的数.如果没有出现这样的数,打印提示信息. 如:1,2,1输出1. 1,2,3输出no such number. 2.给定一个整型数组,再给 ...