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

Использование CASE на VHDL

Уважаемые коллеги, подскажите, плз.

Привожу кусок кода:

 

process(adr)

begin

case(adr) is

when h1=>hout<=B"001";

when h2=>hout<=B"010";

when h3=>hout<=B"011";

when h4=>hout<=B"100";

when h5=>hout<=B"101";

when h6=>hout<=B"110";

when h7=>hout<=B"111";

when others =>hout<=B"000";

end case;

end process;

h1..h7 - задаваемые извне (а не константами) условия. При компиляции Quartus сказал, что условия WHEN должны быть заданы только константами. А что мне делать, если мне нужно работать с переменными значениями условий?

Изменено пользователем Vlad362

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


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

process(adr)

begin

case(adr) is

when adr1=>hout<=B"001";

when adr2=>hout<=B"010";

when adr3=>hout<=B"011";

when adr4=>hout<=B"100";

when adr5=>hout<=B"101";

when adr6=>hout<=B"110";

when adr7=>hout<=B"111";

when others =>hout<=B"000";

end case;

end process;

 

а эти значения заведи в шину ADR

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


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

Если и adr, и h(i) - переменные, то поставить кучу if...elsif...elsif... Только результат будет отличаться от case. В случае case'а был бы мультиплексор, а так - куча схем сравнения.

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


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

Если и adr, и h(i) - переменные, то поставить кучу if...elsif...elsif... Только результат будет отличаться от case. В случае case'а был бы мультиплексор, а так - куча схем сравнения.

так уже сделал, так работает. Я надеялся, что можно сделать красиво, через WHEN

 

process(adr)

begin

case(adr) is

when adr1=>hout<=B"001";

when adr2=>hout<=B"010";

when adr3=>hout<=B"011";

when adr4=>hout<=B"100";

when adr5=>hout<=B"101";

when adr6=>hout<=B"110";

when adr7=>hout<=B"111";

when others =>hout<=B"000";

end case;

end process;

 

а эти значения заведи в шину ADR

Этой идеи я не понял, ведь adr[1..7] это разряды шины adr, а h1..h7 - это вектора с разрядностью шины adr. Фактически я делаю адресный дешифратор с возможностью перенастройки селектируемых адресов извне.

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


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

Наверное в описании языка case подразумевает константы. Мне кажется естественным, что case так устроен.

Если и adr, и h(i) - переменные, то поставить кучу if...elsif...elsif... Только результат будет отличаться от case. В случае case'а был бы мультиплексор, а так - куча схем сравнения.

Мультиплексор и схемы сравнения будут в микросхеме, в которой есть мультиплексоры и схемы сравнения :)

А в FPGA результат будет всегда одинаковый - куча LUT-ов (память или что там есть в ячейках) с проводами. Как ни выпендривайся.

 

Назовем ширину (adr и условий h1..h7) w.

Как ни записывай, все равно у вас есть w проводов для addr и еще w*7 для условий.

Всего w*8 проводов. Вот из этого вам и нужно получить каждый из трех битов hout.

 

А еще я не понимаю, что должна делать ваша схема, если h1=h2 ?

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


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

Уважаемые коллеги, подскажите, плз.

Привожу кусок кода:

 

process(adr)

begin

case(adr) is

when h1=>hout<=B"001";

when h2=>hout<=B"010";

when h3=>hout<=B"011";

when h4=>hout<=B"100";

when h5=>hout<=B"101";

when h6=>hout<=B"110";

when h7=>hout<=B"111";

when others =>hout<=B"000";

end case;

end process;

h1..h7 - задаваемые извне (а не константами) условия. При компиляции Quartus сказал, что условия WHEN должны быть заданы только константами. А что мне делать, если мне нужно работать с переменными значениями условий?

 

 

учим матчасть

 

IEEE Standard VHDL Language Reference Manual -> 8.8 Case statement ->

........

If the expression is of a one-dimensional character array type, then the expression must be one of the

following:

The name of an object whose subtype is locally static

— An indexed name whose prefix is one of the members of this list and whose indexing expressions are

locally static expressions

— A slice name whose prefix is one of the members of this list and whose discrete range is a locally

static discrete range

— A function call whose return type mark denotes a locally static subtype

— A qualified expression or type conversion whose type mark denotes a locally static subtype.

........

 

IEEE Standard VHDL Language Reference Manual -> 7.4 Static expressions -> 7.4.1 Locally static primaries ->

......

locally static primary is defined to be one of the following:

.....................

B) A constant (other than a deferred constant) explicitly declared by a constant declaration and initialized

with a locally static expression

c) An alias whose aliased name (given in the corresponding alias declaration) is a locally static primary

d) A function call whose function name denotes an implicitly defined operator, and whose actual

parameters are each locally static expressions

....

 

Ждите поддержку VHDL-2006/2007/2008

 

Удачи!

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


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

Уважаемые коллеги, подскажите, плз.

Привожу кусок кода:

 

process(adr)

begin

case(adr) is

when h1=>hout<=B"001";

when h2=>hout<=B"010";

when h3=>hout<=B"011";

when h4=>hout<=B"100";

when h5=>hout<=B"101";

when h6=>hout<=B"110";

when h7=>hout<=B"111";

when others =>hout<=B"000";

end case;

end process;

h1..h7 - задаваемые извне (а не константами) условия. При компиляции Quartus сказал, что условия WHEN должны быть заданы только константами. А что мне делать, если мне нужно работать с переменными значениями условий?

 

после when всегда должно следовать либо конкретное число (константа) либо математическое выражение результат которого тоже константа (вычисляемое значение, например при параметризации модуля).

Вписать переменную туда никак не удастся т.к. компилятор должен для синтезирования схемы в железе точно рассчитать значение под when.

 

 

P.S. а то что вы написали по-моему более похоже на with ... select ?

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


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

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

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

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

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

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

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

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

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

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