1、组成原理课程设计,何辉,去年课设授课前偶的人人状态:大胆预测下晚上听完我课的同学的状态: 终于下课回宿舍,路遇好友, 好友: “上课去了?” 答: “木有,听书去了” 好友: “没听说学校还有说书的呀,听得什么书呢?” 答 “天书”,目录,课程设计要求 MIPS 处理器设计 Verilog 语言简介 MIPS 处理器实例分析 实例仿真演示,1 课程设计要求,时间及安排,设计任务,兼容MIPS指令集的处理器设计 16条指令及以上 32位字长 IO与存储器统一编制 扩充简单端口及存储器的SOC设计 仿真验证及FPGA验证,基于MIPS指令集的SOC,时钟管理,tinyMIPS core,RAM,U
2、ART 接口,输入端口,Virtex 4 FPGA SX25 或者 XC6SLS16,ROM,输出端口,主要资料,ftp:/222.194.7.195 用户名stud 多周期MIPS处理器设计方法 PPT及ftp下 CPU设计参考课件 计算机组成与设计硬件/软件接口 (郑纬民译) ftp下David_Harris Mpis cpu源代码 Verilog 语言 PPT及ftp目录 verilog hdl,设计工具,Modelsim 设计及仿真工具 ISE Xilinx 公司FPGA集成开发软件 Mars MIPS汇编语言编译器,2 MIPS 处理器设计,MIPS处理器设计,设计简介 指令集举例
3、设计过程 单周期处理器设计 单周期数据通路 单周期控制单元 多周期处理器设计,MIPS指令集,R-type 算术/逻辑型指令 add, sub, and, or, slt访存指令 lw, sw分支指令 beq,指令格式,R Type : Rs funct Rt Rd I Type: lw : Rs+imme Rtsw: Rt Rs+imme J Type : Dest PC,设计过程,1 数据通路的设计 数据流向 存储器 memories 寄存器 registers, 运算器 ALUs, 多路选择器 multiplexers. 32-bit,设计过程,2 控制单元 从数据通路接收指令码,控制指
4、令的执行 产生数据通路上模块的控制信号 多路选择器的选择 寄存器写信号 存储器写信号 。,MIPS处理器的主要功能部件,Point to current instruction,Point to next instruction,From PC,current instruction,Rs,Rt,Rd(R type) or Rt(I type),Write Data,Data of Rs,Data of Rt,Memory address,Write Data,Read Data,MIPS 微架构设计,单周期架构 指令在一个时钟周期内完成 多周期架构 指令在多个时钟周期内完成 流水线架构 实现
5、指令流水,单周期MIPS处理器设计,1 单周期的数据通路图 以LW指令实现为例 指令格式指令功能 lw : Rs+imme Rt 取指令 计算操作数地址 操作数送Rt,lw instruction -1,1 取指过程,lw instruction -2,2 从Rs中读出内存基址,lw instruction -3,3 立即数进行符号扩展 指令码的立即数只有16位,运算器为32位,lw instruction -4,4 计算操作数地址,lw instruction -5,5 写回目的寄存器,lw instruction -6,6 确定下条指令地址,SW instruction,SW指令的数据通路
6、图,R型指令的数据通路图,R型指令数据通路图相同, 运算类型由指令码的function部分确定,BEQ指令的数据通路处理,根据运算结果判断是否跳转 先执行RS和RT相减 根据zero标识确定是否跳转,MIPS处理器设计,2 单周期架构的控制单元设计 控制单元的内部结构图,指令码Opcode 模块控制信号 指令码funct 运算器控制信号,完整的单周期MIPS处理器架构图,OR指令的数据流及控制信号状态,单周期架构控制信号在整个周期内保持不变,多周期MIPS处理设计,1 多周期的数据通路图 以LW指令为例 取指周期,lw instruction -2,从Rs中读取基址,lw instructio
7、n -3,立即数符号扩展 不需要锁存,仅是符号扩展,延迟时间很短,lw instruction -4,计算操作数地址 地址计算没有用专用加法器运算器单元,lw instruction -5,取出操作数,lw instruction -6,写入目的寄存器,lw instruction -7,PC+4(32位),多周期处理器的控制单元设计,完整的多周期处理器结构图,控制单元内部结构图,控制器的状态机,A. 取指周期,取指周期的数据流,B.读寄存器内容及命令译码,译码周期数据流,C.存储器地址计算,地址计算周期数据流,D. 存储器读,完整的状态转换图,3 Verilog简介,3.1Verilog H
8、DL语言的描述层次,开发流程,Verilog HDL程序结构,module module_name(port_list) /1 模块,端口列表 reg/寄存器 /2 声明各种变量、信号 wire/线网 parameter/参数 input/输入信号 output/输出信号 inout/输入输出信号 function/函数 task/任务/3 描述代码 initial assignment always assignment module assignment gate assignment UDP assignment continous assignment endmodule,3-8 译码
9、器示例,module decoder3to8(din,dout);input2:0 din;output7:0 dout;reg7:0 dout; always(din) begincase(din) 3b000: dout=8b00000001; 3b001: dout=8b00000010; 3b010: dout=8b00000100; 3b011: dout=8b00001000; 3b100: dout=8b00010000; 3b101: dout=8b00100000; 3b110: dout=8b01000000; 3b111: dout=8b10000000;endcase
10、end endmodule,3.2 层次化设计,模块化 分模块、分层次地进行设计描述 模块例化 将已存在的Verilog HDL模块作为当前设计的一个组件 位置映射法、信号名映射法以及二者的混合映射法,1.2 层次化设计,位置映射法 模块名例化名(端口1信号名,端口2信号名,端口3信号名,);,module compare_core(result,a,b);input7:0a,b;output result;assign result=(a=b)?1:0; endmodule,module compare_app0(result0,a0,b0,result1,a1,b1);input7:0a0
11、,b0,a1,b1;output result0,result1;compare_core inst_compare_core0(result0,a0,b0);compare_core inst_compare_core1(result1,a1,b1); endmodule,3.3 描述形式,1 结构描述形式,3.3 描述形式,门类型(输出,输入1,,输入N) 例如:nand na01(na_out,a,b,c);,3.3 描述形式,2 行为描述形式 1)语句块 beginend/forkjoin之间,always (a or b) begin: adder1 /adder1为语句块说明语句c
12、=a+b; end,3.3 描述形式,1)语句块 A 串行beginend 示例:,reg7:0r; begin/由一系列延迟产生的波形r=8h35;/语句1r=8hE2;/语句2r=8h00;/语句3r=8hF7;/语句4end,3.3 描述形式,1)语句块 B 并行forkjoin 示例:,reg7:0r1,r2,r3,r4; fork r1=h35;/语句1 r2=hE2;/语句2 r3=h00;/语句3 r4=hF7;/语句4 join,3.3 描述形式,2)过程结构 initial模块 always模块 任务(task)模块 函数(function)模块,3.3 描述形式,A ini
13、tial模块 面向仿真,不可综合 initial begin/fork 块内变量说明 时序控制1行为语句1; 时序控制n行为语句n; end/join,描述形式,initial begin clk=0; ar=0; ai=0; br=0; bi=0; #100; ar=20; ai=10; br=10; bi=10; end,3.3 描述形式,B always模块always(敏感事件列表)begin/fork块内变量说明时序控制1行为语句1;时序控制n行为语句n; end/join,3.3 描述形式,module and3(f,a,b,c);input a,b,c;output f;reg
14、f;always(a or b or c)beginf=aend endmodule,3.3 描述形式,C 时序控制 延迟控制 不可综合 事件控制 可综合(电平控制,边沿触发) D 流控制 assign L_s=R_s; 示例:,module mlshift2(a, b); input7:0 a; output7:0 b;assign b=a2; endmodule,3.3 描述形式,3)混合设计模式,module hunhe_demo(A,B,C);input A,B; output C; wire T;and A1(T , A, B); /结构描述 assign C= T; /行为描述en
15、dmodule,3.4 数据类型,连线 Wire:组合逻辑信号寄存器 Reg: 寄存器类型信号,常量,常量:声明数据位数及数值 For example: 4b0100 :4位2进制数据为(0100)2 4d4.,数值,Verilog Wire和Reg类型信号的取值通常有 0 or 1, 表示逻辑的真或假x, 不确定z, 高阻状态,3.5 操作类型,Verilog 提供了一元二进制运算操作符 算术运算(+, , *, /) 逻辑运算(&, |, ) 比较(=, !=, , =) 移位() 条件运算符 condition ? expr1 :expr2 条件为真返回expr1,为假返回expr2,3
16、.6 程序结构,包含一个或多个模块modules 每个模块都有自己输入和输出端口ports 每个模块可以声明自己的变量variables. 模块的主体描述包括初始化:用来初始化寄存器变量初值持续赋值:用于组合逻辑描述always :顺序逻辑或组合逻辑例化其他模块instances:模块调用,持续分配举例:半加器,module half_adder (A,B,Sum,Carry);input A,B; output Sum, Carry; assign Sum = A B; assign Carry = A endmodule,assign: 持续赋值,输入变化时输出马上变化 Wires 只能用
17、持续赋值方式赋值.,Always语句,module two_one_Selector (A,B,Sel,O);input A,B,Sel; output reg O; always (A, B, Sel)if (Sel = 0)O = A;elseO = B; endmodule,Always语句,always (A, B, Sel)敏感信号列表 不是一个功能调用 始终注意自己要描述的硬件的行为。明确Verilog需要用什么样的门电路来实现,只有寄存器变量 reg variables 可以在Always语句里面赋值 如果希望用always语句描述组合逻辑,一定小心不要把reg变量综合成一个寄存
18、器,Always 语句,reg 变量赋值的方式 = 阻塞式赋值 赋值语句按顺序执行 = 非阻塞式赋值. 所有赋值同时执行,A Sample Verilog code,module half_adder (A,B,Sum,Carry);input A,B; output Sum, Carry; assign Sum = A B; assign Carry = A endmodule,module half_adder_test_bench ();wire A,B,S,C,Sel,O;reg osc;initial beginosc = 0; End always begin#10 osc = o
19、sc; Endassign A=1;assign B=0;assign Sel=osc;half_adder A1(A, B, S, C); two_one_Selector S1(A,B,Sel,O);endmodule,1位全加器,module full_adder (A,B,Cin,Sum, Cout);input A,B,Cin; output Sum, Cout; assign Sum = (A endmodule,四位全加器,module four_bit_adder (A,B,Cin,Sum, Cout);input 3:0 A,B;input Cin; output 3:0 S
20、um;output Cout; wire C0, C1, C2;full_adder FA1(A0, B0, Cin, Sum0, C0);full_adder FA2(A1, B1, C0, Sum1, C1);full_adder FA3(A2, B2, C1, Sum2, C2);full_adder FA4(A3, B3, C2, Sum3, Cout);endmodule,3.7 寄存器,寄存器类型是通过寄存器实现,不是存储器 D寄存器 至少两个输入:D and clk 输出Q 每个clk的上升沿:Q = D 除clk上升沿的其他时刻保持数据,D 寄存器,module Dff (D,
21、 clk, Q);input D, clk;output reg Q; always (posedge clk) begin /寄存器Q = D;endendmodule,3.8 计数器,3位计数器:每个时钟上升沿加1 0,1,2,7,0, 通过D寄存器及其他组合逻辑实现输入时钟信号CLK 输入复位信号Rst_n,用于计数器清零 输出3位out 2:0,module Count_3b(Rst_n,Clk,Out); input Rst_n; input Clk; output reg 2:0 Out;always (posedge Clk or negedge Rst_n) beginif (
22、Rst_n)Out = 3d0; /异步复位elseOut = Out + 1; /end endmodulei,可预置的计数器 load,module Count_3b(Rst_n,load,Clk,Out,Din); input Rst_n; input Clk; output reg2:0 Out; input 2:0 Din;always (posedge Clk or negedge Rst_n) beginif (Rst_n)Out = 3d0; /异步复位else if (load=1) Out=Din;else Out = Out + 1; /计数end endmodule,3
23、.9 有限状态机,偶校验,设计一个偶检验电路 一个输入X 一个输出Out X可能在每个时钟下降沿发生变化一次,电路在每个时钟上升沿采样 当读到所有的位包含偶数个1输出Out = 1,否则输出Out=0,偶校验,注意:输出的值跟所有过去的输入值有关 一种方案:记录所有输入的值 显然是个非常糟糕的方案,偶校验,较好的解决方案: 总结过去的值 状态 “states” 结合当前的状态,输出的状态就可以确定 已知当前的状态,下一个状态不依赖于之前的状态 注意: 状态都是2进制数值. 状态数量远小于输入的组合更好的电路,状态,本例的state 是读取的所有位的偶检验状态. Two states: S0 a
24、nd S1. S0: 已接收到的位有奇数个1. S1: 已接收到的位有偶数个1.,状态转换图,状态转换图 每个状态上画一个圆圈 画出从一个状态到另一个状态的箭头 在箭头旁边,协商状态转换的条件.,X = 1,X = 0,状态分配,需要给这些状态分配二进制数值. 本例只有两种状态,只需要1位表示给状态赋值 S0=0 /表示奇数个1 S1=1 /表示偶数个1,下状态的真值表,最终:D = QX Verilog 描述只需描述状态转换图即可,module chk(Rst,X,Clk,Out); input X,Rst,Clk; output Out; reg State; always(posedge
25、 Clk or negedge Rst) beginif(!Rst) State=1;/初始值为1,偶数个1else beginif(State=1) endmodule,创建有限状态机的四个步骤,Step 1 状态图和状态表 没有固定的过程和图表,与应用有关。 选择刚上电开始的起始状态 状态图必须能够用表格或真值表描述。 Step 2 状态赋值 每个状态分配一个唯一的二进制数值 用分配的数值重写状态表 Step 3 下状态以及输出的逻辑描述 Step 4 实现,11/15/2007 2:38:32 PM,93,4 MIPS Processor实例分析,基于MIPS架构,基于多周期的MIPS架
26、构(Patterson and Hennessy) 8-bit 版本 8-bit 数据线和地址线 32-bit 指令格式 8 个寄存器,编号分别为$0-$7 $0 is hardwired to the value 0,指令集,Instruction Encoding,Architecture,Architecture,Another View,Control FSM,Exmem.v,module exmem #(parameter WIDTH = 8, RAM_ADDR_BITS = 8)/参数化(input clk, en, input memwrite,/时钟,读信号,存储器写input
27、 RAM_ADDR_BITS-1:0 adr,/地址线input WIDTH-1:0 writedata, /写数据线output reg WIDTH-1:0 memdata);/读数据线reg WIDTH-1:0 mips_ram (2*RAM_ADDR_BITS)-1:0; initial $readmemb(“fib.dat”, mips_ram);/存储体always (posedge clk)if (en) beginif (memwrite)mips_ramadr = writedata;/写描述memdata = mips_ramadr;/读描述end endmodule,Rec
28、all Overall System,Clock,Clk,Clk,mips.v,/ simplified MIPS processor module mips #(parameter WIDTH = 8, REGBITS = 3)(input clk, reset, /时钟,复位input WIDTH-1:0 memdata,/存储器读数据线 output memread, memwrite, /存储器读、写output WIDTH-1:0 adr, writedata);/地址,写数据wire 31:0 instr;/指令寄存器wire zero, alusrca, memtoreg, io
29、rd, pcen, regwrite, regdst;wire 1:0 aluop,pcsource,alusrcb;wire 3:0 irwrite;/指令寄存器有4个,每个8位wire 2:0 alucont;/运算器控制信号,controller cont(clk, reset, instr31:26, zero, memread, memwrite, alusrca, memtoreg, iord, pcen, regwrite, regdst,pcsource, alusrcb, aluop, irwrite);alucontrol ac(aluop, instr5:0, aluco
30、nt);datapath #(WIDTH, REGBITS) dp(clk, reset, memdata, alusrca, memtoreg, iord, pcen, regwrite, regdst, csource, alusrcb, irwrite, alucont,zero, instr, adr, writedata); endmodule,parameter FETCH1 = 4b0001;parameter FETCH2 = 4b0010;parameter FETCH3 = 4b0011;parameter FETCH4 = 4b0100;parameter DECODE
31、= 4b0101;parameter MEMADR = 4b0110;parameter LBRD = 4b0111;parameter LBWR = 4b1000;parameter SBWR = 4b1001;parameter RTYPEEX = 4b1010;parameter RTYPEWR = 4b1011;parameter BEQEX = 4b1100;parameter JEX = 4b1101;parameter LB = 6b100000;parameter SB = 6b101000;parameter RTYPE = 6b0;parameter BEQ = 6b000
32、100;parameter J = 6b000010;reg 3:0 state, nextstate;reg pcwrite, pcwritecond;,Controller,State Codes,Useful constants to compare against,State Register,CS/EE 3710,Control FSM,CS/EE 3710,Next State Logic 1,always (*) begincase(state)FETCH1: nextstate = FETCH2;/指令32位FETCH2: nextstate = FETCH3;/需要取4次FE
33、TCH3: nextstate = FETCH4;FETCH4: nextstate = DECODE;/译码周期DECODE: case(op) /根据OP,确定下状态LB: nextstate = MEMADR;SB: nextstate = MEMADR;RTYPE: nextstate = RTYPEEX;BEQ: nextstate = BEQEX;J: nextstate = JEX;default: nextstate = FETCH1; endcase,Next State Logic 2,MEMADR: case(op)LB: nextstate = LBRD;SB: nex
34、tstate = SBWR;default: nextstate = FETCH1; endcaseLBRD: nextstate = LBWR;LBWR: nextstate = FETCH1;SBWR: nextstate = FETCH1;RTYPEEX: nextstate = RTYPEWR;RTYPEWR: nextstate = FETCH1;BEQEX: nextstate = FETCH1;JEX: nextstate = FETCH1;default: nextstate = FETCH1;endcaseend,always (*)begin irwrite = 4b000
35、0;pcwrite = 0; pcwritecond = 0;regwrite = 0; regdst = 0;memread = 0; memwrite = 0;alusrca = 0; alusrcb = 2b00; aluop = 2b00;pcsource = 2b00;iord = 0; memtoreg = 0;case(state)FETCH1: beginmemread = 1; irwrite = 4b1000; alusrcb = 2b01; pcwrite = 1;end,CS/EE 3710,Output Logic,Very common way to deal wi
36、th default values in combinational Always blocks,Output Logic,RTYPEWR: beginregdst = 1;regwrite = 1;endBEQEX: beginalusrca = 1;aluop = 2b01;pcwritecond = 1;pcsource = 2b01;endJEX: beginpcwrite = 1;pcsource = 2b10;endendcaseendassign pcen = pcwrite | (pcwritecond ,Why AND these two?,CS/EE 3710,ALU Co
37、ntrol,always (*)case(aluop)2b00: alucont = 3b010; / add for lb/sb/addi2b01: alucont = 3b110; / sub (for beq)default: case(funct) / R-Type instructions6b100000: alucont = 3b010; / add (for add)6b100010: alucont = 3b110; / subtract (for sub)6b100100: alucont = 3b000; / logical and (for and)6b100101: a
38、lucont = 3b001; / logical or (for or)6b101010: alucont = 3b111; / set on less (for slt)default: alucont = 3b101; / should never happenendcaseendcase,module alu #(parameter WIDTH = 8)(input WIDTH-1:0 a, b, input 2:0 alucont, output reg WIDTH-1:0 result);wire WIDTH-1:0 b2, sum, slt;assign b2 = alucont
39、2 ? b:b; assign sum = a + b2 + alucont2;assign slt = sumWIDTH-1;always(*)case(alucont1:0)2b00: result = a endcase endmodule,CS/EE 3710,ALU,Invert b if subtract.,add is a + b sub is a + b +1,subtract on slt then check if answer is negative,CS/EE 3710,zerodetect,module zerodetect #(parameter WIDTH = 8
40、)(input WIDTH-1:0 a, output y);assign y = (a=0); endmodule,module regfile #(parameter WIDTH = 8, REGBITS = 3)(input clk, input regwrite, input REGBITS-1:0 ra1, ra2, wa, input WIDTH-1:0 wd, output WIDTH-1:0 rd1, rd2);reg WIDTH-1:0 RAM (1REGBITS)-1:0;always (posedge clk)if (regwrite) RAMwa = wd; assig
41、n rd1 = ra1 ? RAMra1 : 0;assign rd2 = ra2 ? RAMra2 : 0; endmodule,CS/EE 3710,Register File,Datapath,module datapath #(parameter WIDTH = 8, REGBITS = 3)(input clk, reset, input WIDTH-1:0 memdata, input alusrca, memtoreg, iord, pcen, regwrite, regdst,input 1:0 pcsource, alusrcb, input 3:0 irwrite, inp
42、ut 2:0 alucont, output zero, output 31:0 instr, output WIDTH-1:0 adr, writedata);/ the size of the parameters must be changed to match the WIDTH parameterparameter CONST_ZERO = 8b0;parameter CONST_ONE = 8b1;wire REGBITS-1:0 ra1, ra2, wa;wire WIDTH-1:0 pc, nextpc, md, rd1, rd2, wd, a, src1, src2, alu
43、result,aluout, constx4;,Datapath,/ shift left constant field by 2assign constx4 = instrWIDTH-3:0,2b00;/ register file address fieldsassign ra1 = instrREGBITS+20:21;assign ra2 = instrREGBITS+15:16;mux2 #(REGBITS) regmux(instrREGBITS+15:16, instrREGBITS+10:11, regdst, wa);flopen #(8) ir0(clk, irwrite0
44、, memdata7:0, instr7:0);flopen #(8) ir1(clk, irwrite1, memdata7:0, instr15:8);flopen #(8) ir2(clk, irwrite2, memdata7:0, instr23:16);flopen #(8) ir3(clk, irwrite3, memdata7:0, instr31:24);,Instruction Register,Datapath,/ datapathflopenr #(WIDTH) pcreg(clk, reset, pcen, nextpc, pc);flop #(WIDTH) mdr(
45、clk, memdata, md);flop #(WIDTH) areg(clk, rd1, a); flop #(WIDTH) wrd(clk, rd2, writedata);flop #(WIDTH) res(clk, aluresult, aluout);mux2 #(WIDTH) adrmux(pc, aluout, iord, adr);mux2 #(WIDTH) src1mux(pc, a, alusrca, src1);mux4 #(WIDTH) src2mux(writedata, CONST_ONE, instrWIDTH-1:0, constx4, alusrcb, sr
46、c2);mux4 #(WIDTH) pcmux(aluresult, aluout, constx4, CONST_ZERO, pcsource, nextpc);mux2 #(WIDTH) wdmux(aluout, md, memtoreg, wd);regfile #(WIDTH,REGBITS) rf(clk, regwrite, ra1, ra2, wa, wd, rd1, rd2);alu #(WIDTH) alunit(src1, src2, alucont, aluresult);zerodetect #(WIDTH) zd(aluresult, zero); endmodul
47、e,Datapath,CS/EE 3710,Flops and MUXes,5 实例仿真演示,课设设计步骤,基于MIPS指令集的SOC,时钟管理,tinyMIPS core,RAM,UART 接口,输入端口,Virtex 4 FPGA SX25 或者 XC6SLS16,ROM,输出端口,设计任务,兼容MIPS指令集的处理器设计 16条指令及以上 32位字长(取指一个周期) 4K存储器(指令和数据存储器可分开) IO与存储器统一编制 扩充简单端口及存储器的SOC设计 仿真验证及FPGA验证,设计要求,2人一组,协作完成 处理器架构 单周期 多周期 指令存储器与数据存储器 存储器独立 存储器分开 仿真程序具有完整功能的汇编程序,设计步骤(指导书报告顺序),1 确定处理器主要特性及基本模块 2 确定指令系统 (16条及以上) 3 数据通路图 单周期/多周期 相似指令数据通路图可能相同,注意归类 CPU执行过程相同,简化设计 所有指令的数据通路图完成后进行汇总,某个模块的输入信号来自多个模块时增加多路选择器,相应增加控制信号,4 控制器设计 由汇总的数据通路图可以确定控制的外部信号 在数据通路图上增加控制器得到最终的数据通路图 明确每个模块的控制信号及其有效电平 确定归类的数据通路图的各信号的电平状态,多周期需要确定每个周期的状态 得到多周期控制器的状态转换图,