好文档 - 专业文书写作范文服务资料分享网站

微控制器设计方案

天下 分享 时间: 加入收藏 我要投稿 点赞

微控制器设计方案

第一部分 功能描述

所有的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) 按照图1设计能够实现R型,lw/sw型和跳转型指令的mips处理器整体数据通路图

数据通路必须具备必要的存储元件,可能需要多个,同时数据通路必要的元件可能需要多个。

(2) 选择一组数据通路部件 (3) 根据需求,组装数据通路

(4) 分析每条指令的实现,以确定如何设置影响寄存器传输的控制点 (5) 装配控制逻辑 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)

3'b010: ALU_out=in1+in2; 3'b110: ALU_out=in1-in2; 3'b000: ALU_out=in1 & in2; 3'b001: ALU_out=in1 | in2; 3'b111: if (in1

ALU_out=1;

end

else

ALU_out=0; endcase

default: ALU_out=0;

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)

2'b00: ALU_ctrl=3'b010; 2'b01: ALU_ctrl=3'b110; 2'b10: begin

case (funct)

6'b100000: ALU_ctrl=3'b010; 6'b100010: ALU_ctrl=3'b110;

6'b100100: ALU_ctrl=3'b000; 6'b100101: ALU_ctrl=3'b001; 6'b101010: ALU_ctrl=3'b111; default: ALU_ctrl=0; endcase end endcase end endmodule

数据存储单元:是一个状态单元,有读写控制信号、地址和数据端口。两个输入是地址和所写数据,一个输出位为出容,读写控制信号是独立的,任意始终只能激活一个。存数指令,要从寄存器堆中读出要存的数据;取数指令,则要将刚从存储器中取出的数放入寄存器堆中指定寄存器中。 实现代码:

begin

case ({ctrl_write,ctrl_read})

2'b01: out=mem[addr]; 2'b10: mem[addr]=data; default: $display(\endcase

end

MUX:二选一数据选择器,通过控制信号的值来选择输出。

实现代码:

always (*)

if(ctrl==0) out=in0; else out=in1;

寄存器堆:

实现代码:

always (in1 or in2) begin

case (in1) end

always (RegWrite or writeaddr or writedata) begin

mem[writeaddr] <= writedata;

case (in2)

5'b00101: data2 <= 32'h001c; 5'b01111: data2 <= 32'h0004; 5'b00000: data2 <= 32'h0008; 5'b10000: data2 <= 32'h000c; 5'b10001: data2 <= 32'h000c; default: data2 <= mem[writeaddr]; 5'b00101: data1 <= 32'h001c; 5'b01111: data1 <= 32'h0004; 5'b00000: data1 <= 32'h0008; 5'b10000: data1 <= 32'h000c; 5'b10001: data1 <= 32'h000c; default: data1 <= mem[writeaddr];

endcase

endcase

end

endmodule

符号扩展器:将指令中16位有符号数扩展成32位有符号数

符号代码:

module signal_extend(

input [15:0] in, output [31:0] out );

assign out={16'b0,in}; endmodule

取指部件:首先要从存储器中将指令取出。为准备执行。下

一条指令,也必须把程序计数器加到指向下一条指令,即向后移动四字节。此时所需的取指令以及增加PC以获得下一时序指令的地址相对应的数据通路,图如右:

代码:

always (posedge clk or posedge reset)

begin

if(reset) PC<=0;

else PC<=PCnext; end

根据分治设计策略,确定模块间的连接关系,端口方向及宽度,将每一模块通过控制信号联系起来,最终形成完整的数据通路。

综合: module top(

);

input clk, input reset,

output [31:0] PCnext, output [4:0] addr_regwrite, output [31:0] data_regwrite, output [31:0] signal_extend

wire [31:0] PC;

wire [31:0] instruction;

wire RegDst, Jump, Branch, MemRead, MemtoReg, MemWrite,ALUSrc, RegWrite,zero; wire [1:0] ALUOp;

//wire [4:0] addr_regwrite; wire [31:0] data1,data2, ALU2,ALUout,memdata,

signal_extend_l,PCnew,add2out,mux4out, jumpaddr_l;

wire [2:0] ALUctrl; wire [31:0] jumpaddr;

instruction_reg ins_reg(.pc(PC),.ins(instruction));

control con(.in(instruction[31:26]), .RegDst(RegDst), .Jump(Jump), .Branch(Branch),

.MemRead(MemRead), .MemtoReg(MemtoReg),

.ALUOp(ALUOp),

.MemWrite(MemWrite), .ALUSrc(ALUSrc), .RegWrite(RegWrite));

mux #(5) mux1_datareg(.in0(instruction[20:16]), .in1(instruction[15:11]),

data_reg data_reg(.in1(instruction[25:21]), .in2(instruction[20:16]), .writeaddr(addr_regwrite),

.out(addr_regwrite), .ctrl(RegDst));

微控制器设计方案

微控制器设计方案第一部分功能描述所有的MIPS指令都是32位,支持多种指令,主要有以下几种:·数据加载和存储指令:lw、sw指令·跳转指令:beq条件跳转和j、jr、jl跳转·算数逻辑运算:add、sub、and、or、slt具体有三种格式:处理器有32
推荐度:
点击下载文档文档为doc格式
1fg6324rh358u602x74s2b61z97l7x017k0
领取福利

微信扫码领取福利

微信扫码分享