单周期MIPS设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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;

相关文档
最新文档