sgate.vhd
来自「一个非常好的dc使用书籍 一个非常好的dc使用书籍」· VHDL 代码 · 共 883 行 · 第 1/2 页
VHD
883 行
END oper_left_shift;
ARCHITECTURE sim_arch OF oper_left_shift IS
SIGNAL res : STD_LOGIC_VECTOR(width_a-1 DOWNTO 0);
SIGNAL resx : STD_LOGIC_VECTOR(width_a-1 DOWNTO 0); --need to add cin xor functionality
BEGIN
U0 : lpm_clshift
GENERIC MAP (
lpm_type => "LPM_CLSHIFT",
lpm_shifttype => "ARITHMETIC",
lpm_width => width_a,
lpm_widthdist => width_amount
)
PORT MAP (
distance => amount,
direction => '0',
data => a,
result => res
);
o(width_o-1 DOWNTO 0) <= res(width_o-1 DOWNTO 0);
END sim_arch;
--------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------
library IEEE;
use IEEE.std_logic_1164.all;
LIBRARY LPM;
USE LPM.LPM_COMPONENTS.all;
ENTITY oper_right_shift IS
GENERIC
(
sgate_representation : NATURAL :=1;
width_a : NATURAL :=8;
width_amount : NATURAL :=3;
width_o : NATURAL :=8
);
PORT
(
a : IN STD_LOGIC_VECTOR(width_a-1 DOWNTO 0);
amount : IN STD_LOGIC_VECTOR(width_amount-1 DOWNTO 0);
cin : IN STD_LOGIC;
o : OUT STD_LOGIC_VECTOR(width_o-1 DOWNTO 0)
);
END oper_right_shift;
ARCHITECTURE sim_arch OF oper_right_shift IS
FUNCTION STR_REPRESENTATION( i : NATURAL ) RETURN STRING IS
BEGIN
IF (i>0) THEN
RETURN "ARITHMETIC";
ELSE
RETURN "LOGICAL";
END IF;
END;
SIGNAL res : STD_LOGIC_VECTOR(width_a-1 DOWNTO 0);
BEGIN
U0 : lpm_clshift GENERIC MAP (
lpm_type => "LPM_CLSHIFT",
lpm_shifttype => STR_REPRESENTATION(sgate_representation),
lpm_width => width_a,
lpm_widthdist => width_amount
)
PORT MAP (
distance => amount,
direction => '1',
data => a,
result => res
);
o(width_o-1 DOWNTO 0) <= res(width_o-1 DOWNTO 0);
END sim_arch;
--------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------
library IEEE;
use IEEE.std_logic_1164.all;
LIBRARY LPM;
USE LPM.LPM_COMPONENTS.all;
ENTITY oper_rotate_left IS
GENERIC
(
width_a : NATURAL;
width_amount : NATURAL;
width_o : NATURAL
);
PORT
(
a : IN STD_LOGIC_VECTOR(width_a-1 DOWNTO 0);
amount : IN STD_LOGIC_VECTOR(width_amount-1 DOWNTO 0);
o : OUT STD_LOGIC_VECTOR(width_o-1 DOWNTO 0)
);
END oper_rotate_left;
ARCHITECTURE sim_arch OF oper_rotate_left IS
SIGNAL res : STD_LOGIC_VECTOR(width_a-1 DOWNTO 0);
BEGIN
U0 : lpm_clshift
GENERIC MAP (
lpm_type => "LPM_CLSHIFT",
lpm_shifttype => "ROTATE",
lpm_width => width_a,
lpm_widthdist => width_amount
)
PORT MAP (
distance => amount,
direction => '0',
data => a,
result => res
);
o(width_o-1 DOWNTO 0) <= res(width_o-1 DOWNTO 0);
END sim_arch;
--------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------
library IEEE;
use IEEE.std_logic_1164.all;
LIBRARY LPM;
USE LPM.LPM_COMPONENTS.all;
ENTITY oper_rotate_right IS
GENERIC
(
width_a : NATURAL :=8;
width_amount : NATURAL :=4;
width_o : NATURAL :=8
);
PORT
(
a : IN STD_LOGIC_VECTOR(width_a-1 DOWNTO 0);
amount : IN STD_LOGIC_VECTOR(width_amount-1 DOWNTO 0);
o : OUT STD_LOGIC_VECTOR(width_o-1 DOWNTO 0)
);
END oper_rotate_right;
ARCHITECTURE sim_arch OF oper_rotate_right IS
SIGNAL res : STD_LOGIC_VECTOR(width_a-1 DOWNTO 0);
BEGIN
U0 : lpm_clshift
GENERIC MAP (
lpm_type => "LPM_CLSHIFT",
lpm_shifttype => "ROTATE",
lpm_width => width_a,
lpm_widthdist => width_amount
)
PORT MAP (
distance => amount,
direction => '1',
data => a,
result => res
);
o(width_o-1 DOWNTO 0) <= res(width_o-1 DOWNTO 0);
END sim_arch;
--------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
ENTITY oper_less_than IS
GENERIC
(
sgate_representation : NATURAL :=0;
width_a : NATURAL :=8;
width_b : NATURAL :=5
);
PORT
(
a : IN STD_LOGIC_VECTOR(width_a-1 DOWNTO 0);
b : IN STD_LOGIC_VECTOR(width_b-1 DOWNTO 0);
cin : IN STD_LOGIC;
o : OUT STD_LOGIC
);
END oper_less_than;
ARCHITECTURE sim_arch OF oper_less_than IS
BEGIN
g1:IF sgate_representation>0 GENERATE
PROCESS(a,b,cin)
VARIABLE va : SIGNED(width_a-1 DOWNTO 0);
VARIABLE vb : SIGNED(width_b-1 DOWNTO 0);
BEGIN
va := SIGNED(a);
vb := SIGNED(b);
IF (va<vb) THEN
o <= '1';
ELSIF (va=vb) AND (cin='1') THEN
o <= '1';
ELSE
o <= '0';
END IF;
END PROCESS;
END GENERATE g1;
g2:IF sgate_representation=0 GENERATE
PROCESS(a,b,cin)
VARIABLE va : UNSIGNED(width_a-1 DOWNTO 0);
VARIABLE vb : UNSIGNED(width_b-1 DOWNTO 0);
BEGIN
va := UNSIGNED(a);
vb := UNSIGNED(b);
IF (va<vb) THEN
o <= '1';
ELSIF (va=vb) AND (cin='1') THEN
o <= '1';
ELSE
o <= '0';
END IF;
END PROCESS;
END GENERATE g2;
END sim_arch;
--------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_unsigned.all;
use IEEE.numeric_std.all;
ENTITY oper_mux IS
GENERIC
(
width_sel : NATURAL :=3;
width_data : NATURAL :=8
);
PORT
(
sel : IN STD_LOGIC_VECTOR(width_sel-1 DOWNTO 0);
data : IN STD_LOGIC_VECTOR(width_data-1 DOWNTO 0);
o : OUT STD_LOGIC
);
END oper_mux;
ARCHITECTURE sim_arch OF oper_mux IS
signal selu : UNSIGNED(width_sel-1 DOWNTO 0);
BEGIN
selu <= unsigned(sel);
o <= data(to_integer(selu));
END sim_arch;
--------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------
library IEEE;
use IEEE.std_logic_1164.all;
ENTITY oper_selector IS
GENERIC
(
width_sel : NATURAL :=8;
width_data : NATURAL :=8
);
PORT
(
sel : IN STD_LOGIC_VECTOR(width_sel-1 DOWNTO 0);
data : IN STD_LOGIC_VECTOR(width_data-1 DOWNTO 0);
o : OUT STD_LOGIC
);
END oper_selector;
ARCHITECTURE sim_arch OF oper_selector IS
BEGIN
g1:FOR k IN 0 TO width_data-1 GENERATE
o <= data(k) WHEN (sel(k)='1') ELSE 'Z';
END GENERATE;
END sim_arch;
--------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use IEEE.std_logic_signed.all;
ENTITY oper_prio_selector IS
GENERIC
(
width_sel : NATURAL;
width_data : NATURAL
);
PORT
(
sel : IN STD_LOGIC_VECTOR(width_sel-1 DOWNTO 0);
data : IN STD_LOGIC_VECTOR(width_data-1 DOWNTO 0);
cin : IN STD_LOGIC;
o : OUT STD_LOGIC
);
END oper_prio_selector;
ARCHITECTURE sim_arch OF oper_prio_selector IS
BEGIN
g1:FOR k IN 0 TO width_sel-1 GENERATE
o <= data(k) WHEN (sel(k)='1') ELSE 'Z';
END GENERATE;
END sim_arch;
--------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------
library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use IEEE.std_logic_unsigned.all;
ENTITY oper_decoder IS
GENERIC
(
width_i : NATURAL :=1;
width_o : NATURAL :=2
);
PORT
(
i : IN STD_LOGIC_VECTOR(width_i-1 DOWNTO 0);
o : OUT STD_LOGIC_VECTOR(width_o-1 DOWNTO 0)
);
END oper_decoder;
ARCHITECTURE sim_arch OF oper_decoder IS
FUNCTION int2ustd(value : integer; width : integer) RETURN std_logic_vector IS
-- convert integer to unsigned std_logicvector
BEGIN
RETURN conv_std_logic_vector(CONV_UNSIGNED(value, width ), width);
END int2ustd;
BEGIN
G1:FOR k IN 0 TO width_o-1 GENERATE
o(k) <= '1' WHEN (i=int2ustd(k,width_i)) ELSE '0';
END GENERATE;
END sim_arch;
--------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------
library IEEE;
use IEEE.std_logic_1164.all;
ENTITY oper_bus_mux IS
GENERIC
(
width_a : NATURAL :=8;
width_b : NATURAL :=8;
width_o : NATURAL :=8
);
PORT
(
a : IN STD_LOGIC_VECTOR(width_a-1 DOWNTO 0);
b : IN STD_LOGIC_VECTOR(width_b-1 DOWNTO 0);
sel : IN STD_LOGIC;
o : OUT STD_LOGIC_VECTOR(width_o-1 DOWNTO 0)
);
END oper_bus_mux;
ARCHITECTURE sim_arch OF oper_bus_mux IS
BEGIN
o <= a WHEN sel='0' ELSE b;
END sim_arch;
--------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------
library IEEE;
use IEEE.std_logic_1164.all;
ENTITY carry_sum IS
PORT
(
cin : IN STD_LOGIC;
cout : OUT STD_LOGIC;
sum_in : IN STD_LOGIC;
sum_out : OUT STD_LOGIC
);
END carry_sum;
ARCHITECTURE sim_arch OF carry_sum IS
BEGIN
sum_out <= sum_in;
cout <= cin;
END sim_arch;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?