使用Verilog的示例

时间:2011-05-14 17:25:28

标签: verilog

我需要使用Verilog对我的数据进行上采样(2x)。我认为使用三个端口进行输入,一个端口用于输出。输入端口是filterin,reset和clock。输出端口是filterout。我还需要动态输入大小。我怎么能用Verilog来实现这一点。

EDIT1: 我的输入和输出数据是16位长。我只需要一个Verilog代码来执行此操作:

如果输入:1 2 3, 然后输出:1 0 2 0 3 0。

如果输入:1 2 3 4 5, 然后输出:1 0 2 0 3 0 4 0 5 0。

EDIT2: 我创建了一个verilog文件来解决这个问题,但它没有解决我的问题。

US1.v文件

`timescale 1ns / 1ps

module US1 (filterin,clk,filterinus);

    input [15:0] filterin;
    input clk;

    output reg [15:0] filterinus;

    integer i=0;

    always @ (posedge clk) begin
        if (i==0) begin
            filterinus <= filterin;
        end
        else begin
            filterinus <= 0;
        end
        i=~i;
    end


endmodule

我使用以下测试平台测试了此代码:

Test.v文件

`timescale 1ps/1ps
module Test;

    reg [15:0] filterin;
    reg clk;
    wire [15:0] filterinus;

    US1 uut (
        .filterin(filterin), 
        .clk(clk),
        .filterinus(filterinus)
    );

    initial begin
        clk = 1;

        filterin = 1;
        #2 filterin = 2;
        #2 filterin = 3;
        #2 filterin = 4;
        #2 filterin = 5;

        #30 $finish;
    end

    always #1 clk = ~clk;

endmodule

如所见,我的输入是:1 2 3 4 5。 我的输出是:1 0 3 0 5 0 5 0 5 0 ... 我需要看:1 0 2 0 3 0 4 0 5 0 0 0 0 0 ...

2 个答案:

答案 0 :(得分:1)

对您的代码进行一些评论,假设这是用于综合的。

  • 不要在声明中初始化变量'i'。这并不总是可综合的。
  • 不要将整数类型用于单个切换位。这使您的代码不那么清晰,并使工具更加努力。
  • 永远不要在同一个始终阻止中混合阻塞和非阻塞分配。

根据您的描述,我不确定您在此尝试实施的操作。你说上采样,但这不是一种典型的方法,如线性或三次插值方法。

答案 1 :(得分:1)

问题解决了。我从我的测试平台改变了输入期间的过滤器,如下所示:

    filterin = 1;
    #4 filterin = 2;
    #4 filterin = 3;
    #4 filterin = 4;
    #4 filterin = 5;
    #4 filterin = 0;

我得到了我的输出:1 0 2 0 3 0 4 0 5 0 0 0 ...