Перейти к содержанию
    

Как реализовать на Verilog'e

Возник еще один вопрос, не могу разобраться в чем дело:

Имеется код:

.....

При компиляции выдается сообщение:

Error (10044): Verilog HDL error at project.v(37): expression cannot reference entire array "DistCode"

 

wire[2:0] DistCode;

 

нужно почитать про packed и unpacked array

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Посоветуйте как написать на верилоге модуль задержки сигнала с кодом управления от 0 до N.

При коде 0 сигнал проходит напрямую, не 0 - с задержкой. Можно ли получить регистровый выход а не комбинационный?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Посоветуйте как написать на верилоге модуль задержки сигнала с кодом управления от 0 до N.

При коде 0 сигнал проходит напрямую, не 0 - с задержкой. Можно ли получить регистровый выход а не комбинационный?

Обычная линия задержки, несколько строчек на любом из языков.

В случае если нужна задержка 0 невозможно получить регистровый выход, любой регистр даёт задержку в 1 такт.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Посоветуйте как написать на верилоге модуль задержки сигнала с кодом управления от 0 до N.

При коде 0 сигнал проходит напрямую, не 0 - с задержкой. Можно ли получить регистровый выход а не комбинационный?

В каких попугаях задержка: километрах, секундах, тактах?

На верилоге можно написать много всякого, но совсем не всё это реализуемо в железе. Будет проще, если Вы огласите саму задачу, для которой понадобилась такая задержка.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Обычная линия задержки, несколько строчек на любом из языков.

В случае если нужна задержка 0 невозможно получить регистровый выход, любой регистр даёт задержку в 1 такт.

Так я и думал.... Хотелось получить что-то универсальное, а то с 0 какая-то условность получается. Может в 1 каскаде использовать регистр с синхронным SETом как-то?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так я и думал.... Хотелось получить что-то универсальное, а то с 0 какая-то условность получается. Может в 1 каскаде использовать регистр с синхронным SETом как-то?

Generate вам в помощь. Что-то типа :

generate
if(P_DELAY == 0)
assign odata = idata;
else
begin
....
end
endgenerate

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Если запас по времени позволяет, то можно сделать выходной регистр, работающий по противоположному фронту, таким образом он не внесет задержки на 1 такт (внесет на пол-такта, что, если по времени все в порядке, не даст задержки).

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сделаем из этой темы аналог Странные вопросы по VHDL, только для верилога.

 

Вопрос: как в Verilog сделать:

имеем модуль, у которого есть порт на выход (пусть условно будет 3 бита). Модуль инстантируется в более верхнем модуле. Нужно один из битов порта никуда не подключать. Примерно так:

.port1_out({port1_out[0], ничего, port1_out[1]}).

Как это сделать максимально красиво? Можно объявить однобитный wire, никуда его не подключать, прописать вместо "ничего". Можно даже не объявлять, он итак будет однобитным. А красиво как?

 

В VHDL например можно сделать так:

port1_out(2) <= port1_out(0),

port1_out(1) <= open,

port1_out(0) <= port1_out(1)

 

А как в верилоге сделать аналог опен?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сделаем из этой темы аналог Странные вопросы по VHDL, только для верилога.

 

Вопрос: как в Verilog сделать:

имеем модуль, у которого есть порт на выход (пусть условно будет 3 бита). Модуль инстантируется в более верхнем модуле. Нужно один из битов порта никуда не подключать. Примерно так:

.port1_out({port1_out[0], ничего, port1_out[1]}).

Как это сделать максимально красиво? Можно объявить однобитный wire, никуда его не подключать, прописать вместо "ничего". Можно даже не объявлять, он итак будет однобитным. А красиво как?

 

В VHDL например можно сделать так:

port1_out(2) <= port1_out(0),

port1_out(1) <= open,

port1_out(0) <= port1_out(1)

 

А как в верилоге сделать аналог опен?

Правильнее всего прицепить выход к 3-битному wire (или logic - кому как удобнее) и далее задействовать из этого вектора только 2 бита. Это самый error proof способ. Всё остальное чревато разными неприятными последствиями.

