A,b,c,d,e,f,g: OUTPUT


}

BEGIN

TABLE

i[3..0]=> a,b,c,d,e,f,g;

H”0”=>1,1,1,1,1,1,0;

H”1”=>0,1,1,0,0,0,0;

H”2”=>1,1,0,1,1,0,1;

H”3”=>1,1,1,1,0,0,1;

H”4”=>0,1,1,0,0,1,1;

H”5”=>1,0,1,1,0,1,1;

H”6”=>1,0,1,1,1,1,1;

H”7”=>1,1,1,0,0,0,0;

H”8”=>1,1,1,1,1,1,1;

H”9”=>1,1,1,1,0,1,1;

H”A”=>1,1,1,0,1,1,1;

H”B”=>0,0,1,1,1,1,1;

H”C”=>1,0,0,1,1,1,0;

H”D”=>0,1,1,1,1,0,1;

H”E”=>1,0,0,1,1,1,1;

H”F”=>1,0,0,0,1,1,1.

END TABLE;

END.

В этом примере в таблице перечислены все возможные шестнадцатеричные цифры и соответствующие им состояния выводов. Если необходимо реализовать дешифратор, учитывающий «не все» состояния входов т.е. с повторяющимися (несущественными) состояниями, то такие состояния обозначают символом Х. например рассмотрим дешифратор, реализующий определение области памяти, к которой обращается микропроцессор. Т.е. всю память разделим на несколько участков:

1. ПЗУ (имеющие адреса, начинающиеся с 00)

2. ФЗУ (имеющие адреса, начинающиеся с 100)

А так же 3 устройства, имеющие конкретные адреса.

SUBDESIGN decode3

{ Addr [15..0], m.io: INPUT;

ROM, RAM, PRINT, SP [2..1]: OUTPUT

}

BEGIN

TABLE

m_io, addr [15..0] => ROM, RAM, PRINT, SP [];

1, B “00xxxxxxxxxxxxx” => 1, 0, 0, B “00”;

1, B “100xxxxxxxxxxxx” => 0, 1, 0, B “00”;

0, B “0000010101100000” => 0, 0, 1, B “00”;

0, B “0001010110101100” => 0, 0, 0, B “10”;

0, B “0000110111010011” => 0, 0, 0, B “01”;

END TABLE;

END.

m_io предназначен для выбора к чему обращается микропроцессор. Если m_io = 1, то микропроцессор обращается к памяти. Если m_io = 0, то микропроцессор обращается к устройству ввода и вывода.

Использование для переданных значений по умолчанию на языке AHDL.

Можно определить значение по умолчанию для узла или группы, которые будут автоматически использоваться для них, если в файле их значения не будут заданы. Язык AHDL позволяет присваивать значения узлу или группе неоднократно и, если произойдет конфликт, система автоматически будет использовать значение по умолчанию. Если значения по умолчанию не были заданы, то узлам и группам автоматически присваивается значение GND или все 0. Значение по умолчанию можно использовать и в условных операторах IF и CASE.

Рассмотрим пример:

Пусть на вход системы подается шестнадцатеричный одноразрядный код. На выходе системы должен появиться соответствующий ASCII код. А если одновременно поданы сигналы на несколько входов, то устройство должно выдавать «?».

SUBDESIGN Default 1

{ i [3..0]: INPUT;

ASCII_CODE OUTPUT;}

BEGIN

DEFAULTS

ASCII_CODE [] = b “01111111”; % “?”

END DEFAULTS

TABLE

I [3..0] => ASCII_CODE;

B “1000” => B “01100001”; % “a”

B “0100” => B “01100010”; % “b”

B “0010” => B “01100011”; % “c”

B “0001” => B “01100100”; % “d”

END TABLE;

END.

Реализация двунаправленных выводов.

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

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

SUBDESIGN BUS_REG

{ CLIK, OF: INPUT;

IO: BIDIR

}

BEGIN

IO = TRI (DFF (IO, CLK,,), OE)

END.

Двунаправленный сигнал IO запускается примитивом TRI, используется в качестве входа для D-триггера. Запятые в конце списка параметров определяют места для сигналов триггера SET и RESET. По умолчанию они установлены в неактивный уровень.

Последовательная логика.

Логическая схема называется последовательной, если выходы в заданный момент времени являются функцией входов не только в этот момент времени, но и вовремя предыдущего момента времени. Основными последовательностными элементами являются регистры и триггеры. Для описания триггеров используются примитивы Dff D-триггер, DFFE, D-триггер с выходом разрешения работы, TFF, JKFF и т.д.

Объявление регистров на языке AHDL.

Рассмотрим пример, в котором регистр из 8 бит фиксирует значения на выходах данных D по фронту синхроимпулься при условии, что на вход разрешение работы LOAD подана единица.

SUBDESIGN r8

{ CLK, LOAD, d [7..0]: INPUT

Q [7..0]: OUTPUT}

VARIABLE

ff [7..0]: DFFE

BEGIN

ff [] CLK = CLK;

ff [] ENA = LOAD;

ff[] d = d[]

q [] = ff [Q]

END.

Создание счетчиков.

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


SUBDESIGN Schet

{ CLK, LOAD, CLR, d [15..0] ENA: INPUT;

q [15..0]: OUTPUT}

VARIABLE

COUNT [15..0]: OFF;

BEGIN

COUNT f [ ]: CLK = CLK;

COUNT [ ] CLRN = CLR;

IF LOAD THEN

COUNT [ ] = d[ ];

ELSIF ENA THEN

COUNT [ ] d = COUNT [ ] q-1;

ELSE

COUNT [ ] d = COUNT [ ] q;

END IF

q [ ] = COUNT [ ];

END

Назначение входов счетчика:

CLK – вход счетных импульсов.

LOAD – вход параллельной загрузки начального значения импульса.

ENA – вход разрешения счета.

CLR – вход сброса. При подаче 1 все триггеры асинхронно сбрасываются.

 



Дата добавления: 2022-05-27; просмотров: 81;


Поиск по сайту:

Воспользовавшись поиском можно найти нужную информацию на сайте.

Поделитесь с друзьями:

Считаете данную информацию полезной, тогда расскажите друзьям в соц. сетях.
Poznayka.org - Познайка.Орг - 2016-2024 год. Материал предоставляется для ознакомительных и учебных целей.
Генерация страницы за: 0.013 сек.