将带时钟的VHDL测试台和32位ALU更改为不带时钟的
我在ALU及其测试台上编写了这个VHDL程序: ALU代码:将带时钟的VHDL测试台和32位ALU更改为不带时钟的,vhdl,xilinx,mips32,alu,xilinx-ise,Vhdl,Xilinx,Mips32,Alu,Xilinx Ise,我在ALU及其测试台上编写了这个VHDL程序: ALU代码: library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.NUMERIC_STD.ALL; entity ALU_CLK is port( Clk : in std_logic; --clock signal InRegA,InRegB : in signed(31 downto 0); --input operands InOp : in unsig
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
entity ALU_CLK is
port( Clk : in std_logic; --clock signal
InRegA,InRegB : in signed(31 downto 0); --input operands
InOp : in unsigned(2 downto 0); --Operation to be performed
OutReg : out signed(31 downto 0); --output of ALU
OutZero : out std_logic
);
end ALU_CLK;
architecture Behavioral of ALU_CLK is
signal Reg1,Reg2,Reg3 : signed(31 downto 0) := (others => '0');
begin
Reg1 <= INregA;
Reg2 <= InRegB;
OutReg <= Reg3;
process(Clk)
variable temp: signed(31 downto 0);
begin
if(rising_edge(Clk)) then
case InOp is
when "010" =>
temp := Reg1 + Reg2; --addition
when "000" =>
temp := Reg1 and Reg2; --AND gate
when "001" =>
temp := Reg1 or Reg2; --OR gate
when others =>
NULL;
end case;
if temp = (31 downto 0=>'0') then
OutZero <= '1';
else
OutZero <= '0';
end if;
Reg3 <= temp;
end if;
end process;
end Behavioral;
IEEE库;
使用IEEE.STD_LOGIC_1164.ALL;
使用IEEE.NUMERIC_STD.ALL;
实体ALU_CLK是
端口(时钟:在标准逻辑中;--时钟信号
InRegA,InRegB:in有符号(31到0);--输入操作数
InOp:在无符号状态下(2下降到0);--要执行的操作
OutReg:out signed(31到0);--ALU的输出
OutZero:out std_逻辑
);
完铜锣湾;;
ALU_CLK的架构是
信号Reg1、Reg2、Reg3:已签名(31向下至0):=(其他=>“0”);
开始
Reg1
温度:=Reg1或Reg2--或门
当其他人=>
无效的
终例;
如果温度=(31向下至0=>'0'),则
零下时钟,
InRegA=>A,
InRegB=>B,
InOp=>Op,
OutReg=>R,
OutZero=>zero
);
Clk_流程:流程
开始
Clk即使在没有时钟的模块测试台上,也最好有
一种时钟,可以为测试事件计时,并使其更容易查看测试
波形方面的进展
因此,在从ALU中移除时钟后,测试台进程可以进行控制
刺激并进行如下检查:
-- Combined stimuli and check process
process is
begin
...
-- === 2 + 2 test ===
-- Stimuli control
wait until rising_edge(clk);
InRegA <= to_signed(2, InRegA'length);
InRegB <= to_signed(2, InRegA'length);
InOp <= "010"; -- Add
-- Output check
wait until falling_edge(clk);
assert OutReg = InRegA + InRegB;
assert (OutZero = '1') = (OutReg = 0);
...
end process;
检查
信号由刺激过程控制,以保护
应进行检查,以避免启动时出现错误或其他错误
特殊条件。即使在没有时钟的模块测试台上,也最好有
一种时钟,可以为测试事件计时,并使其更容易查看测试
波形方面的进展
因此,在从ALU中移除时钟后,测试台进程可以进行控制
刺激并进行如下检查:
-- Combined stimuli and check process
process is
begin
...
-- === 2 + 2 test ===
-- Stimuli control
wait until rising_edge(clk);
InRegA <= to_signed(2, InRegA'length);
InRegB <= to_signed(2, InRegA'length);
InOp <= "010"; -- Add
-- Output check
wait until falling_edge(clk);
assert OutReg = InRegA + InRegB;
assert (OutZero = '1') = (OutReg = 0);
...
end process;
检查
信号由刺激过程控制,以保护
应进行检查,以避免启动时出现错误或其他错误
特殊条件。即使在没有时钟的模块测试台上,也最好有
一种时钟,可以为测试事件计时,并使其更容易查看测试
波形方面的进展
因此,在从ALU中移除时钟后,测试台进程可以进行控制
刺激并进行如下检查:
-- Combined stimuli and check process
process is
begin
...
-- === 2 + 2 test ===
-- Stimuli control
wait until rising_edge(clk);
InRegA <= to_signed(2, InRegA'length);
InRegB <= to_signed(2, InRegA'length);
InOp <= "010"; -- Add
-- Output check
wait until falling_edge(clk);
assert OutReg = InRegA + InRegB;
assert (OutZero = '1') = (OutReg = 0);
...
end process;
检查
信号由刺激过程控制,以保护
应进行检查,以避免启动时出现错误或其他错误
特殊条件。即使在没有时钟的模块测试台上,也最好有
一种时钟,可以为测试事件计时,并使其更容易查看测试
波形方面的进展
因此,在从ALU中移除时钟后,测试台进程可以进行控制
刺激并进行如下检查:
-- Combined stimuli and check process
process is
begin
...
-- === 2 + 2 test ===
-- Stimuli control
wait until rising_edge(clk);
InRegA <= to_signed(2, InRegA'length);
InRegB <= to_signed(2, InRegA'length);
InOp <= "010"; -- Add
-- Output check
wait until falling_edge(clk);
assert OutReg = InRegA + InRegB;
assert (OutZero = '1') = (OutReg = 0);
...
end process;
检查
信号由刺激过程控制,以保护
应进行检查,以避免启动时出现错误或其他错误
特殊条件。最后我得到了:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
entity ALU_32 is
port(
InRegA,InRegB : in signed(31 downto 0); --input operands
InOp : in unsigned(2 downto 0); --Operation to be performed
OutReg : out signed(31 downto 0); --output of ALU
OutZero : out std_logic
);
end ALU_32;
architecture Behavioral of ALU_32 is
--temporary signal declaration.
signal Reg1,Reg2,Reg3 : signed(31 downto 0) := (others => '0');
begin
Reg1 <= InRegA;
Reg2 <= InRegB;
OutReg <= Reg3;
process(InOp, InRegA, inRegB)
variable temp: signed(31 downto 0);
begin
case InOp is
when "010" =>
temp := Reg1 + Reg2; --addition
when "110" =>
temp := Reg1 - Reg2; --subtraction
when "000" =>
temp := Reg1 and Reg2; --AND gate
when "001" =>
temp := Reg1 or Reg2; --OR gate
when "100" =>
temp := Reg1 nor Reg2; --NOR gate
when "011" =>
temp := Reg1 xor Reg2; --XOR gate
when "101" =>
temp := not Reg1; --NOT gate
when "111" =>
if Reg1 < Reg2 then --SLT (set on less than) gate
temp := (others => '1');
else
temp := (others => '0');
end if;
when others =>
NULL;
end case;
if temp = (31 downto 0=>'0') then
OutZero <= '1';
else
OutZero <= '0';
end if;
Reg3 <= temp;
end process;
end Behavioral;
IEEE库;
使用IEEE.STD_LOGIC_1164.ALL;
使用IEEE.NUMERIC_STD.ALL;
实体ALU_32为
港口(
InRegA,InRegB:in有符号(31到0);--输入操作数
InOp:在无符号状态下(2下降到0);--要执行的操作
OutReg:out signed(31到0);--ALU的输出
OutZero:out std_逻辑
);
结束ALU_32;
ALU_32的体系结构是
--临时信号声明。
信号Reg1、Reg2、Reg3:已签名(31向下至0):=(其他=>“0”);
开始
Reg1
温度:=Reg1和Reg2--与门
当“001”=>
温度:=Reg1或Reg2--或门
当“100”=>
温度:=Reg1或Reg2--北门
当“011”=>
温度:=Reg1或Reg2--异或门
当“101”=>
温度:=非Reg1--非门
当“111”=>
如果Reg1'1');
其他的
温度:=(其他=>“0”);
如果结束;
当其他人=>
无效的
终例;
如果温度=(31向下至0=>'0'),则
零外“0”);
--输出
信号输出寄存器:已签名(31向下至0);
信号出零:标准逻辑;
--端口列表中未检测到时钟。将下面替换为
--适当的端口名
--恒定周期:时间:=10纳秒;
开始
--实例化被测单元(UUT)
uut:ALU_32端口映射(
InRegA=>InRegA,
InRegB=>InRegB,
不工作=>不工作,
OutReg=>OutReg,
OutZero=>OutZero
);
--刺激过程
刺激程序:过程
开始
--保持复位状态100纳秒。
等待100纳秒;
--在这里插入刺激
--测试正常操作
最后我得到了这个:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;
entity ALU_32 is
port(
InRegA,InRegB : in signed(31 downto 0); --input operands
InOp : in unsigned(2 downto 0); --Operation to be performed
OutReg : out signed(31 downto 0); --output of ALU
OutZero : out std_logic
);
end ALU_32;
architecture Behavioral of ALU_32 is
--temporary signal declaration.
signal Reg1,Reg2,Reg3 : signed(31 downto 0) := (others => '0');
begin
Reg1 <= InRegA;
Reg2 <= InRegB;
OutReg <= Reg3;
process(InOp, InRegA, inRegB)
variable temp: signed(31 downto 0);
begin
case InOp is
when "010" =>
temp := Reg1 + Reg2; --addition
when "110" =>
temp := Reg1 - Reg2; --subtraction
when "000" =>
temp := Reg1 and Reg2; --AND gate
when "001" =>
temp := Reg1 or Reg2; --OR gate
when "100" =>
temp := Reg1 nor Reg2; --NOR gate
when "011" =>
temp := Reg1 xor Reg2; --XOR gate
when "101" =>
temp := not Reg1; --NOT gate
when "111" =>
if Reg1 < Reg2 then --SLT (set on less than) gate
temp := (others => '1');
else
temp := (others => '0');
end if;
when others =>
NULL;
end case;
if temp = (31 downto 0=>'0') then
OutZero <= '1';
else
OutZero <= '0';
end if;
Reg3 <= temp;
end process;
end Behavioral;
IEEE库;
使用IEEE.STD_LOGIC_1164.ALL;
使用IEEE.NUMERIC_STD.ALL;
实体ALU_32为
港口(
InRegA,InRegB:in有符号(31到0);--输入操作数
InOp:在无符号状态下(2下降到0);--要执行的操作
OutReg:out signed(31到0);--ALU的输出
OutZero:out std_逻辑
);
结束ALU_32;
ALU_32的体系结构是
--临时信号声明。
信号Reg1、Reg2、Reg3:已签名(31向下至0):=(其他=>“0”);
开始
Reg1
温度:=Reg1和Reg2--与门
当“001”=>
温度:=Reg1或Reg2--或门
当“100”=>
温度:=Reg1或Reg2--北门
当“011”=>
温度:=Reg1或Reg2--异或门
当“101”=>
温度:=非Reg1--非门
当“111”=>
如果Reg1