З Ы Будет варнинг на висящий в воздухе выход и цепь с одним коннектом - игнорировать.

З Ы 2 Ещё более правильно сделать внутренний модуль с параметром, который определяет ширину выходной шины.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Примерно так:

.port1_out({port1_out[0], ничего, port1_out[1]}).

 

"ничего" - это 1'bx. Или надо в другую сторону?

 

В другую сторону, просто дописать туда "dummy_bit" - он объявится сам (implicit) как 1-битный wire. IMHO так оно красивее всего (на мой взгляд, красиво == максимально компактно, т.е. без лишних объявлений, строк и вообще, букв, чему такой способ полностью соответствует).

 

module t (in, out);
input [2:0] in;
output [2:0] out;
assign out = ~in;
endmodule


module top (in, out);
input [1:0] in;
output [1:0] out;

t t_inst (.in({in[1],1'bx,in[0]}), .out({out[1], dummy_bit, out[0]}));

endmodule

 

Имеем лишь один варнинг по поводу одного бита входа, который "floating".

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В VHDL например можно сделать так:

port1_out(2) <= port1_out(0),

port1_out(1) <= open,

port1_out(0) <= port1_out(1)

В VHDL так сделать нельзя.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В другую сторону, просто дописать туда "dummy_bit" - он объявится сам (implicit) как 1-битный wire. IMHO так оно красивее всего (на мой взгляд, красиво == максимально компактно, т.е. без лишних объявлений, строк и вообще, букв, чему такой способ полностью соответствует).

 

module t (in, out);
input [2:0] in;
output [2:0] out;
assign out = ~in;
endmodule


module top (in, out);
input [1:0] in;
output [1:0] out;

t t_inst (.in({in[1],1'bx,in[0]}), .out({out[1], dummy_bit, out[0]}));

endmodule

 

Имеем лишь один варнинг по поводу одного бита входа, который "floating".

Очень плохая привычка не объявлять сигналы. В случае если dummy_bit не однобитный реально сгенерится однобитный вектор. В общем bad coding style.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

да я обычно шину всю вывожу, а уже потом при разборе забиваю ее сигналами

 

ResetModule ResetInstance(.out(reset_vector));

 

assign {reset3, reset2, dummy, reset1, reset0} = reset_vector;

 

а для пущей понятности еще и их объявляю явно, чтобы не было сомнений с длинной и назначением

 

По мне как раз не читаемо когда все в одну строку очень длинную, с кучей скобой и подскобок, с объявлениями прямо внутри и так далее...

А когда все структурировано и блоками, даже много текста - читаемей и красивее и надежнее...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Очень плохая привычка не объявлять сигналы. В случае если dummy_bit не однобитный реально сгенерится однобитный вектор. В общем bad coding style.

Плохая привычка и "bad coding style", это:

1) не использовать все возможности языка.

2) объявлять то, что объявлять бессмысленно.

3) вообще, тратить байты и силы на написание ненужных букв.

 

По причинам 2) и 3) - VHDL весь целиком это "bad coding style" :)

 

И это не сигнал. Сигнал подразумевает протекание тока - соединение входа с выходом. В данном случае, это лишь очень удобная возможность языка, позволяющая никуда не подсоединить один бит.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

"ничего" - это 1'bx. Или надо в другую сторону?
В другую, это же выход из более нижестоящего модуля в верхний.

 

В другую сторону, просто дописать туда "dummy_bit" - он объявится сам (implicit) как 1-битный wire. IMHO так оно красивее всего (на мой взгляд, красиво == максимально компактно, т.е. без лишних объявлений, строк и вообще, букв, чему такой способ полностью соответствует
Ну я так в исходном сообщении и предложил, сказав, что это некрасиво.

А красиво это как в VHDL типа open написать.

Но как сказали, и в вхдл так нельзя.

 

 

Правильнее всего прицепить выход к 3-битному wire (или logic - кому как удобнее) и далее задействовать из этого вектора только 2 бита.
Это тоже модификация того, что я предлагал в начале. Прямые и очевидные способы я и так знаю )

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...