Задача такая: необходимо написать декодер который взависимости от того что получает на свои 4 входа (нули или единички) выдаёт на 7 выходов тоже нули или единички. Как нибудь это можно сделать не через if'ы а то уж слишком длинный код получиться. Может как то через swith? Если он вообще есть в vhdl. Я тут совсем новичок.
Michael_Rybak
8.12.2007 17:02
в таких ситуациях лучше всего константную табличку пар вход-выход делать, и бегать по ней.
Fanat
8.12.2007 17:09
Цитата(Michael_Rybak @ 8.12.2007 13:02)
в таких ситуациях лучше всего константную табличку пар вход-выход делать, и бегать по ней.
Не мог-бы ты поточнее рассказать как её делать...или сказать где почитать про это?..
hardcase
8.12.2007 21:08
Цитата(Fanat @ 8.12.2007 13:09)
Не мог-бы ты поточнее рассказать как её делать...или сказать где почитать про это?..
switch есть в VHDL, насчет Active HDL не знаю.
Тебе требуется синхронный декодер или комбинаторный?
Если синхронный, то описываешь процесс с тактированием и сигналом сброса, внутри него будет твой switch. Если комбинаторный, то внутри описания декодера прописываешь when-конструкцию, аналогичную switch'у.
Michael_Rybak
9.12.2007 4:00
Я не знаю языка, поэтому пример схематический, почти на паскале (не компилил):
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;
xds
9.12.2007 10:36
Пока писал только на AHDL, но
Цитата
13. В части AHDL-файла, называемой Logic Section, могут находиться выражения, называемые таблицами истинности. Выражение из AHDL, соответствующее таблице истинности, выглядит следующим образом:
Данному выражению нет прямой аналогии в VHDL, поэтому необходимо воспользоваться выражениями типа Concurrent_signal, «IF — THEN » или CASE, в зависимости от того,входит ли таблица истинности в выражение PROCESS или нет.
Я не знаю языка, поэтому пример схематический, почти на паскале (не компилил):
VHDL - это не алгоритмический язык, а язык описания аппаратуры (по-сути - конечных автоматов). Характерная черта языков этой группы (VHDL, Verilog HDL, AHDL и пр.) - внутри некоторого блока все предложения выполняются одновременно
Michael_Rybak
9.12.2007 10:41
Цитата
VHDL - это не алгоритмический язык
Ну я, прежде чем постить, в википедию заглянул; в примерах увидел там ифы, решил, что можно
hardcase
9.12.2007 17:08
Цитата(Michael_Rybak @ 9.12.2007 6:41)
Ну я, прежде чем постить, в википедию заглянул; в примерах увидел там ифы, решил, что можно
Написать,то можно. И даже парсер подобный код (процедурный) может пропустить. Проблема в том, что практически любой синтезатор нафиг отвергнет такое издевательство над собой. Каждый, кто с ПК переходил к программированию логики наступал на эти грабли.
Fanat
9.12.2007 17:11
Спасибо всем за помошь...
Код
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;