47981 (Основы языка VHDL), страница 2

2016-07-30СтудИзба

Описание файла

Документ из архива "Основы языка VHDL", который расположен в категории "". Всё это находится в предмете "информатика" из 1 семестр, которые можно найти в файловом архиве . Не смотря на прямую связь этого архива с , его также можно найти и в других разделах. Архив можно найти в разделе "курсовые/домашние работы", в предмете "информатика, программирование" в общих файлах.

Онлайн просмотр документа "47981"

Текст 2 страницы из документа "47981"

3. Операции сложения/вычитания

4. Операции умножения/деления

5. Прочие

Приоритет операций возрастает от категории 1 к категории 5. Операции одной категории имеют одинаковый приоритет и выполняются в последовательности: слева направо. Скобки используются для изменения последовательности исполнения.

Операции логические

Существует шесть логических операций: and, or, nand, nor, xor, not.

Операции применимы к типам BIT, BOOLEAN, к одноразмерным массивам BIT и BOOLEAN. При выполнении битовые значения ‘0’ и ‘1’ интерпретируются как булевские FALSE и TRUE. Результат имеет тот же тип, что и операнды. Операция not – унарная операция, она имеет приоритет категории 5.

Операции отношений

В языке VHDL имеются следующие операции отношений:

=, /=, <, , >=

Результатом выполнения любой операции отношений является булевское выражение BOOLEAN. Операции равенства ( = ) и неравенства ( /= ) допустимы со всеми типами, за исключением типа “файл”. Остальные четыре операции допустимы над скалярными типами (целочисленными, перечислимыми) или над массивами дискретного типа. Когда операндами являются массивы, то сравнение выполняется слева направо по одному элементу, например при следующем сравнении:

BIT_VECTOR'('0', '1', '1') < BIT_VECTOR'('1', '0', '1')

получен результат TRUE, т.к. первый элемент вектора слева меньше первого элемента вектора справа. Другой пример, если декларирован тип:

type MVL is ('U', '0', '1', 'Z' );

то результат сравнения:

MVL'( 'U' ) < MVL'( 'Z' )

будет TRUE, т.к. ‘U’ находится левее ‘Z’.

Операции суммирования, вычитания, конкатенации

Операции имеют обозначения:

+, -, &.

Операнды, участвующие в операциях сложения ( + ) и вычитания ( - ) должны быть одного числового типа, результат оказывается того же типа. Операндами в конкатенации ( & ) могут быть или отдельные элементы или одномерные массивы. Результат выдается в виде массива, например при выполнении конкатенации:

‘0’ & ‘1’

образуется массив символов “01”, или еще пример:

‘C’ & ‘A’ & ‘T’

дает “CAT”.

Операции умножения, деления

К этой группе оператций относятся: *, /, mod, rem.

Операнды умножения ( * ) и деления ( / ) должны быть одновременно либо целочисленного типа (integer) либо типа с плавающей запятой (floating point). Результат всегда того типа, что и операнды. Операция умножения может иметь один операнд физического типа, а другой – либо целочисленного, либо натурального типа. Результат выдается в виде физического типа.

В операции деления допустимо делить объект физического типа на целочисленный или натуральный. Результат - всегда физического типа. Деление физического типа на физический дает целочисленный результат.

Операции остатка ( rem ) и “деления по модулю” ( mod ) в качестве операндов могут иметь целочисленные типы и результат - целочисленного типа. Результат rem имеет знак первого операнда и определяется следующим образом:

A rem B = A - ( A / B ) * B

Результат mod имеет знак второго операнда и определяется следующим образом:

A mod B = A – B * N,

где N – некоторое целое.

Прочие операции

К их числу следует отнести: Abs, ** и другие. Операция выделения абсолютного значения ( abs ) совместима с любым числовым типом операнда. Операция возведения в степень ( ** ) операндом слева имеет целое или тип с плавающей точкой, а в качестве правого операнда (степень) - только целое.


1.6 Последовательные операторы

К последовательным операторам (Sequential Statements) относятся операторы присваивания (Assignment Statements), условные операторы if (if Statements) и case (case Statements), операторы цикла (loop - next Statements) и другие. Рассмотрим некоторые из операторов этого типа

Оператор присваивания

