Помощь - Поиск - Пользователи - Календарь
Полная версия: Active HDL 7.2
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Ада и другие языки
Fanat
Задача такая: необходимо написать декодер который взависимости от того что получает на свои 4 входа (нули или единички) выдаёт на 7 выходов тоже нули или единички. Как нибудь это можно сделать не через if'ы а то уж слишком длинный код получиться. Может как то через swith? Если он вообще есть в vhdl. Я тут совсем новичок.
Michael_Rybak
в таких ситуациях лучше всего константную табличку пар вход-выход делать, и бегать по ней.
Fanat
Цитата(Michael_Rybak @ 8.12.2007 13:02) *

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


Не мог-бы ты поточнее рассказать как её делать...или сказать где почитать про это?..
hardcase
Цитата(Fanat @ 8.12.2007 13:09) *


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

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

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

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

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
Пока писал только на 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
Michael_Rybak
Цитата
VHDL - это не алгоритмический язык


Ну я, прежде чем постить, в википедию заглянул; в примерах увидел там ифы, решил, что можно smile.gif
hardcase
Цитата(Michael_Rybak @ 9.12.2007 6:41) *


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

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

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
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.