浙江大学计算机学院实验教学中心逻辑与计算机设计基础实验2015~2016秋冬1022020/1/2寄存器及寄存器堆设计掌握寄存器、锁存器的工作原理及设计方法掌握寄存器堆的工作原理及设计方法了解计算机中寄存器及寄存器堆的概念32020/1/2寄存器及寄存器堆设计实验设备装有ISE的计算机系统1台SpartanIII实验板1套实验材料无42020/1/2寄存器及寄存器堆设计实现含由16个16位寄存器构成的寄存器堆,要求:支持寄存器地址选择支持写入任意16位值支持读取寄存器的值加入到多功能计算器中。52020/1/2寄存器及寄存器堆设计寄存器是计算机常用的基本器件1、由同一信号控制的一组相互并联的触发器构成2、包含存储、处理和传输,可构成寄存器组使用3、边沿D触发器构成的8位基本寄存器的结构如下RSDQQCpRSDQQCpRSDQQCpRSDQQCpRSDQQCpRSDQQCpRSDQQCpRSDQQCpQ0Q1Q2Q3Q4Q5Q6Q7clearclkD0D1D2D3D4D5D6D762020/1/2寄存器及寄存器堆设计moduleregister(clk,D,clear,Q);//...initialS=1'b1;assigncr=~clear;BUFGcc(clk1,clk);D_flop_posedgeR0(clk1,D[0],cr,S,Q[0],Qbar[0]),R1(clk1,D[1],cr,S,Q[1],Qbar[1]),R2(clk1,D[2],cr,S,Q[2],Qbar[2]),R3(clk1,D[3],cr,S,Q[3],Qbar[3]),R4(clk1,D[4],cr,S,Q[4],Qbar[4]),R5(clk1,D[5],cr,S,Q[5],Qbar[5]),R6(clk1,D[6],cr,S,Q[6],Qbar[6]),R7(clk1,D[7],cr,S,Q[7],Qbar[7]);endmoduleRSDQQCpRSDQQCpRSDQQCpRSDQQCpRSDQQCpRSDQQCpRSDQQCpRSDQQCpQ0Q1Q2Q3Q4Q5Q6Q7clearclkD0D1D2D3D4D5D6D772020/1/2寄存器及寄存器堆设计•锁存器由多个一位锁存器/触发器并联构成一般采用电平控制锁存:高电平时置入数据低电平时锁存数据,并指示数据稳定带使能端的RS触发器实现的锁存器置入锁存modulelock(lock,D,clear,Q);//...assigncr={8{clear}}|(~D);assignDin=D&(~{8{clear}});assignlock1=lock|clear;RS_CER0(lock1,cr[0],Din[0],Q[0],Qbar[0]),R1(lock1,cr[1],Din[1],Q[1],Qbar[1]),R2(lock1,cr[2],Din[2],Q[2],Qbar[2]),R3(lock1,cr[3],Din[3],Q[3],Qbar[3]),R4(lock1,cr[4],Din[4],Q[4],Qbar[4]),R5(lock1,cr[5],Din[5],Q[5],Qbar[5]),R6(lock1,cr[6],Din[6],Q[6],Qbar[6]),R7(lock1,cr[7],Din[7],Q[7],Qbar[7]);endmodule82020/1/2寄存器及寄存器堆设计•寄存器组是多个寄存器组成的集合寄存器写:寄存器地址→变量译码器寄存器读:寄存器地址→数据选择器数据选择器变量译码器Register0CDQRegister1CDQRegistern-2CDQRegistern-1CDQDataoutwriteclkaddressDatainlog2nmbitsbus01n-2n-192020/1/2寄存器及寄存器堆设计moduleregister_file(clk,cr,Address,Di,Do);//...initialCE=0;assignSEL=Address;assignY=~Yi;assignCLK={8{clk}}&&Y;register_32rr0(CLK[0],Di,cr,Do0);register_32rr1(CLK[1],Di,cr,Do1);register_32rr2(CLK[2],Di,cr,Do2);register_32rr3(CLK[3],Di,cr,Do3);register_32rr4(CLK[4],Di,cr,Do4);register_32rr5(CLK[5],Di,cr,Do5);register_32rr6(CLK[6],Di,cr,Do6);register_32rr7(CLK[7],Di,cr,Do7);decode_3_8d(Address[2],Address[1],Address[0],CE,Yi);MUX_8_1mux(SEL,Do0,Do1,Do2,Do3,Do4,Do5,Do6,Do7,Do);endmodulemoduleregister_32(cl,Di,cr,Dot);//...BUFGcck(cck,cl);always@(posedgecl)Dot=(!cr)?0:Di;endmodule102020/1/2寄存器及寄存器堆设计实现含由16个16位寄存器构成的寄存器堆,要求:支持寄存器地址选择支持写入任意16位值支持读取任意寄存器的值增加到多功能计算器中。112020/1/2寄存器及寄存器堆设计132010-12-12移位寄存器设计与应用类型引脚取值含义输入sw[3:0]Sw[0]=1做加法操作Sw[1]=1做减法操作Sw[2]=1做与操作Sw[3]=1做或操作sw[5:4]sw[4]=1正向计数sw[4]=0反向计数sw[5]=0/1显示操作数A和B/显示时钟。SW[7:6]SW[7:6]=00SW[7:6]=01SW[7:6]=10SW[7:6]=11显示运算结果。显示计数器结果显示并行置数/串行移位结果。显示寄存器内容。扩展板switch[7]=0控制串并switch[7]=1控制并行扩展板switch[6]=0/1作为串行输入数据0/1。扩展板switch[3:0]作为16个寄存器的地址选择。引脚分配(1)及操作说明142010-12-12移位寄存器设计与应用引脚分配(2)及操作说明类型引脚取值含义输入btn[0]btn[0]=1(主板按健)为计数分频器的脉冲的计数控制开关btn[1]CLK上升沿作为移位寄存器打入脉冲btn[2]CLK上升沿作为16个寄存器的写入脉冲btn[3]CLK上升沿作为16个寄存器的读出脉冲btn[0--3]上升沿修改操作数A(扩展板上)btn[4--7]修改操作数B(扩展板上)输出运算结果显示16位数字在Spartan-3板上的4个七段数码142020/1/2寄存器及寄存器堆设计写入过程:1、设置好写入的操作数,通过操作数B来设置。(1111—FFFF)2、switch[3:0]设置好写入的操作数的地址。3、按btn[3]产生一个CLK信号将操作数写入到指定的地址中。读出过程:1、设置好要读出的操作数地址。通过switch[3:0]来设置.2、按btn[2]产生一个CLK信号将操作数读出显示到主板上的数码管。注:switch[5]=0,显示操作数A和B通过按健修改操作数B作为寄存器输入数据switch[7:6]=11,显示寄存器读出的内容。152020/1/2寄存器及寄存器堆设计moduletop(………………………………………………..);reg[15:0]op1,op2;reg[15:0]display_num;wire[11:0]btn_out;wire[15:0]result,cnt;wire[31:0]display_num32b;wireclk_1s;wire[15:0]Q1,data_out;initialbeginop1=16'b0011_0011_0011_0011;//3333op2=16'b0010_0010_0010_0010;//2222end2020/1/216pbdebouncep0(clk,btn_in[0],btn_out[0]);pbdebouncep1(clk,btn_in[1],btn_out[1]);pbdebouncep2(clk,btn_in[2],btn_out[2]);pbdebouncep3(clk,btn_in[3],btn_out[3]);pbdebouncep4(clk,btn_in[4],btn_out[4]);pbdebouncep5(clk,btn_in[5],btn_out[5]);pbdebouncep6(clk,btn_in[6],btn_out[6]);pbdebouncep7(clk,btn_in[7],btn_out[7]);pbdebouncep8(clk,btn_in[8],btn_out[8]);pbdebouncep9(clk,btn_in[9],btn_out[9]);pbdebouncep10(clk,btn_in[10],btn_out[10]);//主扳上按健作为reg写入的CLKpbdebouncep11(clk,btn_in[11],btn_out[11]);//主扳上按健作为reg读出的CLK2020/1/217displaym0(clk,display_num,anode[3:0],segment[7:0]);//displaymoduledisplay32bitsm1(clk,display_num32b,anode[11:4],segment[15:8]);calculate_resultm2(switch,op1,op2,result);//calculateresultcounter_1sm3(clk,clk_1s);//1秒程序自己编写couter_16reversiblem4(clk_1s&btn_out[8],switch[4],cnt,Rc);regfilem7(btn_out[10],btn_out[11],switch[13:10],op2,data_out);always@(posedgebtn_out[0])op1[3:0]=op1[3:0]+4'd1;always@(posedgebtn_out[1])op1[7:4]=op1[7:4]+4'd1;always@(posedgebtn_out[2])op1[11:8]=op1[11:8]+4'd1;always@(posedgebtn_out[3])op1[15:12]=op1[15:12]+4'd1;2020/1/218always@(posedgebtn_out[4])op2[3:0]=op2[3:0]+4'd1;always@(posedgebtn_out[5])op2[7:4]=op2[7:4]+4'd1;always@(posedgebtn_out[6])op2[11:8]=op2[11:8]+4'd1;always@(posedgebtn_out[7])op2[15:12]=op2[15:12]+4'd1;assigndisplay_num32b={op2,op1};//assigndisplay_num=result;always@*begincase(switch[7:6])2'b00:display_num=result;//result2'b01:display_num=cnt;2'b10:display_num=Q1;2'b11:beginif(btn_out[10]==1)display_num=op2;elsedisplay_num=data_out;endendcaseendendmodule2020/1/219moduleregfile(wclk,rclk,address,data_in,data_out);inpu