Эти операторы делятся на операторы присваивания переменной (обозначается знаком :=) и операторы назначения сигнала (<=). В обоих случаях снаала вычисляется значение выражения, стоящее справа от знака равенства, а затем полученное значение присваивается переменной или сигналу, стоящим слева от знака. Например, оператор

abar := not a;

задает новое значение переменной abar, а именно – инверсное значение a.

Оператор

z <= not (a and b);

задает новое значение сигнала z, которое получается справа от знака <=.

Оператор if

В общем случае if представляет собой последовательность выражений, оговаривающих условия. В качестве условий применимы любые выражения, при вычисление которых получается булевская величина (FALSE и TRUE).

if булевское_выражение then

последовательностные_выражения

[elsif булевское_выражение then

последовательностные_выражения ]

[else

последовательностные_выражения]

end if;

Выражение if вычисляется путем просмотра условий одного за другим, пока не будет найдено истинное. Затем вычисляется набор последовательностных выражений, связанных с этим условием. Предложений вида elsif в выражении if может быть от 0 и более. Может использоваться и предложение else. Выражения if могут вкладываться одно в другое без ограничений.

Рассмотрим простой пример.

if CTRL = '1' then

MUX_OUT<= "10";

else

MUX_OUT<= "01";

end if;

Если управляющий сигнал CTRL1 равен ‘1’, то выходной сигнал MUX_OUT принимает значение "10", иначе MUX_OUT примет значение "01". На этом оператор if завершается.

Рассмотрим более сложный пример.

if CTRLI = '1' then

if CTRL2 = '0' then

MUX_OUT<= "0010";

else

MUX_OUT<= "0001";

end if;

else

if CTRL2 = '0' then

MUX_OUT <= "1000";

else

MUX_OUT <= "0100";

end if;

end if;

Если управляющий сигнал CTRL1 равен ‘1’, тогда при условии (открывается вложенное if) CTRL2=’0’ выходной сигнал MUX_OUT<= "0010", иначе (т.е. при любых других значениях сигнала CTRL2) MUX_OUT<= "0001". Здесь завершается внутренний (вложенный) оператор if. Иначе (т.е. при любых других значениях сигнала CTRL1), если (открывается новый вложенный оператор if) CTRL2=’0’, тогда MUX_OUT<= "1000", иначе (т.е. при любых других значениях сигнала CTRL2) MUX_OUT<= "1000". Здесь завершается внутренний (вложенный) оператор if, а также завершается и наружный.

Оператор case

Оператор case имеет следующий формат:

case выражение is

when вариант выбора => последовательностные_выражения

when вариант выбора => последовательностные_выражения

-- произвольное число вариантов выбора.

when others => последовательностные_выражения]

end case;

При вычислении выражения case выбирается одна из ветвей в соответствии со значением выражения. Выражение может иметь значения типа перечислимого или типа одномерного массива. Рассмотрим пример:

type WEEK_DAY is (MON, TUE, WED, THU, FRI, SAT, SUN);

type DOLLARS is range 0 to 10;

variable DAY: WEEK_DAY;

variable POCKET_MONEY: DOLLARS;

case DAY is

when TUE => POCKET_MONEY := 6; -- ветвь 1

when MON I WED => POCKET_MONEY := 2; -- ветвь 2

when FRI to SUN => POCKET_MONEY := 7; -- ветвь 3

when others => POCKET_MONEY := 0; -- ветвь 4

end case;

Переменная WEEK_DAY имеет значения перечислимого типа (дни недели). Переменная DOLLARS имеет целочисленные значения в диапазоне от 0 до 10. Ветвь 1 выбирается, когда день недели TUE. Ветвь 2 выбирается в случае когда дни недели MON или WED (вертикальная черта означает ИЛИ). Ветвь 3 покрывает значения от FRI до SUN, т.е. FRI, SAT и SUN. Ветвь 4 покрывает все оставшиеся значения, т.е. THU.

Оператор loop

Оператор loop используется для задания итерации набора последовательных выражений.

[ярлык для loop: ] итерационная схема loop

последовательностные_выражения

end loop [ярлык для loop ] ;

Существует три итерационных схемы. Первая имеет форму:

for идентификатор in диапазон

Пример использования схемы:

FACTORIAL := 1;

for NUMBER in 2 to N loop

FACTORIAL := FACTORIAL * NUMBER;

end loop;

