Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
схемотехника / Введение в инструментальные средства.pdf
Скачиваний:
145
Добавлен:
27.03.2016
Размер:
1.94 Mб
Скачать

Составление программной модели АЛУ

АЛУ представляет собой совокупность взаимодействующих узлов, переключение которых может протекать одновременно. Для отображения такой одновременности в языке VHDL предусмотрены параллельные операторы, среди которых центральное место занимает оператор process. Возможны два подхода к поведенческому описанию АЛУ с использованием механизма процессов: либо описать поведение АЛУ в рамках одного процесса, либо с использованием нескольких процессов в архитектурном теле объекта. Использование второго подхода более целесообразно по следующим причинам: описание будет более структурированным и ясным, допускать отладку по частям и, как следствие, сократит сроки создания программной модели АЛУ.

При описании АЛУ будем опираться на функциональные схемы БО и МУУ (см. рис. П.2.1 и П.2.4).

Блок операций представим в виде следующих частей: регистра первого операнда (назовем эту часть RGA); регистра второго операнда (RGB);

регистра результата (RGR);

регистра признака результата и комбинационной схемы КС3 (RPR);

комбинационной схемы КС1 (KS1); комбинационной схемы КС2 (KS2); сумматора СМ (SUM).

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

схемой пуска и останова (SPO); датчиком состояний (DS);

счетчиком циклов и комбинационной схемой КС3 (COUNTER); комбинационной схемой формирования выходного сигнала

конца операции (SKO).

Каждую из этих частей опишем отдельным процессом за исключением сумматора и комбинационной схемы SKO. Эти схемы опишем с использованием параллельного сигнального оператора присваивания. В листинге П.2.1 приведена структура архитектурного тела АЛУ.

177

Листинг П.2.1. Структура архитектурного тела АЛУ

RGA: process (signal-name,... , signal-name) begin

-- операторы процесса RGA end process RGA;

RGB: process (signal-name,... , signal-name) begin

-- операторы процесса RGB end process RGB;

RGR: process (signal-name,... , signal-name) begin

-- операторы процесса RGR end process RGR;

RPR: process (signal-name,... , signal-name) begin

-- операторы процесса RPR end process RPR;

KS1: process (signal-name,... , signal-name) begin

-- операторы процесса KS1 end process KS1;

KS2: process (signal-name,... , signal-name) begin

-- операторы процесса KS2 end process KS2;

SPO: process (signal-name,... , signal-name) begin

-- операторы процесса SPO end process SPO;

DS: process (signal-name,... , signal-name) begin

-- операторы процесса DS end process DS;

COUNTER: process (signal-name,... , signal-name) begin

-- операторы процесса COUNTER end process COUNTER;

SUM<= expression; SKO<= expression;

178

Напомним, что процессы и операторы присваивания в теле архитектуры могут быть описаны в произвольном порядке, а процесс активизируется, когда происходит изменение какого-либо сигнала в списке чувствительности этого процесса.

Объявление интерфейса АЛУ

Интерфейс АЛУ определяется связями устройства с другими частями процессора. Внешними входами АЛУ являются входы R, CLK, SNO, KOP, A[3:0] и B[3:0]; выходными контактами — RR[7:0], PR[1:0] и SKO.

В листинге П.2.2 приведено описание интерфейса АЛУ на языке

VHDL.

Листинг П.2.2. Объявление интерфейса АЛУ

entity ALU_133 is port (

A:in UNSIGNED (3 downto 0);

B:in UNSIGNED (3 downto 0); KOP: in BIT;

CLK: in BIT;

R:in BIT; SNO: in BIT;

PR: out BIT_VECTOR (1 downto 0); SKO: buffer BIT;

RR:out UNSIGNED (7 downto 0)

);

end ALU_133;

Поскольку целью проектирования АЛУ является точное воспроизведение заданного в техническом задании алгоритма умножения (а он в каждом ТЗ разный!), то это возможно только при условии представления типа операндов А, В и результата как UNSIGNED, т.е. как двоичное число без знака. Заданный алгоритм при этом будет реализован соответствующей интерпретацией этого двоичного числа. Например, примем индексацию разрядов операндов как а3 а2 а1 а0 и b3 b2 b1 b0, где а0 и b0 — младшие разряды, а3 и b3 — знаковые разряды операндов.

