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




 

3.1 АЛУ

 

АЛУ – блок, выполняющий арифметические операции и логические преобразования над операндами.

Введем обозначения:

- W[], DATA[] – входы операндов;

- C – вход переноса;

- СOP[1..0] – код операции АЛУ;

- CR – выход переноса;

- ZR – выход признака нулевого результата;

- R[] – выход результата.

Выполняемую операцию определяет код операции АЛУ COP[1..0] (таблица 2).

 

Таблица 2

СОР[1..0] Мнемоника Операция
  MOV R[] = DATA[]; Z = (R[]= =0);
  AND R[] = W[] & DATA[]; Z = (R[]= =0);
  ROR (CR,R[])=(W[0],C,W[7..1]); Z = (R[]= =0);
  ADD (CR,R[])=(b"0",W[])+(b"0",DATA[]); Z=(R[]==0);

 

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

SUBDESIGN alu

(

W[7..0], DATA[7..0], COP[1..0], C: INPUT;

RES[7..0], ZR,CR: OUTPUT;

)

BEGIN

CASE COP[1..0] IS --дешифрация кода

WHEN 0 => RES[]=DATA[]; --MOV

WHEN 1 => RES[]=W[] & DATA[]; --AND

WHEN 2 => (RES[7..0],CR)=(C,W[7..0]); --ROR

WHEN 3 => (CR,RES[7..0])=(B"0",W[7..0])+(B"0",DATA[7..0]);--ADD

END CASE;

ZR = (RES[]==0);

END;

 

3.2 Регистры

 

В состав ЦВУ входят 8-разрядные регистры общего назначения Rg и 4-разрядный регистр команд IR. Работу регистров можно описать в форме таблицы режимов (таблица 3). Параметр Width – число разрядов.

 

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

Режим работы С LD Q+[ 7..0]
Загрузка ­   D[7..0]
Хранение x   Q[7..0]

 

Соответствующее AHDL-описание регистра Rg:

 

SUBDESIGN rg

(d[7..0],ld,c: INPUT;

q[7..0]: OUTPUT;)

VARIABLE

q[7..0]: DFFE;

BEGIN

q[].(clk, ena) = (c, ld);

q[] = d[];

END;

 

Программный счетчик

 

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

 

 

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

Режим работы С LD CE Q+[ 7..0]
Загрузка ­   x D[7..0]
Инкремент ­     Q[7..1] + 1
Хранение х     Q[7..0]

 

Соответствующее AHDL-описание модуля PCtr:

 

SUBDESIGN PCTR

(

d[7..0],ld,en,c,R:INPUT;

cntr[7..0]:OUTPUT;

)

VARIABLE

cntr[7..0]:DFFE;

Begin

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

if ld then cntr[].d = d[7..0];

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

end if;

end;--.

 

Дешифратор и мультиплексор

 

В составе банка регистров общего назначения используются двоичный дешифратор и мультиплексор.

Дешифратор формирует сигналы выборки для регистров банка по двухразрядному адресу регистра при наличии сигнала разрешения. Введем внутренние обозначения сигналов:

- входной код адреса - code[1..0];

- сигнал разрешения - en;

- выходные сигналы - out0,out1,out2,out3.

AHDL-описание модуля PCtr:

 

SUBDESIGN dc

(code[1..0],en: input;

out0,out1,out2,out3: output;)

BEGIN

out0 =!code[1] &!code[0] & en;

out1 =!code[1] & code[0] & en;

out2 = code[1] &!code[0] & en;

out3 = code[1] & code[0] & en;

END;--.

 

Мультиплексор «4 в 1» передает данные с одного из регистров банка на выход. Введем внутренние обозначения сигналов:

- входной код адреса - sel[1..0];

- водные сигналы - A[7..0],B[7..0],C[7..0],D[7..0];

- выходной сигнал - Y[7..0].

AHDL-описание модуля mux4_1:

 

SUBDESIGN mux4_1

(A[7..0],B[7..0],C[7..0],D[7..0]: input;

sel[1..0]: input;

Y[7..0]: output;)

BEGIN

case sel[] is

when 0 => Y[]=A[];

when 1 => Y[]=B[];

when 2 => Y[]=C[];

when 3 => Y[]=D[];

end case;

END;--.

 

Модули памяти

 

Модули ОЗУ данных и ПЗУ программ реализуем на основе библиотечной параметризируемой мегафункции altsyncram. Настройка мегафункции выполнена средствами инструмента MegaWizard Plug-In Manager инструментальной системы Qartus II. Полученное описание ПЗУ емкостью 256х12 на языке AHDL:

 

INCLUDE "altsyncram.inc";

SUBDESIGN ROM

(

address[7..0]: INPUT;

clken: INPUT;

clock: INPUT;

q[11..0]: OUTPUT;

)

VARIABLE

