微控制器设计方案.docx
- 文档编号:15543364
- 上传时间:2023-07-05
- 格式:DOCX
- 页数:33
- 大小:446.10KB
微控制器设计方案.docx
《微控制器设计方案.docx》由会员分享,可在线阅读,更多相关《微控制器设计方案.docx(33页珍藏版)》请在冰点文库上搜索。
微控制器设计方案
微控制器设计方案
第一部分功能描述
所有的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(ctrlorin1orin2)
begin
if(in1==in2)zero<=1;
elsezero<=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; else ALU_out=0; default: ALU_out=0; endcase end ALU控制的代码实现: moduleALU_ctrl( input[1: 0]ALUOp, input[5: 0]funct, outputreg[2: 0]ALU_ctrl ); always(ALUOporfunct) 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("error"); endcase end MUX: 二选一数据选择器,通过控制信号的值来选择输出。 实现代码: always(*) if(ctrl==0)out=in0; elseout=in1; 寄存器堆: 实现代码: always(in1orin2) begin case(in1) 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 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]; endcase end always(RegWriteorwriteaddrorwritedata)begin mem[writeaddr]<=writedata; end endmodule 符号扩展器: 将指令中16位有符号数扩展成32位有符号数 符号代码: modulesignal_extend( input[15: 0]in, output[31: 0]out ); assignout={16'b0,in}; endmodule 取指部件: 首先要从存储器中将指令取出。 为准备执行。 下一条指令,也必须把程序计数器加到指向下一条指令,即向后移动四字节。 此时所需的取指令以及增加PC以获得下一时序指令的地址相对应的数据通路,图如右: 代码: always(posedgeclkorposedgereset) begin if(reset)PC<=0; elsePC<=PCnext; end 根据分治设计策略,确定模块间的连接关系,端口方向及宽度,将每一模块通过控制信号联系起来,最终形成完整的数据通路。 综合: moduletop( inputclk, inputreset, 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; wireRegDst,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_regins_reg(.pc(PC),.ins(instruction)); controlcon(.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]), .out(addr_regwrite), .ctrl(RegDst)); data_regdata_reg(.in1(instruction[25: 21]), .in2(instruction[20: 16]), .writeaddr(addr_regwrite), .writedata(data_regwrite), .data1(data1),.data2(data2), .RegWrite(RegWrite)); signal_extends_extend(.in(instruction[15: 0]), .out(signal_extend)); mux#(32)mux2_ALU(.in1(signal_extend),.in0(data2),.out(ALU2),.ctrl(ALUSrc)); ALUALU(.in1(data1),.in2(ALU2),.ALU_out(ALUout),.ctrl(ALUctrl),.zero(zero)); data_memdata_mem(.addr(ALUout),.data(data2),.ctrl_read(MemRead), .out(memdata),.ctrl_write(MemWrite)); mux#(32)mux3_datareg(.in1(memdata),.in0(ALUout),.out(data_regwrite),.ctrl(MemtoReg)); left_shiftlshift1(.in(signal_extend),.out(signal_extend_l)); left_shiftlshift2(.in(instruction),.out(jumpaddr_l)); addadd1(.in1(PC),.in2(32'b100),.out(PCnew)); addadd2(.in1(signal_extend_l),.in2(PCnew),.out(add2out)); mux#(32)mux4_PCnew(.in0(PCnew),.in1(add2out),.out(mux4out),.ctrl(zero&Branch)); /**/mux#(32)mux5_PCnext(.in0(mux4out),.in1(jumpaddr),.out(PCnext),.ctrl(Jump)); ALU_ctrlALU_ctrl(.ALUOp(ALUOp),.funct(instruction[5: 0]),.ALU_ctrl(ALUctrl)); PCPC0(.clk(clk),.reset(reset),.PCnext(PCnext),.PC(PC)); assignjumpaddr={PCnew[31: 28],jumpaddr_l[27: 0]}; endmodule 第四部分验证方案及结果分析 1、加载存储指令: lw$s1,immt($t7) 32'h08: ins={6'b100011,5'b00101,5'b10001,16'h0001}; 其中immt($t7)指向的存地址中存的数为32’b0101 //sw$s0,immt($t7) 32'h04: ins={6'b101011,5'b00101,5'b00101,16'h0001}; 其中$s0寄存器中存的值为32’b1000,$t7存的数据32’h001c 2、算术逻辑运算: 加法指令: add$s0,$a1,$t7 32'h00: ins={6'b000000,5'b00101,5'b01111,5'b10000,5'b00000,6'b100000}; 其中$a1存的数据是32’h001c,$t7存的数据是32’h0001 减法指令: sub$s0,$a1,$t7 32'h00: ins={6'b000000,5'b00101,5'b01111,5'b10000,5'b00000,6'b100010}; 其中$a1存的数据是32’h001c,$t7存的数据是32’h0004 与运算: and$s0,$a1,$t7 32'h00: ins={6'b000000,5'b00101,5'b01111,5'b10000,5'b00000,6'b100100}; 其中$a1存的数据是32’h001c,$t7存的数据是32’h0004 或运算 or$s0,$a1,$t7 32'h00: ins={6'b000000,5'b00101,5'b01111,5'b10000,5'b00000,6'b100101}; 其中$a1存的数据是32’h001c,$t7存的数据是32’h0004 Slt运算: slt$s0,$a1,$t7 32'h00: ins={6'b000000,5'b00101,5'b01111,5'b10000,5'b00000,6'b101010}; 其中$a1存的数据是32’h001c,$t7存的数据是32’h0004 3、分支指令: bne$s0,$s1,start 32'h04: ins={6'b000100,5'b10000,5'b10001,16'b0100}; 其中$s0=$s2=32’h000c 4、跳转: J1000 32'h04: ins={6'b000010,26'h08}; 第五部分性能评估: 综合结果: 面积报告: **************************************** Report: area Design: top Version: C-2009.06 Date: TueSep415: 27: 352012 **************************************** Library(s)Used: typical(File: /export/homeO1/smic018/typical.db) Numberofports: 103 Numberofnets: 634 Numberofcells: 156 Numberofreferences: 30 Combinationalarea: 73589.947530 Noncombinationalarea: 48009.932091 NetInterconnectarea: 518795.906769 Totalcellarea: 121599.879621 Totalarea: 640395.786390 时序报告: **************************************** Report: timing -pathfull -delaymax -max_paths1 Design: top Version: C-2009.06 Date: TueSep415: 27: 462012 **************************************** OperatingConditions: typicalLibrary: typical WireLoadModelMode: top Startpoint: PC0/PC_reg[21] (risingedge-triggeredflip-flopclockedbyclk) Endpoint: data_regwrite[25] (outputportclockedbyclk) PathGroup: clk PathType: max Des/Clust/PortWireLoadModelLibrary ------------------------------------------------ topsmic18_wl10typical PointIncrPath ----------------------------------------------------------- clockclk(riseedge)0.000.00 clocknetworkdelay(ideal)0.000.00 PC0/PC_reg[21]/CK(DFFRHQX4)0.000.00r PC0/PC_reg[21]/Q(DFFRHQX4)0.220.22r PC0/PC[21](PC)0.000.22r ins_reg/pc[21](instruction_reg)0.000.22r ins_reg/U53/Y(NOR2X4)0.060.28f ins_reg/U37/Y(NAND4X4)0.110.39r ins_reg/U55/Y(NOR2X4)0.050.44f ins_reg/U56/Y(NAND2X4)0.080.52r ins_reg/U38/Y(BUFX20)0.100.63r ins_reg/U31/Y(NOR2X4)0.060.69f ins_reg/ins[28](instruction_reg)0.000.69f con/in[2](control)0.000.69f con/U29/Y(NOR2X4)0.090.78r con/U33/Y(NAND3X4)0.060.84f con/U34/Y(NOR2X4)0.100.94r con/RegDst(control)0.000.94r mux1_datareg/ctrl(mux_N5)0.000.94r mux1_datareg/U1/Y(BUFX20)0.101.05r mux1_datareg/U10/Y(OAI2BB2X4)0.131.17r mux1_datareg/out[1](mux_N5)0.001.17r U25/Y(BUFX16)0.101.28r data_reg/writeaddr[1](data_reg)0.001.28r data_reg/U368/Y(NAND2BX4)0.121.39r data_reg/U365/Y(INVX8)0.051.44f data_reg/U362/Y(INVX8)0.061.50r data_reg/U265/Y(OR2X4)0.091.59r data_reg/U101/Y(AND2X4)0.101.69r data_reg/U306/Y(NAND2X4)0.061.74f data_reg/U377/Y(NOR2X4)0.091.83r data_reg/U295/Y(NOR2X4)0.051.88f data_reg/data2[1](data_reg)0.001.88f mux2_ALU/in0[1](mux_N32_0)0.001.88f mux2_ALU/U68/Y(OAI2BB1X4)0.182.06f mux2_ALU/out[1](mux_N32_0)0.002.06f ALU/in2[1](ALU)0.002.06f ALU/add_35/B[1](ALU_DW01_add_1)0.002.06f ALU/add_35/U472/Y(OR2X4)0.172.23f ALU/add_35/U582/Y(NAND2X4)0.082.30r ALU/add_35/U385/Y(NAND2X4)0.052.35f ALU/add_35/U329/Y(AOI21X4)0.122.48r ALU/add_35/U288/Y(OAI21X4)0.072.55f ALU/add_35/U571/Y(AOI21X4)0.142.69r ALU/add_35/U632/Y(BUFX20)0.142.83r ALU/add_35/U486/Y(INVX8)0.052.87f ALU/add_35/U481/Y(NAND2BX4)0.072.94r ALU/add_35/U604/Y(NAND2X4)0.052.99f ALU/add_35/U605/Y(XOR2X4)0.153.14r ALU/add_35/SUM[25](ALU_DW01_add_1)0.003.14r ALU/U49/Y(AOI21X4)0.053.19f ALU/U147/Y(OAI2BB1X4)0.123.31r ALU/ALU_out[25](ALU)0.003.31r mux3_datareg/in0[25](mux_N32_3)0.003.31r mux3_datareg/U33/Y(OAI2BB1X4)0.123.44r mux3_datareg/out[25](mux_N32_3)0.003.44r data_regwrite[25](out)0.003.44r dataarrivaltime3.44 clockclk(riseedge)3.003.00 clocknetworkdelay(ideal)0.003.00 outputexternaldelay-0.202.80 datarequiredtime2.80 ----------------------------------------------------------- datarequiredtime2.80 dataarrivaltime-3.44 -----------
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 控制器 设计方案