179

Обратим также внимание на выходной сигнал SKO. Он определен не как out, а как buffer. Это связано с тем, что данный сигнал не только выходит наружу, но и используется внутри схемы АЛУ (см. рис. П.2.1). Следовательно, при описании схемы пуска и останова он должен читаться, т.е. выступать как аргумент. Выходной сигнал в этом качестве не доступен внутри архитектуры. Если бы сигнал SKO был определен как out, то это повлекло бы необходимость введения внутреннего сигнала. Определив сигнал SKO как buffer, сможем его анализировать внутри архитектуры и отказаться от введения внутреннего сигнала. С точки зрения результата синтеза оба подхода эквивалентны.

Раздел деклараций архитектуры АЛУ

Вразделе деклараций архитектуры необходимо определить внутренние сигналы, которые необходимы для описания алгоритма функционирования АЛУ.

Для блока операций (см. рис. П.2.1) таковыми являются сигналы, отображающие состояние:

регистров первого и второго операндов (RA и RB); комбинационных схем КС1 и КС2 (K1S и K2S); сумматора СМ (SM);

регистра результата РР (RSM).

Местное устройство управления (см. рис. П.2.4) в АЛУ представим следующими сигналами:

датчика состояний (P); счетчика циклов (CS); сигналом конца цикла (FC); схемы пуска и останова (EN).

Влистинге П.2.3 приведен текст деклараций архитектуры АЛУ.

Использование 9 разрядов для сигналов SM обусловлено необходимостью выполнения сложения чисел в обратном коде и реализации автоматической коррекции результата.

180

Листинг П.2.3. Раздел деклараций архитектуры АЛУ

architecture ALU_133_arch of ALU_133 is

signal RA: UNSIGNED (3 downto 0); signal RB: UNSIGNED (3 downto 0); signal K1S: UNSIGNED (7 downto 0); signal K2S: UNSIGNED (7 downto 0); signal SM: UNSIGNED (8 downto 0); signal RSM: UNSIGNED (7 downto 0); signal P: BIT_VECTOR (3 downto 0); signal cs: INTEGER range 0 to 2; signal FC: BIT;

signal EN: BIT;

begin

-- <<раздел операторов>> end ALU_133_arch;

Раздел операторов архитектуры АЛУ

Алгоритм функционирования схемы пуска и останова SPO

Работа синхронной схемы пуска и останова достаточна проста. Сигнал R сбрасывает выходной сигнал EN в 0. По входу SNO выходной сигнал EN принимает значение равное 1, а сигнал SKO переводит выход EN в состояние 0. Все эти действия выполняются по фронту 0/1 сигнала СLK.

Влистинге П.2.4 приведено описание алгоритма работы схемы пуска и останова.

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

схемы. Для схемы пуска и останова — это сигналы R, CLK, SNO,

SKO.

181

Листинг П.2.4. Алгоритм функционирования схемы пуска и останова

SPO: process (R,CLK,SNO,SKO) begin

if R ='1' then EN <= '0';

elsif CLK'event and CLK='1' then

if (SNO or SKO)='1' then EN <= not EN; end if;

end if;

end process SPO;

Алгоритм функционирования датчика состояний P

Логика работы синхронного датчика состояний определяется графами переходов (см. рис. П.2.5 и П.2.6). За основу его построения примем счетчик с единичным кодированием, разрядность которого определяется числом вершин в графе переходов и равна 4. Это нашло отражение в определении сигнала Р (см. листинг П.2.3). В начальное состояние датчик состояний устанавливается по входу SNO. Сигнал EN дает разрешение на работу датчика состояний. Сигнал KOP определяет реализацию либо графа рис. П.2.5, либо графа рис. П.2.6.

В листинге П.2.5 приведен алгоритм работы датчика состояний. Обратим внимание на использование оператора null (ничего не делать). Если при каком-либо условии никаких действий не предусмотрено (в нашем случае EN='0' означает запрет на работу датчика состояний), то все равно после проверки данного условия должен размещаться оператор, в данном случае пустой оператор null.

Листинг П.2.5. Алгоритм функционирования датчика состояний

DS: process (SNO,CLK,EN,KOP,P) begin

