--IEEE库
library IEEE;--使用该库下的STD_LOGIC_1164use IEEE.STD_LOGIC_1164.all;--使用该库下的STD_LOGIC_ARITHuse IEEE.STD_LOGIC_ARITH.ALL;--使用该库下的STD_LOGIC_UNSIGNEDuse IEEE.STD_LOGIC_UNSIGNED.ALL;--使用自定义的包集合usework.CALC1_PAK.ALL;--创建MEM的entity
entity MEM is
Port (--长度3,初始化为000
ADDR : in STD_LOGIC_VECTOR(2 downto 0):="000";--CLK,EN端口设置为std_logic类型
CLK,EN : in STD_LOGIC;--输出,类型为MY_RECORD
DATA_FRAME : out MY_RECORD
);end MEM;
architecture RTL of MEM is--长度6的ROM数组,每个元素类型是MY_RECORDtype ROM_ARRAY is array (0to5)of MY_RECORD;--存储器内部ROM_ARRAY数组的所有元素全部初始化为0
constant MY_ROM : ROM_ARRAY :=(0=>( A_IN =>"0000", B_IN =>"0000", OP_CODE =>"0000", C_IN =>'0', EXP_OUT =>"0000"),1=>( A_IN =>"0001", B_IN =>"0000", OP_CODE =>"0000", C_IN =>'0', EXP_OUT =>"0000"),2=>( A_IN =>"0010", B_IN =>"0000", OP_CODE =>"0000", C_IN =>'0', EXP_OUT =>"0000"),3=>( A_IN =>"0011", B_IN =>"0000", OP_CODE =>"0000", C_IN =>'0', EXP_OUT =>"0000"),4=>( A_IN =>"0100", B_IN =>"0000", OP_CODE =>"0000", C_IN =>'0', EXP_OUT =>"0000"),5=>( A_IN =>"0101", B_IN =>"0000", OP_CODE =>"0000", C_IN =>'0', EXP_OUT =>"0000"));begin
process ( CLK )begin--遇到上升沿触发if rising_edge ( CLK)then--EN使能端输入为1 if( EN ='1')then--强制转换为整型赋值给,对应数组的索引,将对应的A_IN,B_IN,OP_CODE,C_IN,EXP_OUT赋值给DATA_FRAME
DATA_FRAME <= MY_ROM(conv_integer(ADDR));endif;endif;end process ;end RTL;
3.testbench.vhd
--IEEE库
library IEEE;--使用该库下的STD_LOGIC_1164use IEEE.STD_LOGIC_1164.all;--使用自定义的包集合usework.CALC1_PAK.ALL;
ENTITY testbench ISEND testbench;
ARCHITECTURE behavior OF testbench IS-- component:就是将Design Entity中的port内容写一遍
COMPONENT MEM
Port (--长度3
ADDR : in STD_LOGIC_VECTOR(2 downto 0);--CLK,EN端口设置为std_logic类型
CLK,EN : in STD_LOGIC;--输出到记录MY_RECORD中
DATA_FRAME : out MY_RECORD
);END COMPONENT;--Inputs
signal ADDR : std_logic_vector(2 downto 0) :=(others =>'0');
signal CLK : std_logic :='0';
signal EN : std_logic :='0';--Outputs
signal DATA_FRAME : MY_RECORD;-- Clock period definitions
constant CLK_period : time :=10 ns;BEGIN-- Unit Under Test (UUT):将(Component)MEM的端口Port映射到信号signal上
uut: MEM PORT MAP (
ADDR => ADDR,
CLK => CLK,
EN => EN,
DATA_FRAME => DATA_FRAME
);-- Clock process definitions
CLK_process :process
begin
CLK <='0';
wait for CLK_period/2;
CLK <='1';
wait for CLK_period/2;end process;-- Stimulus process
stim_proc: process
begin-- hold reset state for 100 ns.
wait for100 ns;
wait for CLK_period*10;-- insert stimulus here
EN <='1';
ADDR <="000";
wait for100 ns;
ADDR <="001";
wait for100 ns;
ADDR <="010";
wait for100 ns;
ADDR <="011";
wait for100 ns;
ADDR <="100";
wait for100 ns;
ADDR <="101";
wait;end process;END;
二、比较器实验
1.COMP.vhd
--IEEE库
library IEEE;--使用该库下的STD_LOGIC_1164use IEEE.STD_LOGIC_1164.all;--使用该库下的STD_LOGIC_ARITHuse IEEE.STD_LOGIC_ARITH.ALL;--使用该库下的STD_LOGIC_UNSIGNEDuse IEEE.STD_LOGIC_UNSIGNED.ALL;--创建COMP的entity
entity COMP is
Port (--CLK:设置为std_logic类型,时钟
CLK: in std_logic;--EN:设置为std_logic类型,由FSM输出的使能信号
EN: in std_logic;--EXPECTED:长度4的逻辑矢量,由ROM模块输出的数据,数据的期望值
EXPECTED: in std_logic_vector(3 downto 0);--ALU_OUT:长度4的逻辑矢量,由ALU模块输出的数据,数据的实际值
ALU_OUT: in std_logic_vector(3 downto 0);--RESULT:设置为std_logic类型,比较结果
RESULT: out std_logic
);end COMP;--创建COMP的architecture
architecture behavioral of COMP isbegin--过程
process(CLK)begin--遇到上升沿触发if rising_edge(CLK)then--如果使能激发if(EN ='1')then--结果数据的期望值EXPECTED和数据的实际值EXPECTED比较相等if(EXPECTED = ALU_OUT )then--结果RESULT输出为1
RESULT <='1';else--不等时结果RESULT输出为1
RESULT <='0';endif;--当EXPECTED = ALU_OUT时,跳过;不等时跳过
assert (EXPECTED = ALU_OUT )--输出信息
report " Warning, simulation mismatch has occurred "--级别
severity warning ;endif;endif;end process;end behavioral;
2.testbench.vhd
--IEEE库
library IEEE;--使用该库下的STD_LOGIC_1164use IEEE.STD_LOGIC_1164.all;--使用该库下的STD_LOGIC_UNSIGNEDuse IEEE.STD_LOGIC_UNSIGNED.all;--使用该库下的NUMERIC_STDuse IEEE.NUMERIC_STD.all;--创建testbench的entity
entity COMP_TB_VHD isend COMP_TB_VHD;--创建testbench的architecture
architecture BEHAVIOR of COMP_TB_VHD is
component COMP
Port (--CLK:设置为std_logic类型,时钟
CLK: in std_logic;--EN:设置为std_logic类型,由FSM输出的使能信号
EN: in std_logic;--EXPECTED:长度4的逻辑矢量,由ROM模块输出的数据,数据的期望值
EXPECTED: in std_logic_vector(3 downto 0);--ALU_OUT:长度4的逻辑矢量,由ALU模块输出的数据,数据的实际值
ALU_OUT: in std_logic_vector(3 downto 0);--RESULT:设置为std_logic类型,比较结果
RESULT: out std_logic
);end component;--信号signal初始化--初始化为0
signal EXPECTED:STD_LOGIC_VECTOR(3 downto 0) :=(others=>'0');--初始化为0
signal ALU_OUT: STD_LOGIC_VECTOR(3 downto 0) :=(others=>'0');--初始化为1,表示激活
signal EN: STD_LOGIC :='1';--初始化为0
signal CLK: STD_LOGIC :='0';
signal RESULT: STD_LOGIC;begin-- Unit Under Test (UUT):将Component的端口Port映射到信号signal上
UUT: COMP port map(
EXPECTED => EXPECTED,
ALU_OUT => ALU_OUT,
RESULT => RESULT,
EN => EN,
CLK => CLK);--每20ns翻转
CLK <=not CLK after20 ns;-- Stimulus process
TB: process
begin--数据期望设为X"A",即1010
EXPECTED <= X"A";--数据实际值设为X"A",即1010
ALU_OUT <= X"A";--等待200ns
wait for200 ns;--数据期望设为X"A",即1010
EXPECTED <= X"A";--数据实际值设为X"B",即1011
ALU_OUT <= X"B";--等待200ns
wait for200 ns;--数据期望设为X"1",即0001
EXPECTED <= X"1";--数据实际值设为X"1",即0001
ALU_OUT <= X"1";--等待200ns
wait for200 ns;--数据期望设为X"1",即0001
EXPECTED <= X"1";--数据实际值设为X"2",即0010
ALU_OUT <= X"2";
wait;end process;end;
三、算术逻辑单元实验
1.1.ALU.vhd
--IEEE库
library IEEE;--使用该库下的STD_LOGIC_1164use IEEE.STD_LOGIC_1164.all;--使用该库下的STD_LOGIC_ARITHuse IEEE.STD_LOGIC_ARITH.ALL;--使用该库下的STD_LOGIC_UNSIGNEDuse IEEE.STD_LOGIC_UNSIGNED.ALL;--创建ALU的entity
entity ALU is
port(--CLK:设置为std_logic类型,时钟
CLK:in std_logic ;--EN:设置为std_logic类型,由FSM输出的使能信号
EN:in std_logic ;--OP_CODE:长度4的逻辑矢量
OP_CODE:in std_logic_vector (3 downto 0);--A:长度4的逻辑矢量
A:in std_logic_vector (3 downto 0);--B:长度4的逻辑矢量
B:in std_logic_vector (3 downto 0);--C:设置为std_logic类型
C_IN:in std_logic ;--Y:长度4的逻辑矢量,输出结果
Y:out std_logic_vector (3 downto 0));end entity ALU;--创建ALU的architecture
architecture behavioral of ALU is--信号OP_CODE_CI是长度5的逻辑矢量
signal OP_CODE_CI : std_logic_vector (4 downto 0);begin--信号OP_CODE_CI是OP_CODE和C_IN的拼凑
OP_CODE_CI <= OP_CODE & C_IN ;--过程
process ( CLK )begin--遇到上升沿触发if rising_edge ( CLK )then--如果使能激发if(EN ='1')then--匹配OP_CODE_CI对应的情况case OP_CODE_CI is--对应功能:传输Awhen"00000"=> Y <= A;--对应功能:递增Awhen"00001"=> Y <= A +1;--对应功能:加和when"00010"=> Y <= A + B ;--对应功能:带进位的加和when"00011"=> Y <= A + B +1;--对应功能:与补码相加when"00100"=> Y <= A +not B ;--对应功能:减when"00101"=> Y <= A +not B +1;--对应功能:递减when"00110"=> Y <= A -1;--对应功能:传输Awhen"00111"=> Y <= A ;--对应功能:与when"01000"=> Y <= A and B ;--对应功能:或when"01010"=> Y <= A or B ;--对应功能:异或when"01100"=> Y <= A xor B ;--对应功能:反码when"01110"=> Y <=not A ;--对应功能:传输0when"10000"=> Y <=(others =>'0');--匹配不上的其他情况when others => Y <=(others =>'X');endcase;endif;endif;end process;end architecture behavioral;
2.testbench.vhd
--IEEE库
library IEEE;--使用该库下的STD_LOGIC_1164USE ieee.std_logic_1164.ALL;--创建testbench的entity
ENTITY ALU_TB_vhd ISEND ALU_TB_vhd;--创建testbench的architecture
ARCHITECTURE test OF ALU_TB_vhd IS--component:就是将Design Entity中的port内容写一遍
COMPONENT alu
port(--CLK:设置为std_logic类型,时钟
CLK:in std_logic ;--EN:设置为std_logic类型,由FSM输出的使能信号
EN:in std_logic ;--OP_CODE:长度4的逻辑矢量,操作码
OP_CODE :in std_logic_vector (3 downto 0);--A:长度4的逻辑矢量,数据A
A:in std_logic_vector (3 downto 0);--B:长度4的逻辑矢量,数据B
B:in std_logic_vector (3 downto 0);--C:设置为std_logic类型,carry_in借位输入
C_IN:in std_logic ;--Y:长度4的逻辑矢量,输出结果
Y:out std_logic_vector (3 downto 0));END COMPONENT;--信号signal初始化--操作码初始化为0
SIGNAL OP_CODE_SIG : std_logic_vector(3 downto 0):=(others =>'0');--数据A初始化为0111
SIGNAL A_SIG : std_logic_vector(3 downto 0):="0111";--数据B初始化为0011
SIGNAL B_SIG : std_logic_vector(3 downto 0):="0011";--carry_in借位输入初始化为0
SIGNAL C_IN_SIG : std_logic :='0';--使能初始化为0
SIGNAL EN_SIG : std_logic :='1';--时钟初始化为0
SIGNAL CLK : std_logic :='0';--输出结果声明
SIGNAL Y_SIG : std_logic_vector(3 downto 0);--信号OP_CODE_CI(OP_CODE和C_IN的拼凑)初始化为0
SIGNAL OP_CODE_CI_SIG : std_logic_vector (4 downto 0) :=(others =>'0');begin--OP_CODE_SIG取OP_CODE_CI_SIG的对应的前4个
OP_CODE_SIG <= OP_CODE_CI_SIG(4 downto 1);--C_IN_SIG取OP_CODE_CI_SIG的对应的最后的一个
C_IN_SIG <= OP_CODE_CI_SIG(0);-- Unit Under Test (UUT):将Component的端口Port映射到信号signal上
uut: alu PORT MAP(
OP_CODE => OP_CODE_SIG,
A => A_SIG,
B => B_SIG,
C_IN => C_IN_SIG,
Y => Y_SIG,
EN => EN_SIG,
CLK => CLK
);--每10ns翻转
clk <=not clk after10 ns;
process
begin--对应功能:传输A
OP_CODE_CI_SIG <="00000"; wait for100 ns;--对应功能:递增A
OP_CODE_CI_SIG <="00001"; wait for100 ns;--对应功能:加和
OP_CODE_CI_SIG <="00010"; wait for100 ns;--对应功能:带进位的加和
OP_CODE_CI_SIG <="00011"; wait for100 ns;--对应功能:与补码相加
OP_CODE_CI_SIG <="00100"; wait for100 ns;--对应功能:减
OP_CODE_CI_SIG <="00101"; wait for100 ns;--对应功能:递减
OP_CODE_CI_SIG <="00110"; wait for100 ns;--对应功能:传输A
OP_CODE_CI_SIG <="00111"; wait for100 ns;--对应功能:与
OP_CODE_CI_SIG <="01000"; wait for100 ns;--对应功能:或
OP_CODE_CI_SIG <="01010"; wait for100 ns;--对应功能:异或
OP_CODE_CI_SIG <="01100"; wait for100 ns;--对应功能:反码
OP_CODE_CI_SIG <="01110"; wait for100 ns;--对应功能:传输0
OP_CODE_CI_SIG <="10000"; wait;end process;END architecture test;
--创建ALU的architecture
architecture behavioral of ALU is--信号OP_CODE_CI是长度5的逻辑矢量
signal OP_CODE_CI : std_logic_vector (4 downto 0);begin--信号OP_CODE_CI是OP_CODE和C_IN的拼凑
OP_CODE_CI <= OP_CODE & C_IN ;--过程
process ( CLK )begin--遇到上升沿触发if rising_edge ( CLK )then--如果使能激发if(EN ='1')then--匹配OP_CODE_CI对应的情况case OP_CODE_CI is--对应功能:传输Awhen"00000"=> Y <= A;--对应功能:递增Awhen"00001"=> Y <= A +1;--对应功能:加和when"00010"=> Y <= A + B ;--对应功能:带进位的加和when"00011"=> Y <= A + B +1;--对应功能:与补码相加when"00100"=> Y <= A +not B ;--对应功能:减when"00101"=> Y <= A +not B +1;--对应功能:递减when"00110"=> Y <= A -1;--对应功能:传输Awhen"00111"=> Y <= A ;--对应功能:与when"01000"=> Y <= A and B ;--对应功能:或when"01010"=> Y <= A or B ;--对应功能:异或when"01100"=> Y <= A xor B ;--对应功能:反码when"01110"=> Y <=not A ;--对应功能:传输0when"10000"=> Y <=(others =>'0');--匹配不上的其他情况when others => Y <=(others =>'X');endcase;endif;endif;end process;end architecture behavioral;
2.testbench.vhd
--IEEE库
library IEEE;--使用该库下的STD_LOGIC_1164USE ieee.std_logic_1164.ALL;--创建testbench的entity
ENTITY ALU_TB_vhd ISEND ALU_TB_vhd;--创建testbench的architecture
ARCHITECTURE test OF ALU_TB_vhd IS--component:就是将Design Entity中的port内容写一遍
COMPONENT alu
port();END COMPONENT;--信号signal初始化--操作码初始化为0
SIGNAL OP_CODE_SIG : std_logic_vector(3 downto 0):=(others =>'0');--数据A初始化为0111
SIGNAL A_SIG : std_logic_vector(3 downto 0):="0111";--数据B初始化为0011
SIGNAL B_SIG : std_logic_vector(3 downto 0):="0011";--carry_in借位输入初始化为0
SIGNAL C_IN_SIG : std_logic :='0';--使能初始化为0
SIGNAL EN_SIG : std_logic :='1';--时钟初始化为0
SIGNAL CLK : std_logic :='0';--输出结果声明
SIGNAL Y_SIG : std_logic_vector(3 downto 0);--信号OP_CODE_CI(OP_CODE和C_IN的拼凑)初始化为0
SIGNAL OP_CODE_CI_SIG : std_logic_vector (4 downto 0) :=(others =>'0');begin--OP_CODE_SIG取OP_CODE_CI_SIG的对应的前4个
OP_CODE_SIG <= OP_CODE_CI_SIG(4 downto 1);--C_IN_SIG取OP_CODE_CI_SIG的对应的最后的一个
C_IN_SIG <= OP_CODE_CI_SIG(0);-- Unit Under Test (UUT):将Component的端口Port映射到信号signal上
uut: alu PORT MAP();--每10ns翻转
clk <=not clk after10 ns;
process
begin--对应功能:传输A
OP_CODE_CI_SIG <="00000"; wait for100 ns;--对应功能:递增A
OP_CODE_CI_SIG <="00001"; wait for100 ns;--对应功能:加和
OP_CODE_CI_SIG <="00010"; wait for100 ns;--对应功能:带进位的加和
OP_CODE_CI_SIG <="00011"; wait for100 ns;--对应功能:与补码相加
OP_CODE_CI_SIG <="00100"; wait for100 ns;--对应功能:减
OP_CODE_CI_SIG <="00101"; wait for100 ns;--对应功能:递减
OP_CODE_CI_SIG <="00110"; wait for100 ns;--对应功能:传输A
OP_CODE_CI_SIG <="00111"; wait for100 ns;--对应功能:与
OP_CODE_CI_SIG <="01000"; wait for100 ns;--对应功能:或
OP_CODE_CI_SIG <="01010"; wait for100 ns;--对应功能:异或
OP_CODE_CI_SIG <="01100"; wait for100 ns;--对应功能:反码
OP_CODE_CI_SIG <="01110"; wait for100 ns;--对应功能:传输0
OP_CODE_CI_SIG <="10000"; wait;end process;END architecture test;