Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Отчёт_Курсач.doc
Скачиваний:
8
Добавлен:
05.09.2019
Размер:
536.06 Кб
Скачать

2 Алгоритм алу

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

Введем обозначения. Пусть:

- Data [15..0] – входное слово A;

- W [15..0] – входное слово B;

- СOP[1..0] – управляющая команда;

- OVF – признак переполнения разрядной сетки;

- ZF – признак получения нулевого результата;

- RES [15..0] – выходное слово.

Примем, что старшим байтом является байт с наибольшим индексом. С выхода ПЗУ на вход АЛУ подается управляющее слово COP[1..0], которое определяет код операции. О перации реализуемые в АЛУ представлены в таблице 2.

Таблица 2.

СОР[1..0]

Операция

Действия АЛУ

00

Mov

RES[]=DATA[]

ZF=(RES[]==0)

01

CMP

(OVF,RES[])=(b”1”,DATA[]) – (b”0”,W[])

ZF=(RES[]==0)

10

SBB

(OVF,RES[])=(b”1”,DATA[])-(b”0,W[])-(x”0000”,OVF)

ZF=(RES[]==0)

11

SWAP

RES[]=(DATA[7..0],DATA[15..8])

ZF=(RES[]==0)

AHDL описание модуля АЛУ:

Subdesign alu

(

w[15..0]:input;

data[15..0]:input;

c,cop[1..0]:input;

zr,cr,res[15..0]:output;

)

begin

case cop[1..0] is

when 0 => res[]=data[];

when 1=>

(cr,res[])=(b"1",data[])-(b"0",w[]);

when 2 =>

(cr,res[])=(b"1",data[])-(b"0",w[])-(x"0000",c);

when 3 =>

res[]=(data[7..0],data[15..8]);

end case;

zr=(res[]==0);

end;

3 Разработка основных функциональных блоков и узлов

Для функциональных узлов и блоков, которые работают с многоразрядными словами, удобно использовать параметризированные описания. Условимся количество разрядов в таких словах обозначать параметром WIDTH.

Мультиплексор 21 является функциональным узлом комбинационного типа, который коммутирует два входных канала на один выход. В нашем случае каналы многоразрядные. Выбор входного канала определяется значением сигнала Cel. Ниже приведено параметризированное описание мультиплексора.

PARAMETERS (WIDTH=8);

SUBDESIGN mux_2

(

a[(width-1)..0],b[(width-1)..0], sel :INPUT;

y[(width-1)..0]:OUTPUT;

)

BEGIN

Y[]=A[]&!sel#b[]&sel;

END;

Для приема и хранения данных используются параллельные регистры, работу которых можно описать в форме таблицы режимов (таблица 2).

Таблица 3 – Режимы работы регистра

Режим работы

С

LD

Q+[Width-1..0]

Загрузка

1

D[Width-1..0]

Хранение

x

0

Q[Width-1..0]

Соответствующее параметризированное AHDL-описание модуля Reg

PARAMETERS (WIDTH=8);

SUBDESIGN reg

( d[(WIDTH-1)..0],ld,c : INPUT;

q[(WIDTH-1)..0] : OUTPUT;)

VARIABLE

q[(WIDTH-1)..0] : DFFE;

BEGIN

q[].clk = c;

q[].ena = ld;

q[] = d[];

END;

Для ЦВУ необходим программный счетчик с загрузкой параллельного кода (адрес команды). Режимы работы программного счетчика с загрузкой приведены в таблице 3.

Таблица 4 – Режимы работы счетчика

Режим работы

С

LD

CE

Q+[ Width-1..0]

Загрузка

1

x

D[Width-1..0]

Инкремент

0

1

Q[Width-1..1] + 1

Хранение

х

0

0

Q[Width-1..0]

Соответствующее параметризированное AHDL-описание модуля CTR

PARAMETERS(WIDTH=8)

subdesign CTR

(

c,en,ld,res,d[(width-1)..0]:input;

ctr[(width-1)..0]:output;

)

VARIABLE

ctr[(width-1)..0]:dffe;

begin

ctr[].(clk,ena,clrn)=(c,en#ld,!res);

if ld then

ctr[].d=d[(width-1)..0];

else ctr[].d=ctr[].q+1;

end if;

end;

Опишем ПЗУ - RОM

Параметризированное AHDL- описание модуля :

INCLUDE "altsyncram.inc";

SUBDESIGN rom

(

address[7..0] : INPUT;

clock : INPUT;

q[11..0] : OUTPUT;

)

VARIABLE

altsyncram_component : altsyncram WITH (

INTENDED_DEVICE_FAMILY = "Cyclone",

WIDTH_A = 12,

WIDTHAD_A = 8,

NUMWORDS_A = 256,

OPERATION_MODE = "ROM",

OUTDATA_REG_A = "CLOCK0",

ADDRESS_ACLR_A = "NONE",

OUTDATA_ACLR_A = "NONE",

WIDTH_BYTEENA_A = 1,

INIT_FILE = "rom.mif",

LPM_HINT = "ENABLE_RUNTIME_MOD=NO",

LPM_TYPE = "altsyncram"

);

BEGIN

q[11..0] = altsyncram_component.q_a[11..0];

altsyncram_component.clock0 = clock;

altsyncram_component.address_a[7..0] = address[7..0];

END;

Опишем ОЗУ - RAM

Параметризированное AHDL- описание модуля :

INCLUDE "altsyncram.inc";

SUBDESIGN RAM

(

address[7..0] : INPUT;

clock : INPUT;

data[7..0] : INPUT;

wren : INPUT;

q[7..0] : OUTPUT;

)

VARIABLE

altsyncram_component : altsyncram WITH (

INTENDED_DEVICE_FAMILY = "Cyclone",

WIDTH_A = 8,

WIDTHAD_A = 8,

NUMWORDS_A = 256,

OPERATION_MODE = "SINGLE_PORT",

OUTDATA_REG_A = "UNREGISTERED",

INDATA_ACLR_A = "NONE",

WRCONTROL_ACLR_A = "NONE",

ADDRESS_ACLR_A = "NONE",

OUTDATA_ACLR_A = "NONE",

WIDTH_BYTEENA_A = 1,

INIT_FILE = "Ram.mif",

LPM_HINT = "ENABLE_RUNTIME_MOD=NO",

LPM_TYPE = "altsyncram"

);

BEGIN

q[15..0] = altsyncram_component.q_a[15..0];

altsyncram_component.wren_a = wren;

altsyncram_component.clock0 = clock;

altsyncram_component.address_a[7..0] = address[7..0];

altsyncram_component.data_a[15..0] = data[15..0];

END;

Опишем РОН. Регистр общего назначения представляет 4 регистра. При записи в РОН, для выбора нужного регистра используется дешифратор. Данные на выход с РОНа определяются с помощью мультиплексора. Для указания адреса РОНа в команде используются младшие 2 бита.

AHDL описание РОНа:

DCR[]=DC(DROM[1..0],y[4]);

B[]=Reg(.D[]=res[],.LD=DCR[0],.C=clk) with (WIDTH=16);

C[]=Reg(.D[]=res[],.LD=DCR[1],.C=clk) with (WIDTH=16);

D[]=Reg(.D[]=res[],.LD=DCR[2],.C=clk) with (WIDTH=16);

F[]=Reg(.D[]=res[],.LD=DCR[3],.C=clk) with (WIDTH=16);

GPR[] = mux4_1(.A[]=B[],.B[]=C[],.C[]=D[],.D[]=F[],.sel[]=DROM[1..0]) with (WIDTH=16);

Где DC – дешифратор, mux4_1 – мультиплексор на 4 входа.