КАТЕГОРИИ:
АстрономияБиологияГеографияДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРиторикаСоциологияСпортСтроительствоТехнологияФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника
|
END PROCESS; ⇐ ПредыдущаяСтр 3 из 3 --- первый шаг коррекции – коррекция ЧОСТ по знаку делимого RG_O: PROCESS (CLK, RST) BEGIN IF RST = '1' THEN R_OST<=SIGNED(CONST016); ELSIF CLK = '1' AND CLK'EVENT THEN IF LAST2 = '1' THEN IF ZF = '0' AND VF = '1' THEN -- (Остаток!=0) И -- (Знак(ДM)!= Знак(ЧОСТ) IF FF = '0' THEN -- Если (Знак(ДT)!= Знак(ДM) R_OST<= CH_OST - SIGNED(DT); ELSE -- Если (Знак(ДT == Знак(ДM) R_OST<= CH_OST + SIGNED(DT); END IF; ELSE R_OST<= CH_OST; END IF; END IF; END IF; END PROCESS; --- второй шаг коррекции – коррекция частного RG_OO: PROCESS (CLK, RST) BEGIN IF RST = '1' THEN R_CHASTN<=SIGNED(CONST016); ELSIF CLK = '1' AND CLK'EVENT THEN IF LAST3 = '1' THEN IF (FF = '0' AND SDM = '0') OR -- (ДM>0) И (ДT<0) (FF = '1' AND SDM = '1' AND ZZF = '1') OR -- (ДM<0) И (ДT<0) И -- (ЧОСТ=0) (FF = '0' AND SDM = '1' AND ZZF = '0') -- (DM<0) И (DT>0) И -- (CH_OSTATOK!=0) THEN R_CHASTN<= SIGNED(DM) + 1; -- КОРРЕКЦИЯ ЧАСТНОГО ELSE R_CHASTN<= SIGNED(DM); END IF; END IF; END IF; END PROCESS; -- OPREDEL. TZN zss:SS <= NOT (DA(INT15) XOR DB(INT15)); --- признак равенства знаков ДМ и ДТ zsn:SN <= NOT (SDT XOR ZCH_OST(INT15)); --- признак равенства знаков ДТ и ЧОСТ zvf:VF <= SDM XOR CH_OST(INT15); --- признак неравенства знаков ДМ и ЧОСТ zff:FF <= NOT (SDM XOR SDT); -- признак равенства знаков ДМ и ДТ -- Сдвиг частичного остатка VCH_OST <= SIGNED(ZCH_OST(INT15-1 DOWNTO 0)) & DM(INT15); YY <= X"FFFF" WHEN DA(INT15) = '1' ELSE CONST016; -- Мультиплексор выходной шины DP <= STD_LOGIC_VECTOR(R_CHASTN(INT15 DOWNTO 0)) WHEN OUTHL = '1' -- частное ELSE STD_LOGIC_VECTOR(R_OST(INT15 DOWNTO 0)); -- остаток SF<= ZF; SSF <= VF; --- признак CH_OST=0 ZF<='1' WHEN CH_OST(INT15 DOWNTO 0) = SIGNED(CONST016) ELSE '0'; --- признак R_OST=0 ZZF<='1' WHEN R_OST(INT15 DOWNTO 0) = SIGNED(CONST016) ELSE '0'; TRIBus: FOR i IN 0 TO INT15 GENERATE TRiBuffer: TRi PORT MAP (DP(i), OE, DY(i)); END GENERATE TRIBus; End COP; -------- Управляющий автомат деления LIBRARY ieee; USE ieee.std_logic_1164.all; --USE IEEE.STD_LOGIC_arith.ALL; --USE IEEE.STD_LOGIC_signed.ALL; ENTITY mcu_uad IS PORT( CLK, RST, START : in STD_ULOGIC; LAB, SHIFT, LAST1, LAST2, LAST3, RDY : out STD_ULOGIC ); End mcu_uad; ARCHITECTURE CUA OF mcu_uad IS TYPE STATES IS (S1,S2,S3,S4,S5,S6,S7,S8,S9,S10,S11,S12,S13,S14,S15,S16,S17,S18,S19,S20,FINISH); SIGNAL ST : STATES;-- BEGIN STATE: PROCESS (CLK, RST) BEGIN IF RST = '1' THEN ST<=FINISH; ELSIF CLK = '1' AND CLK'EVENT THEN CASE ST IS WHEN S1 => ST<= S2; WHEN S2 => ST<= S3; WHEN S3 => ST<= S4; WHEN S4 => ST<= S5; WHEN S5 => ST<= S6; WHEN S6 => ST<= S7; WHEN S7 => ST<= S8; WHEN S8 => ST<= S9; WHEN S9 => ST<= S10; WHEN S10 => ST<= S11; WHEN S11 => ST<= S12; WHEN S12 => ST<= S13; WHEN S13 => ST<= S14; WHEN S14 => ST<= S15; WHEN S15 => ST<= S16; WHEN S16 => ST<= S17; WHEN S17 => ST<= S18; WHEN S18 => ST<= S19; WHEN S19 => ST<= S20; WHEN S20 => ST<= FINISH; WHEN FINISH => IF START='1' THEN ST<= S1; ELSE ST<=null; END IF; END CASE; END IF; END PROCESS; LAB<='1' WHEN ST=S1 ELSE '0'; SHIFT<='0' WHEN ST=S1 OR ST=FINISH OR ST=S18 OR ST=S19 OR ST=S20 ELSE '1'; LAST1<='1' WHEN ST=S17 ELSE '0'; -- S18 - free LAST2<='1' WHEN ST=S19 ELSE '0'; LAST3<='1' WHEN ST=S20 ELSE '0'; RDY<='1' WHEN ST=FINISH ELSE '0'; End CUA;
|