Тело loop исполняется N-1 раз, при этом идентификатор NUMBER в конце каждой итерации увеличивается на 1. Подразумевается, что идентификатор целочисленного типа и значения его лежат в диапазоне от 2 до N.

Второй итерационной схемой является следующая:

while булевскоe_выражение

Пример использования схемы:

J:=0;SUM:=10;

WH-LOOP: while J<20 loop -- loop имеет ярлык WH_LOOP

SUM := SUM * 2;

J:=J+3;

end loop;

Выражения в теле loop выполняются одно за другим и эта последовательность повторяется, пока условие J<20 истинно.

Третьей cхемой является конструкция, в которой итерационная схема не задается и выход из loop осуществляется с использованием выражений: exit, next или return, например:

SUM:=1;J:=0;

L2: loop --loop имеет ярлык

J:=J+21;

SUM := SUM* 10;

exit when SUM > 100;

end loop L2;

В этом примере выражение exit заставляет выходить из петли L2 когда SUM становится больше 100. При отсутствии выражения exit loop будет исполняться бесконечно.


1.7 Параллельные операторы

К параллельным операторам (Concurrent Statements) оператор process, оператор параллельного вызова процедуры, оператор конкретизаци компонента, оператор генерации (generate) и другие. Параллельные операторы определяют параллельное поведение схем, порядок их выполнения не зависит от их появления внутри блока.

Рассмотрим кратко оператор process. В общем виде он может быть записан следующим образом.

[имя процесса:][postponed] process [(список)]

раздел деклараций

begin

операторы

end process [имя процесса];

Имя процесса и ключевое слово [postponed] являются необязательными и часто отсутствуют. Список, находящийся после ключевого слова process, хотя и является необязательным, на практике используется достаточно часто для указания сигналов запуска. Перед ключевым словом могут находиться различного рода декларации типов, констант атрибутов и т. д.

Хотя процесс является параллельным оператором, он может содержать последовательные операторы. Внутри процессов не мегут быть декларированы сигналы.

1.8 Описание интерфейса устройства

В начале главы уже говорилось, что на моделируемое устройство в первую очередь следует посмотреть со стороны (“вид снаружи”) и для этого “черного ящика” определить интерфейс с внешним миром. Такая задача решается в VHDL декларацией интерфейса entity. Она задает имя описания, имена интерфейсных портов, направление передачи, тип портов. Порт – это сигнальная линия (шина), с помощью которой устройство (модель) взаимодействуют с окружающей средой. Например, для полусумматора (рис. 1.2) декларация будет выглядеть следующим образом:

Рис. 1.2. Полусумматор

entity half_adder is

port(a, b: in BIT; sum, cur: out BIT);

end half_adder;

Здесь описание с именем half_adder имеет два входных порта, a и b (in – означает входной порт), и два выходных порта, sum и carry (out – означает выходной порт). Тип портов определен как BIT – означает, что сигналы на линиях портов могут принимать значения: ‘0’ или ‘1’.

Другим примером может послужить дешифратор, показанный на рис. 1.3.

entity dec2x4 is

port(a, b, enable: in BIT; z: out BIT_VECTOR (0 to 3));

end dec2x4;

Здесь описание с именем dec2x4 имеет три входных порта и четыре выходных. Выходные порты описаны как массив. BIT_VECTOR – это одномерный массив, диапазон задается параметром Z (0 to 3).

Рис. 1.3. Декодер 2х4

Каждый интерфейсный порт может функционировать в следующих режимах:

in – значение порта только считывается для использования внутри модели,

out – значение порта может только обновляться моделью, но не считывается,

inout – двунаправленный порт, значение считывается и обновляется моделью,

buffer – буферный порт, значение считывается и обновляется моделью, но источником сигнала может быть либо буфер, либо одиночный источник.


1.9 Архитектура

Архитектура (architecture body) моделирует взгляд на устройство “изнутри”. Устройство может рассматриваться под разными углами и описываться по-разному. Оно может предстать либо как композиция более простых модулей (структурный стиль моделирования), либо как набор параллельно исполняемых алгоритмов (стиль dataflow), либо описано как процесс последовательного исполнения операций (стиль “поведенческий”), либо может быть раскрыто сочетанием указанных стилей.

С одним интерфейсом типа entity может быть связано несколько архитектур. Рассмотрение архитектурных стилей начнем с поведенческого (behavioral style).