if SNO='1' then P <= "0001"; elsif EN='0' then null;

elsif CLK'event and CLK='1' then

if P(0)='1' or P(1)='1' then P <= P(2 downto 0) & '0'; elsif (kop='0') and (P(2)='1') then P <= "0010"; elsif (kop='1') and (P(2)='1') then P <= "1000";

182

end if; end if;

end process DS;

Алгоритм функционирования счетчика циклов CS

Здесь нужно определить условия, при которых счетчик должен переключаться, а также условия формирования сигнала конца цикла FC. Примем, что состояния счетчика изменяется в вершине Р2 графа перехода (см. рис. П.2.5) при условии KOP=’1’ и EN=’1’.

Поскольку цикл повторяется 3 раза (определяется количеством цифр в множителе), то единичное значение сигнал конца цикла FC должен принять, когда состояние счетчика будет равно 2. Отсюда нетрудно составить алгоритм работы счетчика циклов (лис-

тинг П.2.6).

Листинг П.2.6. Алгоритм функционирования счетчика циклов

COUNTER: process (R,SNO,CLK,EN,KOP,P,CS) begin

if SNO='1' then CS <= 0;

elsif CLK'event and CLK='1' then

if (not KOP and EN and P(2))='1' then CS <= CS + 1; end if;

end if; case CS is

when 2 => FC <= '1'; when others => FC <= '0';

end case;

end process COUNTER;

Алгоритм функционирования регистров первого и второго операнда RA, RB

183

Данные регистры выполняют прием информации, а регистр RGB еще и микрооперацию арифметического сдвига (лис-

тинг П.2.7).

Листинг П.2.7. Алгоритм функционирования регистров операндов

RGA: process (A,R,clk,EN) begin

if EN='0' then null;