altsyncram_component: altsyncram WITH (

ADDRESS_ACLR_A = "NONE",

INIT_FILE = "Rom.mif",

INTENDED_DEVICE_FAMILY = "Cyclone",

LPM_HINT = "ENABLE_RUNTIME_MOD=NO",

LPM_TYPE = "altsyncram",

NUMWORDS_A = 256,

OPERATION_MODE = "ROM",

OUTDATA_ACLR_A = "NONE",

OUTDATA_REG_A = "UNREGISTERED",

WIDTHAD_A = 8,

WIDTH_A = 12,

WIDTH_BYTEENA_A = 1

);

BEGIN

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

altsyncram_component.clocken0 = clken;

altsyncram_component.clock0 = clock;

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

END;

 

Полученное описание синхронного ОЗУ емкостью 256х8 на языке AHDL:

 

INCLUDE "altsyncram.inc";

SUBDESIGN RAM

(

address[7..0]: INPUT;

clken: INPUT;

clock: INPUT;

data[7..0]: INPUT;

wren: INPUT;

q[7..0]: OUTPUT;

)

VARIABLE

altsyncram_component: altsyncram WITH (

ADDRESS_ACLR_A = "NONE",

INDATA_ACLR_A = "NONE",

INIT_FILE = "Ram.mif",

INTENDED_DEVICE_FAMILY = "Cyclone",

LPM_HINT = "ENABLE_RUNTIME_MOD=NO",

LPM_TYPE = "altsyncram",

NUMWORDS_A = 256,

OPERATION_MODE = "SINGLE_PORT",

OUTDATA_ACLR_A = "NONE",

OUTDATA_REG_A = "UNREGISTERED",

POWER_UP_UNINITIALIZED = "FALSE",

WIDTHAD_A = 8,

WIDTH_A = 8,

WIDTH_BYTEENA_A = 1,

WRCONTROL_ACLR_A = "NONE"

);

BEGIN

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

altsyncram_component.clocken0 = clken;

altsyncram_component.wren_a = wren;

altsyncram_component.clock0 = clock;

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

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

END;

 

Значения параметра INIT_FILE "Rom.mif" и "Ram.mif" указывают на файлы инициализации памяти (контент модулей памяти).

 

 

4 Тестирование ЦВУ

 

4.1 Компиляция и верификация проекта в среде Quartus II

 

В приложении Б приведено AHDL-описание ЦВУ верхнего иерархического уровня, сформированное в соответствие с функциональной схемой.

ЦВУ должно выполнять программу, хранящуюся в ПЗУ. Загрузочный код программы необходимо сформировать в виде файла ROM.mif. Вариант тестовой программы для ЦВУ включает циклическое выполнение семи команд:

 

DEPTH = 256; % Memory depth and width are required %

WIDTH = 12; % Enter a decimal number %

 

ADDRESS_RADIX = HEX; % Address and value radixes are optional %

DATA_RADIX = HEX;

CONTENT

BEGIN

00: 000; % mov w,M(0) %

01: B01; % mov Rg(1) %

02: 601; % add M(1) %

03: A02; % mov M(2),w %

04: 400; % ror %

05: 301; % and Rg(1) %

06: A03; % mov M(3),w %

07: C00; % jmp 0 %

[08..FF]: 000;

END;

 

Чтобы на стадии компиляции выполнить загрузку данных в ячейки ОЗУ, необходимо сформировать файл загрузки RAM.mif:

 

DEPTH=256;

WIDTH=8;

 

ADDRESS_RADIX=HEX;

DATA_RADIX=HEX;

CONTENT

BEGIN

00: FB; % %

01: 0D; % %

02: 02; % %

03: 03; % %

04: 04; % %

05: 05; % %

[06..FF]: 00; % %

END;

 

Для данного варианта тестирования исполнение команд над заданными операндами должно привести к получению следующих результатов:

- 00 W ← FB;

- 01 Rg1 ← FB;

- 02 W ← 08; CF;

- 03 RAM(2) ← 08; CF;

- 04 W ← 84;

- 05 W ← 80;

- 06 RAM(3) ← 80;

- 07 переход на 00.

 

Для проверки правильности работы ЦВУ при выполнении тестовой программы выполняем анализ его работы методом имитационного моделирования в среде симулятора системы Quartus II с помощью сигнального редактора (Waveform Editor).

Анализ результатов моделирования позволяет оценить правильность работы проекта. На рисунках 2 и 3 приведены полученные временные диаграммы основных сигналов. Анализ этих результатов позволяет сделать вывод, что данную тестовую программу ЦВУ выполняет правильно.

Полученная оценка предельной частоты синхронизации для ЦВУ составляет 49,11 МГц. Для построения ЦВУ на кристалле ПЛИС компилятор системы Quartus II использовал 111 программируемых логических элементов (4 % от имеющихся на кристалле) и 5120 бит модулей памяти (9 % от имеющихся на кристалле).

 

