218 lines
4.2 KiB
VHDL
218 lines
4.2 KiB
VHDL
|
|
||
|
--
|
||
|
-- Flip-flop.
|
||
|
--
|
||
|
|
||
|
library ieee;
|
||
|
use ieee.std_logic_1164.all;
|
||
|
|
||
|
entity smul_flipflop is
|
||
|
port (
|
||
|
clk: in std_ulogic;
|
||
|
clken: in std_ulogic;
|
||
|
d: in std_ulogic;
|
||
|
q: out std_ulogic );
|
||
|
end entity;
|
||
|
|
||
|
architecture smul_flipflop_arch of smul_flipflop is
|
||
|
begin
|
||
|
process (clk) is
|
||
|
begin
|
||
|
if rising_edge(clk) then
|
||
|
if to_x01(clken) = '1' then
|
||
|
q <= d;
|
||
|
end if;
|
||
|
end if;
|
||
|
end process;
|
||
|
end architecture;
|
||
|
|
||
|
|
||
|
--
|
||
|
-- Inverter.
|
||
|
--
|
||
|
|
||
|
library ieee;
|
||
|
use ieee.std_logic_1164.all;
|
||
|
|
||
|
entity smul_inverter is
|
||
|
port (
|
||
|
d: in std_ulogic;
|
||
|
q: out std_ulogic );
|
||
|
end entity;
|
||
|
|
||
|
architecture smul_inverter_arch of smul_inverter is
|
||
|
begin
|
||
|
q <= not d;
|
||
|
end architecture;
|
||
|
|
||
|
|
||
|
--
|
||
|
-- Half-adder.
|
||
|
--
|
||
|
|
||
|
library ieee;
|
||
|
use ieee.std_logic_1164.all;
|
||
|
|
||
|
entity smul_half_add is
|
||
|
port (
|
||
|
x: in std_ulogic;
|
||
|
y: in std_ulogic;
|
||
|
d: out std_ulogic;
|
||
|
c: out std_ulogic );
|
||
|
end entity;
|
||
|
|
||
|
architecture smul_half_add_arch of smul_half_add is
|
||
|
begin
|
||
|
d <= x xor y;
|
||
|
c <= x and y;
|
||
|
end architecture;
|
||
|
|
||
|
|
||
|
--
|
||
|
-- Full-adder.
|
||
|
--
|
||
|
|
||
|
library ieee;
|
||
|
use ieee.std_logic_1164.all;
|
||
|
|
||
|
entity smul_full_add is
|
||
|
port (
|
||
|
x: in std_ulogic;
|
||
|
y: in std_ulogic;
|
||
|
z: in std_ulogic;
|
||
|
d: out std_ulogic;
|
||
|
c: out std_ulogic );
|
||
|
end entity;
|
||
|
|
||
|
architecture smul_full_add_arch of smul_full_add is
|
||
|
begin
|
||
|
d <= x xor y xor z;
|
||
|
c <= (x and y) or (y and z) or (x and z);
|
||
|
end architecture;
|
||
|
|
||
|
|
||
|
--
|
||
|
-- Booth negative flag.
|
||
|
--
|
||
|
|
||
|
library ieee;
|
||
|
use ieee.std_logic_1164.all;
|
||
|
|
||
|
entity smul_booth_neg is
|
||
|
port (
|
||
|
p0: in std_ulogic;
|
||
|
p1: in std_ulogic;
|
||
|
p2: in std_ulogic;
|
||
|
f: out std_ulogic );
|
||
|
end entity;
|
||
|
|
||
|
architecture smul_booth_neg_arch of smul_booth_neg is
|
||
|
begin
|
||
|
f <= p2 and ((not p1) or (not p0));
|
||
|
end architecture;
|
||
|
|
||
|
|
||
|
--
|
||
|
-- Booth partial product generation.
|
||
|
--
|
||
|
|
||
|
library ieee;
|
||
|
use ieee.std_logic_1164.all;
|
||
|
|
||
|
entity smul_booth_prod is
|
||
|
port (
|
||
|
p0: in std_ulogic;
|
||
|
p1: in std_ulogic;
|
||
|
p2: in std_ulogic;
|
||
|
b0: in std_ulogic;
|
||
|
b1: in std_ulogic;
|
||
|
y: out std_ulogic );
|
||
|
end entity;
|
||
|
|
||
|
architecture smul_booth_prod_arch of smul_booth_prod is
|
||
|
begin
|
||
|
process (p0, p1, p2, b0, b1) is
|
||
|
variable p: std_ulogic_vector(2 downto 0);
|
||
|
begin
|
||
|
p := (p2, p1, p0);
|
||
|
case p is
|
||
|
when "000" => y <= '0'; -- factor 0
|
||
|
when "001" => y <= b1; -- factor 1
|
||
|
when "010" => y <= b1; -- factor 1
|
||
|
when "011" => y <= b0; -- factor 2
|
||
|
when "100" => y <= not b0; -- factor -2
|
||
|
when "101" => y <= not b1; -- factor -1
|
||
|
when "110" => y <= not b1; -- factor -1
|
||
|
when others => y <= '0'; -- factor 0
|
||
|
end case;
|
||
|
end process;
|
||
|
end architecture;
|
||
|
|
||
|
|
||
|
--
|
||
|
-- Determine carry generate and carry propagate.
|
||
|
--
|
||
|
|
||
|
library ieee;
|
||
|
use ieee.std_logic_1164.all;
|
||
|
|
||
|
entity smul_carry_prop is
|
||
|
port (
|
||
|
a: in std_ulogic;
|
||
|
b: in std_ulogic;
|
||
|
g: out std_ulogic;
|
||
|
p: out std_ulogic );
|
||
|
end entity;
|
||
|
|
||
|
architecture smul_carry_prop of smul_carry_prop is
|
||
|
begin
|
||
|
g <= a and b;
|
||
|
p <= a xor b;
|
||
|
end architecture;
|
||
|
|
||
|
|
||
|
--
|
||
|
-- Merge two carry propagation trees.
|
||
|
--
|
||
|
|
||
|
library ieee;
|
||
|
use ieee.std_logic_1164.all;
|
||
|
|
||
|
entity smul_carry_merge is
|
||
|
port (
|
||
|
g0: in std_ulogic;
|
||
|
p0: in std_ulogic;
|
||
|
g1: in std_ulogic;
|
||
|
p1: in std_ulogic;
|
||
|
g: out std_ulogic;
|
||
|
p: out std_ulogic );
|
||
|
end entity;
|
||
|
|
||
|
architecture smul_carry_merge of smul_carry_merge is
|
||
|
begin
|
||
|
g <= g1 or (g0 and p1);
|
||
|
p <= p0 and p1;
|
||
|
end architecture;
|
||
|
|
||
|
|
||
|
--
|
||
|
-- Calculate carry-out through a carry propagation tree.
|
||
|
--
|
||
|
|
||
|
library ieee;
|
||
|
use ieee.std_logic_1164.all;
|
||
|
|
||
|
entity smul_carry_eval is
|
||
|
port (
|
||
|
g: in std_ulogic;
|
||
|
p: in std_ulogic;
|
||
|
cin: in std_ulogic;
|
||
|
cout: out std_ulogic );
|
||
|
end entity;
|
||
|
|
||
|
architecture smul_carry_eval of smul_carry_eval is
|
||
|
begin
|
||
|
cout <= g or (p and cin);
|
||
|
end architecture;
|
||
|
|