Поведенческое описание

Функционирование устройства рассматривается как процесс последовательного вычисления выражений, входящих в process. Толчком к запуску процесса является изменение (event -событие) какого либо сигнала, из входящих в список “воспринимаемых” сигналов (sensitivity list). Этот список внешне очень похож на список параметров в других языках высокого уровня. Рассмотрим поведенческую модель декодера dec2х4 (рис.1.3). Декларация интерфейса его уже приводилась, а теперь она будет пополнена архитектурой поведенческого типа.

entity dec2x4 is

port(a, b, enable: in BIT; z: out BIT_VECTOR (0 to 3));

end dec2x4;

architecture dec_seq of dec2x4 is

begin

process (a, b, enable)

variable abar, bbar: BIT;

begin

abar:= not a; --выражение 1

bbar:= not b; -- выражение 2

If enable = ‘1’ then -- выражение 3

z(3) <= not (a and b); -- выражение 4

z(2) <= not (a and bbar); -- выражение 5

z(1) <= not (abar and b); -- выражение 6

z(0) <= not (abar and bbar); -- выражение 7

else z <= “1111”;

end if;

end process;

end dec_seq;

Архитектура имеет свое имя dec_seq. О принадлежности архитектуры к описанию интерфейса dec2х4 говорит выражение: dec_seq of dec2x4. Список сигналов, которыми запускается процесс, дан в скобках: process (a, b, enable). До начала процесса, если необходимо, декларируются переменные variable abar, bbar: BIT. Зона действия их ограничена данным процессом (от begin до end process). Предположим, что в момент T произошло изменение сигнала а. Новое значение переменной abar (выражение 1) вычисляется и присваивается без задержки – мгновенно (в качестве знака присваивания в данном случае используется =). Без задержки будут вычислены выражения 2 и 3.

Далее в ходе процесса одно за другим вычисляются выражения от 4 до 7, а новые значения сигналам z(0), z(1), z(2), z(3) будут присвоены (в качестве символа оператора присвоения используется <= ) лишь через некоторую, пусть даже фиктивную (бесконечно малую), задержку . Это существенное отличие процедур присвоения для переменных и для сигналов.

Рассмотрим пример мультиплексора 4х1 (рис.1.4). Четыре входных сигнала A, B, C и D выводятся через один порт Z. Коммутация осуществляется сигналом CTRL.

Рис. 1.4. Мультиплексор 4х1.

entity MUX is

port (A, B, C, D: in BIT; CTRL: in BIT_VECTOR(0 to 1);

Z: out BIT);

end MUX;

architecture MUX_BEHAVIOR of MUX is

begin

PMUX: process (A, B, C, D, CTRL)

variable TEMP: BIT;

begin

case CTRL is

when "00" => TEMP := A:

when "01" => TEMP := B;

when "10" => TEMP := C;

when "11" => TEMP := D;

end case;

Z <= TEMP;

end process PMUX;

end MUX_BEHAVIOR;

Архитектура получила название MUX_BEHAVIOR, процесс имеет ярлык PMUX. Переменной TEMP в зависимости от значения сигнала CTRL присваивается значение одного из входных портов: A, когда CTRL имеет значение “00”; B, когда CTRL имеет значение “01”; A, когда CTRL имеет значение “10”; D, когда CTRL имеет значение “11”.

Для описания синхросигналов обычно используется атрибу EVENT. Он истинен когда происходит “событие” - изменение сигнала. Например, поведение D-триггера, показанного на рис.1.5, можно описать так:

Рис.1.5. D-триггер

entity dff is

port (data, clk: in BIT

q, notq: out BIT);

end dff;

architecture behav of dff is

begin

process (clk)

begin

if (clk’event and clk = ‘1’) then

q <= data;

notq <= not data;

end if;

end process;

end behav;

Выражение (clk’event and clk = ‘1’) задает условие: если сигнал clk меняется с ‘0’ на ‘1’

Потоковое описание (dataflow)

Dataflow - означает поток данных. Описание в стиле dataflow использует в архитектуре параллельно вычисляемые выражения. Количество параллельно вычисляемых выражений может быть любым. Так как вычисления происходят параллельно, то порядок записи выражений не имеет значения. Толчком к началу вычислений является изменение любого из сигналов, входящих в выражения. Рассмотрим модель одноразрядного сумматора, показанного на рис.1.6.

