КАТЕГОРИИ:
АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
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;
|