IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> Active HDL 7.2
сообщение
Сообщение #1


Fanat
***

Группа: Пользователи
Сообщений: 261
Пол: Мужской
Реальное имя: Сергей

Репутация: -  5  +


Задача такая: необходимо написать декодер который взависимости от того что получает на свои 4 входа (нули или единички) выдаёт на 7 выходов тоже нули или единички. Как нибудь это можно сделать не через if'ы а то уж слишком длинный код получиться. Может как то через swith? Если он вообще есть в vhdl. Я тут совсем новичок.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Michael_Rybak
*****

Группа: Пользователи
Сообщений: 1 046
Пол: Мужской
Реальное имя: Michael_Rybak

Репутация: -  32  +


в таких ситуациях лучше всего константную табличку пар вход-выход делать, и бегать по ней.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Fanat
***

Группа: Пользователи
Сообщений: 261
Пол: Мужской
Реальное имя: Сергей

Репутация: -  5  +


Цитата(Michael_Rybak @ 8.12.2007 13:02) *

в таких ситуациях лучше всего константную табличку пар вход-выход делать, и бегать по ней.


Не мог-бы ты поточнее рассказать как её делать...или сказать где почитать про это?..
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


code warrior
****

Группа: Пользователи
Сообщений: 484
Пол: Мужской
Реальное имя: Славен

Репутация: -  8  +


Цитата(Fanat @ 8.12.2007 13:09) *


Не мог-бы ты поточнее рассказать как её делать...или сказать где почитать про это?..

switch есть в VHDL, насчет Active HDL не знаю.

Тебе требуется синхронный декодер или комбинаторный?

Если синхронный, то описываешь процесс с тактированием и сигналом сброса, внутри него будет твой switch.
Если комбинаторный, то внутри описания декодера прописываешь when-конструкцию, аналогичную switch'у.


--------------------
ИзВ ин ИтЕ зА нЕ рОв НЫй П оч ЕРк
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Michael_Rybak
*****

Группа: Пользователи
Сообщений: 1 046
Пол: Мужской
Реальное имя: Michael_Rybak

Репутация: -  32  +


Я не знаю языка, поэтому пример схематический, почти на паскале (не компилил):

const inout: array[1 .. 16, 1 .. 4 + 7] of byte = 
(
(0, 1, 1, 0, {это был вход} 1, 1, 1, 0, 0, 0, 1 {а это - выход}),
(1, 0, 1, 0, {это был вход} 0, 1, 0, 1, 1, 0, 1 {а это - выход}),
(0, 0, 0, 1, {это был вход} 1, 1, 1, 1, 1, 1, 1 {а это - выход}),
...
);

function Match(v_in: array[1 .. 4] of byte): array[1 .. 7] of byte;
var i, j: byte;
res: array[1 .. 7] of byte;
begin
for i := 1 to 16 do
if (v_in[1] = inout[i, 1]) and
(v_in[2] = inout[i, 2]) and
(v_in[3] = inout[i, 3]) and
(v_in[4] = inout[i, 4]) then begin
for j := 1 to 7 do
res[j] := inout[i, j + 4];
break;
end;

Match := res;
end;


 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


N337
****

Группа: Пользователи
Сообщений: 737
Пол: Мужской

Репутация: -  26  +


Пока писал только на AHDL, но
Цитата
13. В части AHDL-файла, называемой Logic Section, могут находиться выражения, называемые таблицами истинности. Выражение из AHDL, соответствующее таблице истинности, выглядит следующим образом:
Код
TABLE
    __node_name,__node_name =>__node_name,
                                         __node_name;
    __input_value,__input_value =>__output_value,
                                         __output _value;
    __input_value,__input_value =>__output_value,
                                         __output _value;
END TABLE;

Данному выражению нет прямой аналогии в VHDL, поэтому необходимо воспользоваться выражениями типа Concurrent_signal, «IF — THEN » или CASE, в зависимости от того,входит ли таблица истинности в выражение PROCESS или нет.
(http://www.compitech.ru/html.cgi/arhiv/03_01/stat_126.htm)

Цитата
Я не знаю языка, поэтому пример схематический, почти на паскале (не компилил):
VHDL - это не алгоритмический язык, а язык описания аппаратуры (по-сути - конечных автоматов). Характерная черта языков этой группы (VHDL, Verilog HDL, AHDL и пр.) - внутри некоторого блока все предложения выполняются одновременно smile.gif


--------------------
The idiots are winning.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Michael_Rybak
*****

Группа: Пользователи
Сообщений: 1 046
Пол: Мужской
Реальное имя: Michael_Rybak

Репутация: -  32  +


Цитата
VHDL - это не алгоритмический язык


Ну я, прежде чем постить, в википедию заглянул; в примерах увидел там ифы, решил, что можно smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


code warrior
****

Группа: Пользователи
Сообщений: 484
Пол: Мужской
Реальное имя: Славен

Репутация: -  8  +


Цитата(Michael_Rybak @ 9.12.2007 6:41) *


Ну я, прежде чем постить, в википедию заглянул; в примерах увидел там ифы, решил, что можно smile.gif

Написать,то можно. И даже парсер подобный код (процедурный) может пропустить. Проблема в том, что практически любой синтезатор нафиг отвергнет такое издевательство над собой. Каждый, кто с ПК переходил к программированию логики наступал на эти грабли.


--------------------
ИзВ ин ИтЕ зА нЕ рОв НЫй П оч ЕРк
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Fanat
***

Группа: Пользователи
Сообщений: 261
Пол: Мужской
Реальное имя: Сергей

Репутация: -  5  +


Спасибо всем за помошь...
Код

architecture Decoder73 of Decoder73 is
begin
   process(Input0, Input1,Input2, Input3)
   variable Eop : STD_LOGIC_Vector(3 downto 0);
   variable Eos : STD_LOGIC_Vector(6 downto 0);
   begin
       Eop(3):=Input0;
       Eop(2):=Input1;
       Eop(1):=Input2;
       Eop(0):=Input3;
      
        C1: case Eop is
                     when "0001" =>  Eos :=    "0000001";
         when "0010" =>  Eos :=    "0000010";
         when "0100" =>  Eos :=    "0000100";
                                 ........................
         when others =>  Eos := "0000000";
        end case C1;
        
      
       Output0 <= Eos(0);
       Output1 <= Eos(1);
       Output2 <= Eos(2);
       Output3 <= Eos(3);
       Output4 <= Eos(4);
       Output5 <= Eos(5);
       Output6 <= Eos(6);
        
   end process;
end Decoder73;


А я вот так сделал...Языка тоже незнаю...Но всё работает... good.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 31.10.2020 0:00
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name