Рис.1.6. Одноразрядный сумматор

entity full_adder is

port (a, b, cin: in BIT; sum, cout: out BIT);

end full_adder;

architecture full_ad_conc of full_adder is

begin

sum <= (a xor b) xor cin after 15 ns;

cout <= (a and b)or(b and cin)or(cin and a) after 10ns;

end full_ad_conc;

Для описания потока данных здесь используются два выражения. Всегда, когда происходят изменения сигналов a, b или cin, оба выражения вычисляются и сигналам sum и cout присваиваются новые значения через 15ns и 10ns, соответственно. Знак <= оператор присваивания. Выражение after 15ns означает задержку, вносимую логикой, реализующей вычисление выражения для sum. Если задержка не введена явно, то предполагается наличие бесконечно малой задержки . Такой прием позволяет упорядочить события модели dataflow. Рассмотрим схему рис. 1.7 и ее модель.

Рис. 1.7. Цепочка инверторов

entity fast_inverter is

port (a: in BIT; z: out BIT);

end fast_inverter;

architecture delta_delay of fast_inverter is

signal b,c: BIT;

begin

z <= not c; -- выражение 1

c <= not b; --выражение 2

b <= not a; --выражение 3

end delta_delay;

В выражениях 1, 2 и 3, присваивающих значения переменным z, c, b, подразумевается задержка . Например, в момент T происходит изменение сигнала a. Запускается процесс вычисления выражения 3 и через задержку переменной b будет присвоено новое значение (в момент T+). В свою очередь изменение сигнала b запустит процесс вычисления выражения 2 и значение сигнала с будет обновлено в момент T+2. Изменение сигнала с приведет к запуску процесса вычисления выражения 1 и значение сигнала z будет изменено в момент T+3. Временные соотношения в схеме иллюстрирует рис. 1.8.

Рис. 1.8. Временные соотношения в цепочке инверторов.

Структурное описание.

Структурное описание интерпретирует устройство как набор компонентов, связанных между собой сигналами. Грубо говоря - это таблица соединений (netlist). Рассмотрим простую схему управления (рис.1.8) и ее структурную модель.

Рис. 1.9. Устройство местного управления

entity ctr_lck is

port (data, mr, clk, din: in BIT; rdy, ctrla:out Bit);

end ctr_lck;

architecture str_view of ctr_lck is

component AND2 -- декларируется компонент AND2

port (x,y in BIT; z: out BIT);

end component;

component DFF -- декларируется компонент DFF

port (d, clock: in BIT; Q,NOTQ: out BIT);

end component;

component NOR2 -- декларируется компонент NOR2

port (a,b: in BIT; z: out BIT);

end component;

signal s1,s2: BIT;

begin

D1: DFF port map (data, clk, s1,s2); -- выражение 1

A1: AND2 port map (s2, din, ctrla); -- выражение 2

N1: NOR2 port map (s1, mr, rdy); -- выражение 3

end str_view;

Здесь декларируются три компонента: AND2, DFF и NOR2. В тело архитектуры экземпляры компонентов вводятся с помощью выражений 1, 2 и 3. Компоненты связаны между собой сигналами s1 и s2. В декларации называется имя компонента и его интерфейс, что очень схоже с декларацией интерфейса устройства. Выражение для экземпляра компонента должно в первую очередь дать имя экземпляру или ярлык. Например, D1 – это ярлык для экземпляра триггера DFF. Далее следует список связей (association list). Он устанавливает связь между портами компонента и портами и сигналами устройства. Существует два варианта связи: позиционный и поименный. В позиционном списке первый порт декларации (слева направо) компонента соответствует первому порту экземпляра компонента (слева направо), второй – второму и так далее. Именно такой вариант списка был использован в приведенном выше примере. Вместо этого можно было использовать поименный вариант списка связей, например, выражение 3 можно было бы записать так:

N1: NOR2 port map (a=>s1, b=> mr, z=>rdy);

Рассмотрим еще пример. На рис.1.2 была приведена схема полусумматора. Его структурная модель должна предстать как набор следующих компонентов: XOR на два входа (например, 7486 или отечественный аналог ЛП5) и AND на два входа (например, 7408 или отечественный аналог ЛИ1 ).

entity half_adder is

port(a, b: in BIT; sum, cur: out BIT);

end half_adder;

