Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Алгоритм умноженияв целых в доп коде.doc
Скачиваний:
1
Добавлен:
01.03.2025
Размер:
878.08 Кб
Скачать

Приложение

П.1. Листинг программ на VHDL

П.1.1 Реализация операции «Умножение»

LIBRARY ieee;

USE ieee.std_logic_1164.all;

USE IEEE.STD_LOGIC_arith.ALL;

PACKAGE Types 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 Types;

USE WORK.Types.all;

LIBRARY ieee;

USE ieee.std_logic_1164.all;

USE IEEE.STD_LOGIC_arith.ALL;

USE IEEE.STD_LOGIC_signed.ALL;

ENTITY mcu_op IS

PORT(

CLK, RST, LAB, SHIFT, SIGN, OUTHL, OE : in STD_ULOGIC;

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

DY : out STD_LOGIC_VECTOR(INT15 DOWNTO 0);

ZF : out STD_ULOGIC;

SF : out STD_ULOGIC

);

end mcu_op;

ARCHITECTURE COP OF mcu_op IS

COMPONENT OPNDRN -- О.К.

PORT ( a_in : IN STD_LOGIC;

a_out: OUT STD_LOGIC);

END COMPONENT;

COMPONENT TRi -- Z- буфер

PORT (A_in : IN STD_LOGIC;

OE : IN STD_LOGIC;

A_out : OUT STD_LOGIC);

END COMPONENT; -- signed (SHORT+1 DOWNTO 0);--

SIGNAL A, B, DP : STD_LOGIC_VECTOR(INT15 DOWNTO 0);--

SIGNAL S : SIGNED(INT15+1 DOWNTO 0);--

SIGNAL P : SIGNED(INT31 DOWNTO 0);--

SIGNAL ZFI : STD_LOGIC;

BEGIN

RG_A: PROCESS (CLK, RST)

BEGIN

IF RST = '1' THEN

A<=CONST016;

ELSIF CLK = '1' AND CLK'EVENT THEN

IF LAB = '1' THEN

A<= DA;

END IF;

END IF;

END PROCESS;

RG_B: PROCESS (CLK, RST)

BEGIN

IF RST = '1' THEN

B<=CONST016;

ELSIF CLK = '1' AND CLK'EVENT THEN

IF LAB = '1' THEN

B<= DB;

ELSIF SHIFT = '1' THEN

B<='0'& B(INT15 DOWNTO 1); -- SHIFT TO RIGHT

END IF;

END IF;

END PROCESS;

-- ADD|SUB

ADDER: S<=P(INT31) & P(INT31 DOWNTO INT15+1) - SIGNED(A) WHEN B(0) = '1' AND SIGN = '1' ELSE

P(INT31) & P(INT31 DOWNTO INT15+1) + SIGNED(A) WHEN B(0) = '1' ELSE

P(INT31) & P(INT31 DOWNTO INT15+1);

-- MULPY

RG_P: PROCESS (CLK, RST, P)

BEGIN

IF RST = '1' THEN

P<=CONST032;

ELSIF CLK = '1' AND CLK'EVENT THEN

IF LAB = '1' THEN

P<= CONST032;

ELSIF SHIFT = '1' THEN

P<=S & P(INT15 DOWNTO 1); -- SHIFT TO RIGHT

END IF;

END IF;

END PROCESS;

-- SELECTOR

DP <= STD_LOGIC_VECTOR(P(INT15 DOWNTO 0)) WHEN OUTHL = '1' ELSE

STD_LOGIC_VECTOR(P(INT31 DOWNTO 16));

SF <= P(INT15);

ZFI<='1' WHEN P(INT15 DOWNTO 0) = SIGNED(CONST016) ELSE '0';

OK_ZF: OPNDRN PORT MAP ( ZFI, ZF );

-- Generate Statement

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_ua IS

PORT(

CLK, RST, START : in STD_ULOGIC;

LAB, SHIFT, SIGN, RDY : out STD_ULOGIC

);

end mcu_ua;

ARCHITECTURE CUA OF mcu_ua IS

TYPE STATES IS (S1,S2,S3,S4,S5,S6,S7,S8,S9,S10,S11,S12,S13,S14,S15,S16,S17,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<= FINISH;

WHEN FINISH => IF START='1' THEN ST<= S1;

ELSE ST<=FINISH; END IF;

END CASE;

END IF;

END PROCESS;

LAB<='1' WHEN ST=S1 ELSE '0';

SHIFT<='0' WHEN ST=S1 OR ST=FINISH ELSE '1';

SIGN<='1' WHEN ST=S17 ELSE '0';

RDY<='1' WHEN ST=FINISH ELSE '0';

end CUA;

23