Увеличение выборки с помощью Verilog

#verilog

#verilog

Вопрос:

Мне нужно увеличить выборку (в 2 раза) моих данных с помощью Verilog. Я думаю использовать три порта для ввода и один порт для вывода. Входными портами являются filterin, reset и clock. Выходной порт — это filterout. Также мне нужен динамический размер ввода. Как я могу реализовать это с помощью Verilog.

Правка 1: Мои входные и выходные данные имеют длину 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.

Правка2: Я создал файл 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…

Комментарии:

1. Вам нужно будет предоставить гораздо больше деталей.

2. Чем больше контекста вы можете предоставить, тем лучше. То, что вы описываете, выдает на выходе в 2 раза больше данных, чем получает на входе, что подразумевает какое-то управление потоком. К чему будет подключаться этот модуль (например, к другим функциональным блокам, ЦАП, АЦП, устройствам ввода-вывода памяти)? Опубликуйте код, который у вас уже есть.

3. Я снова отредактировал свой пост и опубликовал свой пока что бесполезный код. Мне нужно использовать динамическое количество триггеров для сохранения и использования моих прошлых данных.

4. В подобном вопросе большинство читателей предположат, что тестовый стенд определяет требования к дизайну. Если решение заключается в изменении тестовой среды, это говорит о том, что проблема не была четко определена с самого начала.

5. Мне нужен был ответ, чтобы преодолеть проблему увеличения выборки. Я решил это, изменив testbench. С новым тестовым стендом у меня другие часы, которые позволяют мне видеть невидимые значения и не являются просто требованием дизайна. Также я думаю, что сначала я определил свою проблему понятным образом. Мое определение достаточно простое, чтобы упомянуть проблему, которую я легко решил следующим образом.

Ответ №1:

Несколько комментариев к вашему коду, предполагая, что это для синтеза.

  • Не инициализируйте переменную ‘i’ в объявлении. Это не всегда поддается синтезированию.
  • Не используйте целочисленный тип для одного бита переключения. Это делает ваш код менее понятным и усложняет работу инструментов.
  • Никогда не смешивайте блокирующие и неблокирующие назначения в одном и том же блоке always.

Учитывая ваше описание, я не уверен, какую операцию вы пытаетесь здесь реализовать. Вы сказали повышающую выборку, но это не типичный подход, такой как методы линейной или кубической интерполяции.

Ответ №2:

Проблема решена. Я изменил период ввода filterin на моем тестовом стенде следующим образом:

     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…