基于vhdl语言的8位risc-cpu的设计答辩内容摘要:
1100图 34 指令寄存器仿真波形 第三章 八位 RISCCPU各模块设计与仿真 10 011001 11001100、 00110011 四个数据, 则当 state 为 0 时,传输高八位,当state 为 1 时,传输低八位。 其中 第 15 至 第 13 位存入 opcode 中 并替换旧数据 ,第 12 至 第 0 位存入 str_addr 中 并替换旧数据。 累加器 累加器 Accumulator 用于存放当前的结果,它也是双目运算其中的一个数据来源,同时累加器还用来存放 算术运算指令的结果,如图 35 所示。 累加器采用同步复位方式,即当 RST 信号为高电平时,累加器的值为零。 当累加器通过 ENA口收到来自 CPU 状态控制器 ACC_ENA 信号时,即 ENA=1 时,在 CLK1 时钟正跳沿时就收到来自于数据总线的数据,由 DATA[7..0]输入;而当 ENA=0 时,累加器保持不变。 累加器源程序如下: library ieee。 use。 entity acc is port(clk1,rst,ena:in std_logic。 data:in std_logic_vector(7 downto 0)。 accum:out std_logic_vector(7 downto 0))。 end acc。 architecture art of acc is begin process(clk1, ena) begin if clk139。 event and clk1=39。 139。 then if rst=39。 139。 then accum=00000000。 elsif ena=39。 139。 then accum=data。 图 35 累加器 第三章 八位 RISCCPU各模块设计与仿真 11 end if。 end if。 end process。 end art。 在仿真时,设定 6 个周期假设中, data 端每周期输入不同的 8 位二进制数,观察 accum 端输出数据与 rst 和 ena 值的对应关系,仿真波形如下: 如图所示,当复位信号 rst=’0’、使能信号 ena=’1’时,在每个 clk1 上升沿到来后, accum 接收来自于数据总线的数据;当 第 4 周期 ena=’0’时 , accum 保持01010101 不变 ,故该数据占两个周期 ;当 ena 又变为有效信号, 因同时 rst 由 0变为 1,累加器 复位, accum 输出 清零。 算术 逻辑单 元 算术 逻辑单元 ALU 的全称是 Arithmetic Logic Unit, 该模块 用来执行诸如加减乘除以及寄存器中的值之间的逻辑运算,通常在一般的处理器上被设成一个周期 上升沿 运行一次,这主要是由附属于 ALU 的输入输出寄存器以及在 ALU 输入处插入旁路乘法器来决定的。 算术逻辑单元 根据输入的 8 种不同操作码分别实现相应的加、与、异或、跳转等 8 种基本操作运算 , 利用这几种基本运算可以实现很多种其它运算以及逻辑判断等操作。 算术 逻辑单元如上图所示,其各端口功能如 下: ALU_CLOCK 为 ALU 的时钟信号,由时钟发生器输出; OPCODE 取自指令寄存器的高 3 位, ALU 根据输入 OPCODE 的 8 种不同操图 36 累加器仿真波形 图 37 算术 逻辑单元 第三章 八位 RISCCPU各模块设计与仿真 12 作码分别实现相应的加、与、异或、跳转等基本操作运算; DATA 输入来自数据总线上的数据; ACCUM 输入来自累加器的一个操作数; ALU_OUT 用来保存或输出操作后的值; ZERO 用于标志 ACCUM 是否为 0,其值为 0 时标 ZERO=1,否则 ZERO=0。 算术逻辑单元 源程序如下: library ieee。 use。 use。 entity alu is port(alu_clk: in std_logic。 opcode: in std_logic_vector(2 downto 0)。 data,accum: in std_logic_vector(7 downto 0)。 zero: out std_logic。 alu_out: out std_logic_vector(7 downto 0))。 end alu。 architecture behave of alu is signal alu_out_latch: std_logic_vector(7 downto 0)。 constant HLT: std_logic_vector(2 downto 0):=000。 constant SKZ: std_logic_vector(2 downto 0):=001。 constant ADD: std_logic_vector(2 downto 0):=010。 constant AN_D: std_logic_vector(2 downto 0):=011。 constant XO_R: std_logic_vector(2 downto 0):=100。 constant LDA: std_logic_vector(2 downto 0):=101。 constant STO: std_logic_vector(2 downto 0):=110。 constant JMP: std_logic_vector(2 downto 0):=111。 begin zero=39。 139。 when accum=00000000 else 39。 039。 process(alu_clk) variable temp:std_logic_vector(2 downto 0)。 begin temp:=opcode。 if alu_clk39。 event and alu_clk=39。 139。 then 第三章 八位 RISCCPU各模块设计与仿真 13 case temp is when HLT=alu_out_latch=accum。 when SKZ=alu_out_latch=accum。 when ADD=alu_out_latch=data+accum。 when AN_D=alu_out_latch=data and accum。 when XO_R=alu_out_latch=data xor accum。 when LDA=alu_out_latch=data。 when STO=alu_out_latch=accum。 when JMP=alu_out_latch=accum。 when others=alu_out_latch=XXXXXXXX。 end case。 end if。 end process。 alu_out=alu_out_latch。 end behave。 在仿真过程中,假设操作码依次为上述 8 种操作码。 数据值为 5, 累加器值为 由 3 变 0,以此来验证 zero 作用。 仿真波形下图所示: alu_clk 为时钟信号输入端口, zero 为判 accum 是否为零的输出端口。 opcode为操作码输入端, data 为数据输入端, accum 为 累加器 输入端口。 opcode 不同的值代表不同的操作。 alu_out 中的 06 代表 5(转化为二进制 =101)异或 3(转化为二进制 =011)得 6(二进制 =110),而其他数值均正确反映不同操作码下 的运算结果。 数据输出控制器 数据输出控制器 Data Control 的作用是控制累加器数据输出,如图 39 由于数据总线是各种操作时传送数据的公共通道,不同的情况下传送不同的内容。 有图 38 算术逻辑运算单元仿真波形 第三章 八位 RISCCPU各模块设计与仿真 14 时要传输指令,有时要传送 RAM 区或接口的数据。 累加器的数据只有在需要往RAM 区或端口写时才允许输出,否则应呈现高阻态,以允许其它部件使用数据总线。 所以任何部件往总线上输出数据时,都需要控制信号。 而此控制信号的启、停,则由 CPU 状态控制器输出的各信号控制决定。 数据控制器何时输出累加器的数据则由状态控制器输出的控制信号 DATACTL_ENA 决定。 数据控制电路源程序如下: library ieee。 use。 entity datactrl is port(data_ena: in std_logic。 alu_out: in std_logic_vector(7 downto 0)。 data: out std_logic_vector(7 downto 0))。 end datactrl。 architecture behave of datactrl is begin data=alu_out when data_ena=39。 139。 else ZZZZZZZZ。 end behave。 在此波形图 310 中,假设累加器输出值由 00000000 递增,验证当 data_ena为 0 时, data 输出 alu_out 的值,当 data_ena 为 1 时, data 输出 ZZZZZZZZ。 地址多路器 地址多路器 ADDR 用于选择输出的地址是 PC(程序计数)地址还是数据 /端口地址,如图 311 所示。 每个指令周期的前 4 个时钟周期用于从 ROM 中读取指令,输出 PC 地址。 后 4 个时钟周期用于对 RAM 或端口的读写,输出数据图 39 数据输出控制器 图 310 数据 输出 控制 器 仿真波形 第三章 八位 RISCCPU各模块设计与仿真 15 或端口地址。 地址的选择输出信号由时钟信号的 8 分频信号 FETCH 提供,其上升沿到来时输出 PC 地址,其他时候输出数据或端口地址。 地址多路器源程序如下: library ieee。 use。 entity addr_mux is port(fetch:in std_logic。 pc_addr, ir_addr: in std_logic_vector(12 downto 0)。 addr: out std_logic_vector(12 downto 0))。 end addr_mux。 architecture behave of addr_mux is begin addr=pc_addr when fetch=39。 139。 else ir_addr。 end behave。 当 fetch=0 时 addr 输出 ir_addr 的值 ,当 fetch=1 时 addr 输出 pc_addr 的值。 程序计数器 程序计数器 Program Counter 用于提供指令地址,如图 313,以便读取指令,指令按地址顺序存放在存储器中。 有两种途径可形成指令地址:其一是顺序执行的情况,其二是遇到要改变顺序执行程序的情况,例如执行 JMP 指令后,需要形成新的指令地址。 图 311 地址多路器 图 312 地址多路 器 仿真波形 第三章 八位 RISCCPU各模块设计与仿真 16 复位后,指令指针为零,即每次 CPU 重新启动将从 ROM 的零地址开始读取指令并执行。 指令为双字节,每条指令执行完需 2 个时钟,这时 PC_ADDR 已被增 2,指向下一条指令。 如果正执行的指令是跳转语句,这时 CPU 状态控制器将会输出 PC_ENA 信号,通过 LOAD 口进入程序计数器。 程序计数器PC_ADDR 将装入目标地址 IR_ADDR,而不是增 2。 程序计数器源程序如下: library ieee。 use。 use。 entity pc is port(clk, rst, ena: in std_logic。 ir_addr: in std_logic_vector(12 downto 0)。 pc_addr: out std_logic_vector(12 downto 0))。 end pc。 architecture behave of pc is signal pc_addr_latch: std_logic_vector(12 downto 0)。 begin process(clk) begin if clk39。 event and clk=39。 139。 then if rst=39。 139。 then pc_addr_latch=(others=39。 039。 )。 elsif ena=39。 139。 then pc_addr_latch=ir_addr。 elsif ena=39。 039。 then pc_addr_latch=pc_addr_latch+1。 end if。 end if。基于vhdl语言的8位risc-cpu的设计答辩
相关推荐
”中,如“二次铣削 [1]”。 当提及的参考文献为文中直接说明时,其序号应该与正文排齐,如“由文献 [8, 10~ 14]可知”。 经济、管理类论文引用文献,若引用的是原话,要加引号,一般写在段中; 若引的不是原文只是原意,文前只需用冒号或逗号,而不用引号。 在参考文献之外,若有注释的话,建议采用夹注,即紧接文句,用圆括号标明。 不得将引用文献标示置于各级标题处。 参考文献书写格式应符合
001) and (count1631 )then count=count+7。 elsif (count1631) then count=count+1。 else count=000001。 dount=dount+1。 end if。 end if。 end process。 monthout=dount。 dateout=count。 end fun。 11 扫描显示模块设计
( 3)数据锁存器: library IEEE。 use。 18 Unment the following library declaration if using arithmetic functions with Signed or Unsigned values use。 Unment the following library declaration if instantiating
d_data_1 = read_data_1, Read_data_2 = read_data_2, Sign_extend = Sign_extend, Function_opcode = Instruction( 5 DOWNTO 0 ), ALUOp = ALUop, ALUSrc = ALUSrc, Zero = Zero, ALU_Result = ALU_Result,
文)绪论部分字数不多于全部论文字数的 1/4。 论文主体 论文主体是论文的主要部分,要求结构合理,层次清楚,重点突出,文字简练、通顺。 论文主体的内容要求参照《大学本科生毕业设计(论文)的规定》第五章。 论文主体各章后应有一节“本章小结”。 结论 结论作为单独一章排列,但不加章号。 结论是对整个论文主要成果的归纳,要突出设计(论文)的创新点,以简练的文字对论文的主要工作进行评价,一般为 400~
高速集成电路硬件描述语言。 覆盖面广,描述能力强,是一个多层次的硬件描述语言。 在 VHDL 语言中,设计的原始描述可以非常简练,经过层层加强后,最终可成为直接付诸生产的电路或版图参数描述。 具有良好的可读性,即容易被计算机接受,也容易被读者理解。 使用期长,不会因工艺变化而使描述过时。 因为 VHDL 的硬件描述与工艺无关,当工艺改变时,只需修改相应程序中的属性参数即可。