elsif (CLK'event and CLK='1') then if (P(0) = '1') then RA <= A; end if;

end if;

end process RGA;

RGB: process (B,r,clk,EN) begin

if EN='0' then null;

elsif (CLK'event and CLK='1') then if (P(0) = '1') then RB <= B;

elsif (P(2) = '1') and (KOP = '0') then RB <= RB(3) & RB(1 downto 0) & '0';

end if; end if;

end process RGB;

Алгоритм функционирования регистра результата RSM

Функционирование регистра результата в составе АЛУ, как следует из рассмотрения графов переходов датчика состояний МУУ (см. рис. П.2.5 и П.2.6) и схем алгоритмов (см. рис. П.2.2 и П.2.3), следующее:

ввершине Р0 происходит обнуление регистра;

ввершине Р1 вне зависимости от выполняемой операции происходит запись суммы;

ввершине Р2 в зависимости от выполняемой операции происходит либо арифметический сдвиг, либо обнуление регистра, если результат суммирования равен [-0]ок = 11.1111.

184

В листинге П.2.8 приведено описание алгоритма работы регистра результата.

Листинг П.2.8. Алгоритм функционирования регистра результата

RGR: process (clk,EN,P,KOP,RSM) begin

if EN='0' then null;

elsif (CLK'event and CLK='1') then

if (P(0) = '1') then RSM <= "00000000";

elsif (P(1) = '1') then RSM <= SM(7 downto 0); elsif (P(2) = '1') and (KOP = '0') then

RSM <= RSM(6 downto 0) & RSM(7);

elsif (P(2)='1') and (KOP='1') and (RSM(0) ='1') and

(RSM(1)='1')and(RSM(2)='1')and(RSM(3)='1')and(RSM(4)='1') then RSM <= "00000000";

end if; end if;

RR <= RSM;

end process RGR;

Алгоритм функционирования регистра признака результата PR

В листинге П.2.9 приведено описание алгоритма формирования признака результата в соответствии с условиями технического задания и графом переходов датчика состояний МУУ (см. рис. П.2.6). Напомним, что разряды 4 и 3 в регистре результата представляют в операции сложения знак числа.

Листинг П.2.9. Алгоритм функционирования регистра признака результата

RPR: process (RSM,clk,EN,P)

 

begin

 

 

 

if (EN='0' or P(3) = '0') then null;

 

elsif (CLK'event and CLK='1') then

 

if (RSM(4)='0' and

RSM(3)='0' and RSM(2)='0' and

 

RSM(1)='0' and

RSM(0)='0')

then PR <= "00";

elsif (RSM(4)='1' and RSM(3)='1')

then PR <= "01";

elsif ((RSM(4)='0'

and RSM(3)='1') or

else

(RSM(4)='1'

and RSM(3)='0')) then PR <= "11";

PR <= "10";

 

 

end if;

 

 

185

end if;

end process RPR;

Алгоритм функционирования комбинационных схем K1S и K2S

Алгоритм работы комбинационных схем вытекает из функциональной схемы блока операций (см. рис. П.2.1). Для операции сложения эти схемы должны передавать содержимое регистров RA и RB на сумматор. В случае операции умножения комбинационная схема КС2 должна передавать на сумматор содержимое регистра результата (см. рис. П.2.1). Комбинационная схема КС1 в зависимости от значения текущего разряда множителя rb(2) и знака rb(3) должна передавать с выхода регистра RA на входы сумматора операнд А или [-А]ок или 0 (см. рис. П.2.3). Описание алгоритма работы комбинационных схем приведено в листинге П.2.10.

Листинг П.2.10. Алгоритм функционирования комбинационных схем

KS1: process (RB, RA, KOP) begin

if kop='1' then K1S<=(ra(3)& ra(3)& ra(3)& ra(3)& RA); elsif ((rb(3)='0' and rb(2)='0') or

(rb(3)='1' and rb(2)='1')) then K1S<="00000000"; elsif (rb(3)='0' and rb(2)='1') then

K1S<=(ra(3) & ra(3) & ra(3) & ra(3) & RA); elsif (rb(3)='1' and rb(2)='0') then

K1S<=(not ra(3) & not ra(3) & not ra(3) & not ra(3) & not rA(3) & not rA(2) & not rA(1) & not rA(0));

end if;

end process KS1;

KS2: process (RB, RSM, KOP) begin

if kop ='0' then K2S <= RSM;

else K2S<=(rb(3) & rb(3) & rb(3) & rb(3) & RB); end if;

end process KS2;

Алгоритм функционирования сумматора и комбинационной схемы SKO

186

В листинге П.2.11 приведено VHDL-описание сложения 8- разрядных операндов. Результат SM объявлен как 9-разрядное двоичное число (см. листинг П.2.3), поскольку при сложении чисел в обратном коде нас интересует перенос, который может возникнуть при сложении 8-разрядных операндов. Его значение должно быть направлено в младший разряд суммы для выполнения коррекции. С помощью оператора конкатенации & операнды с выходов комбинационных схем расширяются так, чтобы функция сложения помещала бит переноса в старший разряд результата. Третье слагаемое в приведенном выражении как раз и учитывает значение переноса.

Выражение для сигнала конца операции можно вывести из рассмотрения графов переходов датчика состояний МУУ (см.

рис. П.2.5 и П.2.6).

Листинг П.2.11. VHDL-описание сумматора и комбинационной схемы SKO

SM <=('0' & K1S) + ('0' & K2S) + ("00000000" & SM(8)); SKO <=(P(1) and EN and FC and not KOP) or (KOP and EN

and P(3));

Программная модель АЛУ

Все рассмотренные выше части описания схемы АЛУ сведем в единый текст. Он приведен в листинге П.2.12.

Листинг П.2.12. VHDL-описание АЛУ

library IEEE;

use IEEE.std_logic_1164.all; use IEEE.std_logic_arith.all;

entity ALU_133 is port (

A:in UNSIGNED (3 downto 0);

B:in UNSIGNED (3 downto 0); KOP: in BIT;

CLK: in BIT;

R:in BIT;

SNO:

in BIT;

PR:

out BIT_VECTOR (1 downto 0);

SKO:

buffer BIT;

187

RR: out UNSIGNED (7 downto 0) );

end ALU_133;

architecture ALU_133_arch of ALU_133 is

signal RA: UNSIGNED (3 downto 0); signal RB: UNSIGNED (3 downto 0); signal K1S: UNSIGNED (7 downto 0); signal K2S: UNSIGNED (7 downto 0); signal SM: UNSIGNED (8 downto 0); signal RSM: UNSIGNED (7 downto 0); signal P: BIT_VECTOR (3 downto 0); signal cs: INTEGER range 0 to 2; signal FC: BIT;

signal EN: BIT;

begin

SPO: process (R,CLK,SNO,SKO) begin

if R ='1' then EN <= '0';

elsif CLK'event and CLK='1' then

if (SNO or SKO)='1' then EN <= not EN; end if;

end if;

end process SPO;

RGA: process (A,R,clk,EN) begin

if EN='0' then null;

elsif (CLK'event and CLK='1') then if (P(0) = '1') then RA <= A; end if;

end if;

end process RGA;

RGB: process (B,r,clk,EN) begin

if EN='0' then null;

elsif (CLK'event and CLK='1') then if (P(0) = '1') then RB <= B;

elsif (P(2) = '1') and (KOP = '0') then RB <= RB(3) & RB(1 downto 0) & '0';

end if; end if;

end process RGB;

KS1: process (RB, RA, KOP) begin

if kop='1' then K1S<=(ra(3)& ra(3)& ra(3)& ra(3)& RA); elsif ((rb(3)='0' and rb(2)='0') or

(rb(3)='1' and rb(2)='1')) then K1S<="00000000"; elsif (rb(3)='0' and rb(2)='1') then

188

K1S<=(ra(3) & ra(3) & ra(3) & ra(3) & rA); elsif (rb(3)='1' and rb(2)='0') then

K1S<=(not ra(3) & not ra(3) & not ra(3) & not ra(3) & not rA(3) & not rA(2) & not rA(1) & not rA(0));

end if;

end process KS1;

KS2: process (RB, RSM, KOP)

begin

kop ='0' then K2S <= RSM;

 

if

 

else K2S<=(rb(3) & rb(3) & rb(3) & rb(3) & rb);

end if;

 

 

end process KS2;

 

SM <=('0' & K1S) + ('0' & K2S) + ("00000000" & SM(8));

RGR: process (clk,EN,P,KOP,RSM)

 

begin

EN='0' then null;

 

if

 

elsif (CLK'event and CLK='1') then

 

 

if (P(0) = '1') then RSM <= "00000000";

 

elsif (P(1) = '1') then RSM <= SM(7 downto 0);

 

elsif (P(2) = '1') and (KOP = '0') then

 

 

RSM <= RSM(6 downto 0) & RSM(7);

 

elsif (P(2)='1') and (KOP='1') and (RSM(0) ='1') and

 

(RSM(1)='1')and(RSM(2)='1')and(RSM(3)='1')and(RSM(4)='1')

 

then RSM <= "00000000";

 

 

end if;

 

 

end if;

 

 

RR <=

RSM;

 

 

end process RGR;

 

RPR: process (RSM,clk,EN,P)

 

begin

(EN='0' or P(3) = '0') then null;

 

if

 

elsif (CLK'event and CLK='1') then

 

 

if (RSM(4)='0' and RSM(3)='0' and RSM(2)='0' and

 

RSM(1)='0' and RSM(0)='0')

then PR <= "00";

 

elsif (RSM(4)='1' and RSM(3)='1')

then PR <= "01";

 

elsif ((RSM(4)='0' and RSM(3)='1') or

 

else

(RSM(4)='1' and RSM(3)='0')) then PR <= "11";

 

PR <= "10";

 

 

end if;

 

 

end if;

 

 

end process RPR;

SKO <=(P(1) and EN and FC and not KOP) or (KOP and EN and P(3));

DS: process (SNO,CLK,EN,KOP,P) begin

if SNO='1' then P <= "0001"; elsif EN='0' then null;

elsif CLK'event and CLK='1' then

if P(0)='1' or P(1)='1' then P <= P(2 downto 0) & '0';

189

elsif (kop='0') and (P(2)='1') then P <= "0010"; elsif (kop='1') and (P(2)='1') then P <= "1000"; end if;

end if;

end process DS;

COUNTER: process (R,SNO,CLK,EN,KOP,P,CS) begin

if SNO='1' then CS <= 0;

elsif CLK'event and CLK='1' then

if (not KOP and EN and P(2))='1' then CS <= CS + 1; end if;

end if; case CS is

when 2 => FC <= '1';

when others => FC <= '0'; end case;

end process COUNTER; end ALU_133_arch;

190