Студопедия

КАТЕГОРИИ:

АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника


USE ieee.std_logic_1164.all;




USE IEEE.STD_LOGIC_arith.ALL;

PACKAGE TypesD IS

CONSTANT INT15 : INTEGER := 15;

CONSTANT INT31 : INTEGER := 31;

CONSTANT CONST016 : STD_LOGIC_VECTOR(INT15 DOWNTO 0) := X"0000";

CONSTANT CONST032 : SIGNED(INT31 DOWNTO 0) := X"00000000";

END TypesD;

------------- Операционный автомат блока деления целых чисел со знаком

USE WORK.TypesD.all;

LIBRARY ieee;

USE ieee.std_logic_1164.all;

USE IEEE.STD_LOGIC_arith.ALL;

USE IEEE.STD_LOGIC_signed.ALL;

ENTITY mcu_divispr IS

-- ОТКОРРЕКТИРОВАННАЯ ВЕРСИЯ БЕЗ ОПТИМИЗАЦИИ

PORT(

CLK, RST, LAB, SHIFT, LAST, LAST2, LAST3, OUTHL, OE : in STD_ULOGIC;

DA, DB : in STD_LOGIC_VECTOR(15 DOWNTO 0);

DY : out STD_LOGIC_VECTOR(15 DOWNTO 0);

SF, SSF : out STD_ULOGIC

);

End mcu_divispr;

ARCHITECTURE COP OF mcu_divispr IS

COMPONENT TRi -- Z- буфер

PORT (A_in : IN STD_LOGIC;

OE : IN STD_LOGIC;

A_out : OUT STD_LOGIC);

END COMPONENT; --

SIGNAL DM, DT, DP : STD_LOGIC_VECTOR(INT15 DOWNTO 0);--

SIGNAL R_OST, CH_OST, VCH_OST, R_CHASTN : SIGNED(INT15 DOWNTO 0);--

SIGNAL SDM, SDT, ZF, ZZF, VF, FF : STD_LOGIC;

SIGNAL ZCH_OST : STD_LOGIC_VECTOR(INT15 DOWNTO 0);

SIGNAL SS, SN : STD_LOGIC;

SIGNAL YY : STD_LOGIC_VECTOR(INT15 DOWNTO 0);

BEGIN

-- Операция суммирования-вычитания частичного остатка с делителем

SUMMA: PROCESS (CH_OST, DT, DM, SHIFT, VCH_OST)

VARIABLE OSTP: SIGNED(INT15 DOWNTO 0);--

VARIABLE OSTS: SIGNED(INT15 DOWNTO 0);--

BEGIN

OSTP := CH_OST + SIGNED(DT(INT15 DOWNTO 0));

OSTS := CH_OST - SIGNED(DT(INT15 DOWNTO 0));

IF DM(0) = '1' THEN -- триггер сравнения знаков = 1?

ZCH_OST <= STD_LOGIC_VECTOR(OSTS); -- вычитание делителя

ELSE

ZCH_OST <= STD_LOGIC_VECTOR(OSTP); -- суммирование с делителем

END IF;

END PROCESS;

-- Формирование ЧОСТ и Частного.

-- на последнем шаге сдвигается только частное, ЧОСТ не сдвигается.

RG_DM_OST: PROCESS (CLK, RST)

BEGIN

IF RST = '1' THEN

CH_OST<=SIGNED(CONST016); -- Регистр Част.Остатка установить в 0

DM <=CONST016; -- Регистр делимого установить в 0

SDM<='0'; -- Триггер знака ДМ установить в 0

ELSIF CLK = '1' AND CLK'EVENT THEN

IF LAB = '1' THEN

SDM<= DA(INT15); -- Установить триггер знака DM

CH_OST<= SIGNED(YY); -- В регистр ЧОСТ записать знак ДМ

DM<= DA(INT15-1 DOWNTO 0) & SS; -- загрузка регистра ДM с

-- предварительным сдвигом ДМ влево

ELSE

IF (LAST = '0') AND (SHIFT = '1') THEN -- основной цикл

CH_OST<= VCH_OST(INT15 DOWNTO 0); -- сдвиг над ч.остатком

DM<= DM(INT15-1 DOWNTO 0) & SN; -- сдвиг над частным(пока

-- еще мл.часть ДМ)

ELSE

IF (LAST = '1') THEN -- (n+1 – й шаг) ЧОСТ без изменения

-- Сдвиг частного

CH_OST<= SIGNED(ZCH_OST(INT15 DOWNTO 0));

DM<= DM(INT15-1 DOWNTO 0) & SN;

ELSE

IF ZF = '0' then CH_OST<= SIGNED(ZCH_OST(INT15 DOWNTO 0));

else CH_OST<= NULL;

End if;

DM<= NULL;

END IF;

END IF;

END IF;

END IF;

END PROCESS;

-- DELITEL

RG_DT: PROCESS (CLK, RST)

BEGIN

IF RST = '1' THEN

DT<=CONST016;

SDT<='0';

ELSIF CLK = '1' AND CLK'EVENT THEN

IF LAB = '1' THEN

DT<= DB;

SDT<=DB(15); -- Знак(ДT)

END IF;

END IF;


Поделиться:

Дата добавления: 2015-04-11; просмотров: 127; Мы поможем в написании вашей работы!; Нарушение авторских прав





lektsii.com - Лекции.Ком - 2014-2024 год. (0.005 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав
Главная страница Случайная страница Контакты