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的更多相关文章

  1. Research Guide for Video Frame Interpolation with Deep Learning

    Research Guide for Video Frame Interpolation with Deep Learning This blog is from: https://heartbeat ...

  2. On-Demand Learning for Deep Image Restoration

    摘要 论文来源:ICCV 2017 之前的缺点:目前的机器学习方法只专注于在特定困难程度的图像损坏(如一定程度的噪声或模糊)情况下进行良好的训练模型. 改进的方法:提出了一种基于深度卷积神经网络的按需 ...

  3. Atitit  图像处理Depixelizing Pixel Art像素风格画的矢量化

    Atitit  图像处理Depixelizing Pixel Art像素风格画的矢量化 在去年的时候,偶然看到hqx算法. 一个高质量的插值放大算法. 与双线性插值等插值算法相比,这个算法放大后对人眼 ...

  4. UnderStand Perspective Rasterization, SV_POSITION(gl_FragCoord) to Pixel, SV mean Systems Value

    Shader "UnderStandPRR" { Properties { _MainTex ("Texture", 2D) = "white&quo ...

  5. verilog 代码分析与仿真

    verilog 代码分析与仿真 注意:使用vivado 自带的仿真工具, reg和wire等信号需要赋予初始值 边沿检测 module signal_test( input wire cmos_pcl ...

  6. 【接口时序】7、VGA接口原理与Verilog实现

    一. 软件平台与硬件平台 软件平台: 1.操作系统:Windows-8.1 2.开发套件:ISE14.7 3.仿真工具:ModelSim-10.4-SE 硬件平台: 1. FPGA型号:Xilinx公 ...

  7. verilog实现中值滤波

    前言 项目需要,想要实现算法中的其中一步即中值滤波,同时,因为图像处理部分中值滤波相对来说还是比较简单的,将中值滤波的硬件实现作为进入FPGA领域的第一次尝试.虽然说网上有较多关于中值滤波的文档,可是 ...

  8. BT.656 NTSC制式彩条生成模块(verilog)

    BT.656 NTSC制式彩条生成模块(verilog) 1.知识储备 隔行扫描是将一副图像分成两场扫描,第一场扫描第1,2,5,7...等奇数行,第二场扫描2,4,6,8...等偶数行,并把扫奇数行 ...

  9. verilog版插值

      开发环境:IDE:LIBERO 9.0(ACTEL公司的)芯片:AFS600 (BGA256),是混合系列的FPGA仿真软件:modelsim atcel 6.5d综合软件:synplify pr ...

随机推荐

  1. 什么是Mocking framework?它有什么用?(转)

    今天我想讲下关于mocking frameworks,并且解释下他为什么有用处.我将给你们展示用和不用mocking framework两种测试方法. 假设我们已经有了一个Driver类: publi ...

  2. 九度OJ 1196:成绩排序 (排序)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:4339 解决:1476 题目描述: 用一维数组存储学号和成绩,然后,按成绩排序输出. 输入: 输入第一行包括一个整数N(1<=N< ...

  3. Mybatis sql注入问题

    预编译方式,即PreparedStatement,可以防注入:#{id} <select id="getBlogById" resultType="Blog&quo ...

  4. PAT 1057. 数零壹(20)

    给定一串长度不超过105的字符串,本题要求你将其中所有英文字母的序号(字母a-z对应序号1-26,不分大小写)相加,得到整数N,然后再分析一下N的二进制表示中有多少0.多少1.例如给定字符串“PAT ...

  5. Symfony3 查询搜索功能DQL语句like查询

    //前台页面代码 <form method="GET" action="{{ path('staff_index') }}" name="sea ...

  6. Android UI Design

    Ref:直接拿来用!10款实用Android UI工具 Ref:Android UI设计资源 Ref:Android酷炫实用的开源框架(UI框架) Ref:Android UI 组件 Ref:Andr ...

  7. CentOS iSCSI服务器搭建------Initiator篇

    服务器信息: [root@initiator ~]# cat /etc/redhat-release CentOS release 6.6 (Final) [root@initiator ~]# un ...

  8. 机器学习Coursera学习总结

    Coursera上Andrew NG的机器学习实在是太火了,最近有时间花费了20来天的时间(每天3小时左右)终于学习完了全部的课程,总结如下: (1)适合入门,讲的比较基础,Andrew讲的很棒: ( ...

  9. UIImageView 获取图片的 宽 高

    该文章纯属这两天开发的经验之谈 并且也是平常没注意 这回发现的一个小方法 并且很实用 在开发中 提高了很大的效率 更加符合高保真的要求 通常 美术 切的一些图片 需要 :1还原的 现在 我们一般支持i ...

  10. 【二】MongoDB入门

    下面是mongodb的一些基本概念: 文档是MongoDB中数据的基本单元,类似关系数据库中的行. 集合,是存储文档的容器,类似关系数据库中的表. MongoDB的单个实例容纳多个数据库,每个数据库都 ...