文档详情

微控制器设计方案.doc

发布:2017-10-15约1.76万字共21页下载文档
文本预览下载声明
微控制器设计方案 第一部分 功能描述 所有的MIPS指令都是32位,支持多种指令,主要有以下几种: ·数据加载和存储指令:lw、sw指令 ·跳转指令:beq条件跳转和j、jr、jl跳转 ·算数逻辑运算:add、sub、and、or、slt 具体有三种格式: 处理器有32个32位寄存器,并且为了测试和运行方便,配备了一个32字的指令存储器,和一个32字的数据存储器(地址0x0000_0000~0x0000_001f)。还备有UART串口,并且与数据存储器共同编址(0x8000_0000~0x8000_0008)。 第二部分 设计方案 1、设计策略 采用分治:将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各 个击破,分而治之。 本实验中,我们将整个数据通路化分成多个模块:寄存器堆、取指部件、扩展器、二选一数据选择器、算术逻辑单元、数据存储器等,分别设计及实现,然后再整体进行逻辑控制,最终实现单周期数据通路。 2、设计思路 建立数据通路: 按照图1设计能够实现R型,lw/sw型和跳转型指令的mips处理器整体数据通路图 数据通路必须具备必要的存储元件,可能需要多个,同时数据通路必要的元件可能需要多个。 选择一组数据通路部件 根据需求,组装数据通路 分析每条指令的实现,以确定如何设置影响寄存器传输的控制点 装配控制逻辑 3.数据通路图 图1 数据通路图 第三部分 单周期MIPS分析与设计 ALU:算术逻辑运算单元,有2个32位输入和1个32位输出,还有一个零标志位。有3个控制输入,而八种可能的输入组合中只有5种可能出现。 对于取字和存储指令,ALU用于计算存储地址; 对于R型指令, 根据指令的低6位功能字段的内容, ALU执行5中操作中的一种。 对于相等分支指令,ALU执行剑法操作。 实现代码: always @ (ctrl or in1 or in2) begin if(in1==in2) zero=1; else zero=0; case (ctrl) 3b010: ALU_out=in1+in2; 3b110: ALU_out=in1-in2; 3b000: ALU_out=in1 in2; 3b001: ALU_out=in1 | in2; 3b111: if (in1in2) ALU_out=1; else ALU_out=0; default: ALU_out=0; endcase end ALU控制的代码实现: module ALU_ctrl( input [1:0] ALUOp, input [5:0] funct, output reg [2:0] ALU_ctrl ); always @ (ALUOp or funct) begin case (ALUOp) 2b00: ALU_ctrl=3b010; 2b01: ALU_ctrl=3b110; 2b10: begin case (funct) 6b100000: ALU_ctrl=3b010; 6b100010: ALU_ctrl=3b110; 6b100100: ALU_ctrl=3b000; 6b100101: ALU_ctrl=3b001; 6b101010: ALU_ctrl=3b111; default: ALU_ctrl=0; endcase end endcase end endmodule 数据存储单元:是一个状态单元,有读写控制信号、地址和数据端口。两个输入是地址和所写数据,一个输出位为出内容,读写控制信号是独立的,任意始终只能激活一个。存数指令,要从寄存器堆中读出要存的数据;取数指令,则要将刚从存储器中取出的数放入寄存器堆中指定寄存器中。 实现代码: begin case ({ctrl_write,ctrl_read}) 2b01: out=mem[addr]; 2b10: mem[addr]=data; default: $display(error); endcase end MUX:二选一数据选择器,通过控制信号的值来选择输出。 实现代码: always @ (*) if(ctrl==0) out=in0; else out=in1; 寄存器堆: 实现代码: always @ (in1 or in2
显示全部
相似文档