architecture h_a_str of half_adder is

component a_7486

port (a_2: in BIT;

a_3: in BIT;

a_1: out BIT);

end component;

component a_7408

port (a_2: in BIT;

a_3: in BIT;

a_1: out BIT);

end component;

begin

X1: a_7486 port map (a, b, sum);

A1: a_7408 port map (a, b, cur);

end h_a_str;

Названия компонентов и их портов приведены такими, какими они даны в библиотеке фирмы ALTERA – известного производителя программируемых логических схем.

Декларации компонентов, использованные в архитектуре h_a_str полусумматора half_adder, можно упаковать в отдельный файл, например, maxplus2.vhd:

package maxplus2 is

component a_7486

port (a_2: in BIT;

a_3: in BIT;

a_1: out BIT);

end component;

component a_7408

port (a_2: in BIT;

a_3: in BIT;

a_1: out BIT);

end maxplus2;

Файл maxplus2 при компиляции может быть помещен в библиотеку, например, с названием altera. Ссылка на библиотеку позволит не декларировать компоненты в архитектуре:

library altera;

use altera.maxplus2.all;

entity half_adder is

port(a, b: in BIT; sum, cur: out BIT);

end half_adder;

architecture h_a_str of half_adder is

begin

X1: a_7486 port map (a, b, sum);

A1: a_7408 port map (a, b, cur);

end h_a_str;

Комбинированное описание архитектуры

В едином теле архитектуры можно комбинировать все рассмотренные выше стили моделирования. В качестве примера рассмотрим одноразрядный полный сумматор (рис.1.5).

Сумматор представлен выражением 1, создающим экземпляр X1 компонента а_7486 (из библиотеки altera.maxplus2), и задающим отображение портов и сигнала сущности (сумматора) на порты компонента. Это структурный стиль.

Выражение 2 - это process, поведенческий стиль, и выражение 3 – это стиль dataflow.

Рис.1.10. Одноразрядный сумматор

library altera;

use altera.maxplus2.all;

entity full_adder is

port (a, b, cin: in BIT; sum, cout: out BIT);

end full_adder;

architecture fa_mix of full_adder is

signal s1:BIT;

begin

X1: a_7486 port map (a,b,s1); --выражение 1

process (a, b, cin) --выражение 2

variable t1, t2, t3: BIT;

begin

t1:= a and b;

t2:= b and cin;

t3:= a and cin;

cout <= t1 or t2 or t3;

end process;

sum <= s1 xor cin; --выражение 3

end fa_mix;

1.10 Особенности синтеза схем по описаниям на языке VHDL

Между процессами моделирования (имитации поведения схемы) синтеза схем с использованием языка VHDL есть существенные различия. Рассмотрим некоторые из них.

В отличие от системы моделирования система проектирования преобразует проектную информацию в заданный формат. Среди них выделяются широко распространенный формат EDIF, специализированные форматы различных фирм-изготовителей микросхем, а также языки Verilog, VHDL и другие. Формат EDIF является своеобразным стандартом де-факто, он имеется в большинстве современных систем проектирования и может использоваться для обмена информацией. Среди специализированных форматов можно выделить формат XNF фирмы Xilinx, который широко использовался в ранних версиях САПР этой фирмы. При преобразовании исходного модуля в промежуточный текст на языке VHDL обычно осуществляется преобразование в структурные конструкции этого языка, в которых используются схемотехнические особенности используемой элементной базы.

Система моделирования обычно использует все конструкции языка VHDL, в то время, как система проектирования использует не все его возможности. Обычно при синтезе не поддерживаются операции над типом Real (в этом случае при синтезе выдается ошибка), игнорируются ключевое слово After, не поддерживается также ряд других второстепенных конструкций языка. В системах проектирования атрибут event может использоваться только для указания фронтов синхросигналов в условных операторах, преимущественно в операторах if.

В современных системах проектирования для описания схем используется тип std_logic, который заменяет тип bit. Тип std_logic имеет следующие значения:

  • 0 – логический ноль;

  • 1 – логическая единица;

  • U – значение не инициализировано;

  • X – неизвестное значение;

  • Z – высокое выходное сопротивление;

  • W – неизвестное значение при слабом источнике сигнала;

  • L – логический ноль при слабом источнике сигнала;

  • H – логическая единица при слабом источнике сигнала;

  • ‘-‘– неопределенное значение.

