#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…