В этом коде множество ошибок.
Кроме того, у вас есть 3-мегабитная память, из которой вы используете только 1 в 9 местах.
- Вы пишете
out
в двух местах. Это не работает.
- Вы используете% 9. Это не может быть отображено на оборудование.
- У вас есть сигнал sel, который каким-то образом контролирует вашу сумму.
Кроме того, я понимаю, что вы хотите вывести всю память из памяти.
Ваш код, потому что его нужно кардинально переписать.
Но ваша самая большая проблема в том, что вы определенно не можете заставить память всплыть. Что бы вы ни делали после постобработки, у вас есть два варианта:
- Обработка выходных данных в том виде, в котором они отображаются.
- Сохраните данные вне модуля в памяти и попросите другой процесс прочитать эту память.
Я думаю, что только (1) является правильным способом, потому что ваш сигнал может иметь бесконечную длину.
Что касается исправления этого кода:
- Заменить% 9 на счетчик, чтобы считать от 0 до 8.
- Обработка в синхронизированной секции. Смотри ниже
- Переместите сюда логику генерации addr и sel. Держите все это вместе.
Ниже приведен основной код того, как сделать свертку из 9 последовательностей. Я должен игнорировать «sel», так как понятия не имею о сроках. Я также добавил генерацию адреса и сигнал записи, чтобы результат можно было сохранить во внешней памяти. Но я все еще думаю, что вы должны обработать результат на лету.
always @(posedge clk or posedge rts)
begin
if (rst)
begin
counter <= 4'h0;
addr <= 'h0;
sum <= 0;
do_write <= 1'b0;
end // rst
else
begin
if (counter == 4'h8)
begin // we have gathered 9 samples
counter <= 4'h0;
addr <= addr + 1;
// start again so ignore old sum
sum <= mult;
end
else
begin
counter <= counter + 4'h1;
// Add results
sum <= sum + mult;
end
// Write signal has to be set one cycle early
do_write = (counter==4'h7);
end // clocked
end // always
(код выше был введен на лету, может содержать синтаксис, опечатку и другие ошибки !!)
Как видите, хитрость заключается в том, чтобы узнать, когда добавить старый результат или когда игнорировать старую сумму и начать заново.
(на это я трачу около 3/4 часа, поэтому по моему обычному тарифу вы должны будете заплатить мне $ 93,75 :-)
Я предоставил основной код, чтобы вы могли разобраться со спецификой. Я ничего не делал с тобой, но оставил это тебе.
do_write и addr, где для возможной памяти, чтобы забрать результат. Без памяти вы можете удалить addr, но do_write должен сообщить вам, когда будет доступен новый результат свертки, и в этом случае вы можете присвоить ему другое имя. например 'Sum_valid'.