ЛИТЕРАТУРА

1. Бибило П.Н. Синтез логических схем с использованием языка VHDL. М.: Солон-Р, 2002.

2. Суворова Е. А., Шейнин Ю. Е. Проектирование цифровых систем на VHDL. - СПб.: БХВ-Петербург. 2003.

Свежие статьи
Популярно сейчас
Почему делать на заказ в разы дороже, чем купить готовую учебную работу на СтудИзбе? Наши учебные работы продаются каждый год, тогда как большинство заказов выполняются с нуля. Найдите подходящий учебный материал на СтудИзбе!
Ответы на популярные вопросы
Да! Наши авторы собирают и выкладывают те работы, которые сдаются в Вашем учебном заведении ежегодно и уже проверены преподавателями.
Да! У нас любой человек может выложить любую учебную работу и зарабатывать на её продажах! Но каждый учебный материал публикуется только после тщательной проверки администрацией.
Вернём деньги! А если быть более точными, то автору даётся немного времени на исправление, а если не исправит или выйдет время, то вернём деньги в полном объёме!
Да! На равне с готовыми студенческими работами у нас продаются услуги. Цены на услуги видны сразу, то есть Вам нужно только указать параметры и сразу можно оплачивать.
Отзывы студентов
Ставлю 10/10
Все нравится, очень удобный сайт, помогает в учебе. Кроме этого, можно заработать самому, выставляя готовые учебные материалы на продажу здесь. Рейтинги и отзывы на преподавателей очень помогают сориентироваться в начале нового семестра. Спасибо за такую функцию. Ставлю максимальную оценку.
Лучшая платформа для успешной сдачи сессии
Познакомился со СтудИзбой благодаря своему другу, очень нравится интерфейс, количество доступных файлов, цена, в общем, все прекрасно. Даже сам продаю какие-то свои работы.
Студизба ван лав ❤
Очень офигенный сайт для студентов. Много полезных учебных материалов. Пользуюсь студизбой с октября 2021 года. Серьёзных нареканий нет. Хотелось бы, что бы ввели подписочную модель и сделали материалы дешевле 300 рублей в рамках подписки бесплатными.
Отличный сайт
Лично меня всё устраивает - и покупка, и продажа; и цены, и возможность предпросмотра куска файла, и обилие бесплатных файлов (в подборках по авторам, читай, ВУЗам и факультетам). Есть определённые баги, но всё решаемо, да и администраторы реагируют в течение суток.
Маленький отзыв о большом помощнике!
Студизба спасает в те моменты, когда сроки горят, а работ накопилось достаточно. Довольно удобный сайт с простой навигацией и огромным количеством материалов.
Студ. Изба как крупнейший сборник работ для студентов
Тут дофига бывает всего полезного. Печально, что бывают предметы по которым даже одного бесплатного решения нет, но это скорее вопрос к студентам. В остальном всё здорово.
Спасательный островок
Если уже не успеваешь разобраться или застрял на каком-то задание поможет тебе быстро и недорого решить твою проблему.
Всё и так отлично
Всё очень удобно. Особенно круто, что есть система бонусов и можно выводить остатки денег. Очень много качественных бесплатных файлов.
Отзыв о системе "Студизба"
Отличная платформа для распространения работ, востребованных студентами. Хорошо налаженная и качественная работа сайта, огромная база заданий и аудитория.
Отличный помощник
Отличный сайт с кучей полезных файлов, позволяющий найти много методичек / учебников / отзывов о вузах и преподователях.
Отлично помогает студентам в любой момент для решения трудных и незамедлительных задач
Хотелось бы больше конкретной информации о преподавателях. А так в принципе хороший сайт, всегда им пользуюсь и ни разу не было желания прекратить. Хороший сайт для помощи студентам, удобный и приятный интерфейс. Из недостатков можно выделить только отсутствия небольшого количества файлов.
Спасибо за шикарный сайт
Великолепный сайт на котором студент за не большие деньги может найти помощь с дз, проектами курсовыми, лабораторными, а также узнать отзывы на преподавателей и бесплатно скачать пособия.
Популярные преподаватели
Добавляйте материалы
и зарабатывайте!
Продажи идут автоматически
5259
Авторов
на СтудИзбе
421
Средний доход
с одного платного файла
Обучение Подробнее