Рисунок 2

 

Рисунок 3

 

 

4.2 Тестирование ЦВУ на стенде SDK6.1

 

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

Условие наблюдаемости обеспечивается путем вывода выходных сигналов важнейших узлов на индикаторы (символьный жидкокристаллический и светодиодные). Условие управляемости можно реализовать путем пошагового исполнения программы. Для этого необходимо формировать сигнал разрешения en для управляющего автомата при нажатии на кнопку «Шаг».

Доработку схемы ЦВУ предлагается выполнить самостоятельно.

В процессе компиляции проекта формируется файл с расширением «.rbf», который можно загрузить на стенд и проверить ЦВУ при выполнении тестовой программы.

Окончательное тестирование на стенде SDK 6.1 показывает, что ЦВУ правильно (не совсем правильно) выполняет заданную тестовую программу, так как полученные результаты полностью (не совсем полностью) совпадают с ожидаемыми.


Список использованных источников

1 Хлуденев А.В. Цифровое вычислительное устройство: Методические указания. – Оренбург: ГОУ ОГУ, 2005. - 67 с.

2 Грушвицкий Р.И., Мурсаев А.Х., Угрюмов Е.П. Проектирование систем на микросхемах программируемой логики. – С-П.: БХВ-Петербург, 2002. - 606 с.

 

Приложение А

(обязательное)

Схема электрическая функциональная



Приложение Б

(обязательное)

AHDL-описание ЦВУ

 

INCLUDE "rg.inc";

INCLUDE "alu.inc";

INCLUDE "pctr.inc";

INCLUDE "ROM.inc";

INCLUDE "RAM.inc";

INCLUDE "mux2_1.inc";

INCLUDE "mux4_1.inc";

INCLUDE "dc.inc";

INCLUDE "co.inc";

 

SUBDESIGN CPU

(

%clk:input; -- тактовый сигнал

res_b:input; -- system reset

clk:input; -- clk system clock = 40Mhz, t= 25.0 ns

W[7..0]:output;

DROM[11..0]:output;

DRAM[7..0]:output;

PC[7..0]:output;

COP[3..0]:output;

Y[5..1]:output;

)

VARIABLE

W[7..0]:node;

DROM[11..0]:node;

DRAM[7..0]:node;

PC[7..0]:node;

MALU[7..0],RES[7..0]:node;

cout,z:node;

COP[3..0]:DFFE;

Flags[1..0]:node;

Y[5..1]:node;

GPR[7..0],B[7..0],C[7..0],D[7..0],E[7..0]:node;

DCR[3..0]:node;

 

BEGIN

%------------------------------------- OU ---------------------------------------%

MALU[] = mux2_1(.A[]=DRAM[7..0],.B[]=GPR[],.sel=COP[0]) with (WIDTH=8);

(z,cout,RES[]) = ALU(.W[]=W[],.DATA[]=MALU[],.c=Flags[0],.COP[]=COP[2..1]);

W[] = Rg(.D[]=RES[7..0],.LD=y2,.C=clk) with (WIDTH=8);

Flags[] = Rg(.D[]=(z,cout),.LD=y2&(COP[2]#COP[1]),.C=clk) with (WIDTH=2);

 

%-------------------------- General Purpose Registers ---------------------------%

DCR[]=DC(DROM[1..0],y3&COP[0]);

B[]=Rg(.D[]=W[7..0],.LD=DCR[0],.C=clk) with (WIDTH=8);

C[]=Rg(.D[]=W[7..0],.LD=DCR[1],.C=clk) with (WIDTH=8);

D[]=Rg(.D[]=W[7..0],.LD=DCR[2],.C=clk) with (WIDTH=8);

E[]=Rg(.D[]=W[7..0],.LD=DCR[3],.C=clk) with (WIDTH=8);

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

 

%------------------------------- Program counter --------------------------------%

PC[] = Pctr(.C=clk,.R=!res_b,.EN=y1,.LD=y4,.D[]=DROM[7..0]) with (WIDTH=8);

 

%----------------------------------- ROM & IR -----------------------------------%

DROM[11..0]=ROM(.address[7..0]=PC[],.clock=clk);

COP[3..0].(clk,ena) = (clk,y1);

COP[3..0].d = DROM[11..8];

 

%------------------------------------ RAM ---------------------------------------%

DRAM[]= RAM(.data[7..0]=W[],

.wren=y3&!COP[0],

.address[7..0]=DROM[7..0],

.clock=clk);

 

%---------------------------------- Control -------------------------------------%

(y[5..1]) = co(.C=!CLK,.RST=res_b,.en=vcc %bt_clk%,.coper[]=cop[3..1]);

 

END;



Поделиться:




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

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2016-04-11 Нарушение авторских прав и Нарушение персональных данных


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