单周期MIPS设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
本文主要是介绍单周期MIPS的源代码且进行说明与功能仿真,完成此次的MIPS 设计的程序为XILINX-ISE与MODELSIM,其中XILINX-ISE的代码编写主窗口为
其中主要包括alu,alucontrol, pc,controller, memory,ireg, regfile,signext,
integrate 9个模块:
1:alu
代码:
entity alu is
Port (
a, b : in STD_LOGIC_vector(31 downto 0);
op : in STD_LOGIC_VECTOR (3 downto 0);
result : out STD_LOGIC_VECTOR (31 downto 0);
zero : out STD_LOGIC
);
end alu;
architecture Behavioral of alu is
begin
process(a,b,op)
begin
case op is
when "0000"=>
result<= a and b; --and
when "0001"=>
result<= a or b; --or
when "0010"=>
result<= a + b; --add
when "0110"=>
result<= a - b; --sub
when "0111"=> --slt
if(a
result<=x"00000001";
else result<=x"00000000";
end if;
when "1100"=>result<= a nor b; --nor
when others=>null;
end case;
if(a=b)then --beq
zero<='1';
else
zero<='0';
end if;
end process;
end Behavioral;
代码解释:ALU是执行逻辑运算的单元,编写这个模块很简单,就是对真值表进行硬件语言描述的过程,以OP的值来控制ALU的加,减,与,或运算,ALU的零输出实现分支控制。
功能仿真:
由此仿真图可知alu工作正常,当op为0000,0001,0010,0110,0111,1100时result分别执行了与,或,加,减等运算,result与zero实际仿真值均与理论值相同。
2:alucontrol
代码:
entity alucontrol is
Port (
f : in STD_LOGIC_VECTOR (5 downto 0);
aluop : in STD_LOGIC_VECTOR (1 downto 0);
op : out STD_LOGIC_VECTOR (3 downto 0));
end alucontrol;
architecture Behavioral of alucontrol is
begin
process(aluop, f)
begin
case aluop is
when "00" => op <= "0010";
when "01" => op <= "0110";
when "10" =>
case f is
when "100000" => op <= "0010";
when "100010" => op <= "0110";
when "100100" => op <= "0000";
when "100101" => op <= "0001";
when "101010" => op <= "0111";
when "100111" => op <= "1100";
when others => op <= "----";
end case;
when others => op <= "----";
end case;
end process;
end Behavioral;
代码说明:此模块也是根据真值表进行的硬件描述,以控制单元产生ALUOP来使此模块产生需要的ALU控制输入。
功能仿真:
由此仿真图可知,alucontrol与代码相符,功能完全正常,当ALUOP为00时,op为0010,当aluop为01时op为0110,当aluop为10时,op由功能码F 控制。
3:pc
代码:
entity pc is
port (
clk: in STD_LOGIC;
reset: in STD_LOGIC;
inadds: in STD_LOGIC_vector(31 downto 0);
outadds: out STD_LOGIC_vector(31 downto 0)
);
end pc;
architecture Behavioral of pc is
begin
process(clk,reset)
begin
if(reset='1')then ----------复位信号时输出为零
outadds <=x"00000000";
elsif(clk'event and clk='1')then
outadds<=inadds;
end if;
end process;
end Behavioral;
代码说明:pc是一个32位的寄存器,它在每个时钟周期末都会被写入,不需要写控制信号,主要是用来提供下一指令的地址。
功能仿真:
功能仿真结果与代码相符,复位为1是,输出为0,复位为0且时钟上升延时,输出为输入值。
4:controller
代码:
entity controller is
Port (
op : in STD_LOGIC_VECTOR (5 downto 0);
regdst : out STD_LOGIC;
jump : out STD_LOGIC;
branch : out STD_LOGIC;
memread : out STD_LOGIC;
memtoreg : out STD_LOGIC;
aluop : out STD_LOGIC_VECTOR (1 downto 0);
memwrite : out STD_LOGIC;
alusrc : out STD_LOGIC;
regwrite : out STD_LOGIC
);
end controller;