课题:控制器设计与验证
一、实验目的
1.理解微程序控制器的设计过程,掌握其设计方法;
2.了解运算部件的基本结构和数据传输过程,并掌握其设计和调试方法。
二、实验设备
1.装有ISE Design Suite 14.7的计算机一台
2.EDK-3 SA ISE实验平台
三、实验任务
1.实现微程序控制器
2.编写测试代码
3.通过实验板操作验证控制器设计的正确性
四、实验原理
实验原理
微程序控制方式的计算机控制器具有规整性、灵活性、功能的可扩充性、易
改性等优点。因此愈来愈广泛地被用于计算机及其它数字设备的控制系统。我们
知道,计算机执行一条指令的过程实际上是执行一段微程序的过程,也就是说采
用微程序方式的计算机,是用各段微程序去对应各条机器指令,微程序存贮在控
存CM 里,当调用某指令时,就由相应的微程序进行控制,以此来执行该指令。
本实验要求根据微程序设计的基本原理,采用微程序设计方法,设计一个简
单的运算器数据通路的控制器,下面就有关设计和调试步骤作一些说明:
(1) 确定数据通路的结构和操作功能。数据通路采用单总线结构;数据长度为4 位;操作数A由AC提供;操作数B由数据开关D3~D0 设置,经驱动门B 和BUS到达ALU的B输入端;暂存器TEM为ALU的结果寄存器,其内容经BUS回送AC。数据通路结构图如下图所示:
要求完成下列六种操作功能(可由实验箱上的开关控制)
MOV B ,A ; B→A
OR B ,A ; A+B→A
AND B ,A ; A∙B→A
ADD B ,A ; A 加B→A
SUB B ,A ; A-B→A
RCC A ; A 加A 加C→A (带进位的左环移)
(2) 列出各指令的微操作流程。
①
MOV AC ,B ; B→AC
T1: B→IB ,ACin ;
②
OR AC,B ; AC+B→AC
T1: D→IB ,ACin;
T2: B→IB ,OR(S3、S2、S1、S0、M、Cn(‐)=1、1、1、0、1、X) ,TEMin;
T3: TEM→IB ,ACin;
③
AND AC ,B ; AC∙B→AC
T1: D→IB ,ACin;
T2: B→IB ,AND(S3、S2、S1、S0、M、Cn(‐)=1、0、1、1、1、X),TEMin;
T3: TEM→IB ,ACin;
④
ADD AC ,B; AC加B→AC
T1: D→IB ,ACin ;
T2: B→IB ,ADD(S3、S2、S1、S0 、M、Cn(‐)=1、0、0、1 、0、1),TEMin ;
T3: TEM→IB ,ACin ;
⑤
SUB AC,B ; AC减B→AC
T1: D→IB ,ACin ;
T2: B→IB ,SUB(S3 、S2、S1、S0 、M、Cn(‐)=0、1、1、0、0、0),TEMin ;
T3: TEM→IB ,ACin ;
(3) 各控制信号的逻辑条件和时间条件及操作码的编码。各控制信号的逻辑条件和时间条件:
B→IB=(MOV∙T1)+(OR∙T2)+(AND∙T2)+(ADD∙T2)+(SUB∙T2) =(MOV∙T1)+(非MOV∙T2)
ACin=(T1∙M)+(OR∙T3∙M)+(AND∙T3∙M)+(ADD∙T3∙M)+(SUB∙T3∙M) =(T1∙M)+(非MOV∙T3∙M)
D→IB=(OR∙T1)+(AND∙T1)+(ADD ∙T1)+(SUB∙T1)=(非MOV∙T1)
TEMin=(OR∙T2∙M)+(AND∙T2∙M)+(ADD∙T2∙M)+(SUB∙T2∙M)=(非MOV∙T2∙M)
TEM→IB=(OR∙T3)+(AND∙T3)+(ADD∙T3)+(SUB∙T3)=(非MOV∙T3)
(4) 操作码的编码:
MOV的操作码:
K13、K12、K11、K10、K9、K8=0、0、0、0 、0 、0,分别接 S3、S2、S1、S0、M、Cn(‐) ;
OR的操作码:
K13、K12、K11、K10、K9、K8=1、1、1、0、1、X,分别接 S3、S2、S1、S0、M、Cn(‐) ;
AND 的操作码:
K13、K12、K11、K10、K9、K8=1、0、1、1、1、X ,分别接 S3、S2、S1、S0、M、Cn(‐) ;
ADD 的操作码:
K13、K12、K11、K10、K9、K8=1、0、0、1、0、1,分别接 S3、S2、S1、S0、M、Cn(‐) ;
SUB 的操作码:
K13、K12、K11、K10、K9、K8=0、1、1、0 、0 、0,分别接 S3、S2、S1、S0、M、Cn(‐) ;
“MOV” 操作码的特征: K13+K12=0 ;
“ 非MOV”操作码的特征: K13+K12=1 ;
五、部分代码:
①总线数据读写,由于在 FPGA的特性,总线实现的方式跟传统的方式不同,无法实现inout 操作,这里用使能方式来控制总线数据的读写。
实验代码如下:
wire notmove; //NOT MOV
assign notmove = k13 | k12; //74LS32;
wire move; //MOVE
assign move = !notmove;
wire TEMIB,TEMin,DIB,ACin,BIB;
wire T1,T2,T3,T4;
assign BIB = (move & T1) |(notmove & T2);
assign ACin = ((move & T1) | (notmove & T3)|(notmove & T1));
assign DIB = notmove & T1;
assign TEMin = notmove & T2;
assign TEMIB = notmove & T3;
wire [3:0] databus_B;
wire [3:0] databus_D;
wire [3:0] databus_TEM;
reg [3:0] databus;
wire [3:0] B;
assign B=(BIB==1)? databus:4'b0;
wire [3:0] dout_ac_temp;
assign dout_ac= dout_ac_temp;
wire[3:0] A;
assign A= ((((TEMIB|DIB) & notmove)|(BIB & move))==1)?databus:4'b0;
wire [3:0] dout_f_temp;
assign dout_f = dout_f_temp;
/ B,D,TEM write data to IB
always@(BIB or DIB or TEMIB or databus_B or databus_D or databus_TEM)
begin
if(BIB)
databus <= databus_B;
else if(DIB)
databus <= databus_D;
else if(TEMIB)
databus <= databus_TEM;
else
databus <= 4'b0;
end
②为了保持AC所输入的数据为当前时序的输入,这里做了延迟出来,来保证数
据的一致性。实验代码如下:
wire ACin_reg1;
wire ACin_reg2;
reg ACin_reg3;
wire TEMin_reg1;
wire TEMin_reg2;
reg TEMin_reg3;
SRL16 #(
.INIT(16'h0000) // Initial Value of Shift Register
) SRL16_inst1 (
.Q(ACin_reg1), // SRL data output
.A0(1), // Select[0] input
.A1(1), // Select[1] input
.A2(1), // Select[2] input
.A3(1), // Select[3] input
.CLK(clk), // Clock input
.D(ACin) // SRL data input
);
SRL16 #(
.INIT(16'h0000) // Initial Value of Shift Register
) SRL16_inst2 ( .Q(ACin_reg2), // SRL data output
.A0(1), // Select[0] input
.A1(1), // Select[1] input
.A2(1), // Select[2] input
.A3(1), // Select[3] input
.CLK(clk), // Clock input
.D(ACin_reg1) // SRL data input
);
always@(posedge clk)
begin
ACin_reg3 <= ACin_reg2;
TEMin_reg3 <= TEMin_reg2;
End
SRL16 #(
.INIT(16'h0000) // Initial Value of Shift Register
) SRL16_inst3 (
.Q(TEMin_reg1), // SRL data output
.A0(1), // Select[0] input
.A1(1), // Select[1] input
.A2(1), // Select[2] input
.A3(1), // Select[3] input
.CLK(clk), // Clock input
.D(TEMin) // SRL data input
);
SRL16 #(
.INIT(16'h0000) // Initial Value of Shift Register
) SRL16_inst4 (
.Q(TEMin_reg2), // SRL data output
.A0(1), // Select[0] input
.A1(1), // Select[1] input
.A2(1), // Select[2] input
.A3(1), // Select[3] input
.CLK(clk), // Clock input
.D(TEMin_reg1) // SRL data input
);
六、实验结果
- 仿真结果
2.实验结果分析:
M 为主板按键SW2 ,按下为‘1’;
Cn为主板按键SW3 ,按下为‘1’;
(1) MOV AC,B ; B→AC
(2)OR AC,B ; AC+B→AC
(3)AND AC,B ; AC∙B→AC
(4)ADD AC,B ; AC加B→AC
(5)SUB AC,B ; AC减B→AC
例:要求实现6-3运算,也就是SUB运算,因而只需修改Din为0110、Bin为0011、Sin为0110、M为0、Cn为0即可。
七、问题思考
1.如何较好实现微程序控制器设计的模块化?
通过对各控制信号的逻辑条件和时间条件及操作码进行编码,通过控制信号
的改变来进行微程序设计的模块化
2.分析操作过程中显示器所显示数据的变化过程及其原理。
操作数 A 由 AC 提供,为 AC 输入的数。
操作数 B 由数据开关 D3~D0 设置
暂存器 TEM 为 ALU 的结果寄存器,其内容经 BUS 回送 AC
时钟为 1 时将 Din 输入的数存入 AC 和 Databus 寄存器,时钟为 2 时将 Bin
输入的数推入 Databus 并根据操作数在 Term 显示运算结果,时钟为 3 时将
Term 内存的结果经 BUS 推入 AC 中。
3.在实际微程序控制器中,有哪些因素会影响其运行速度?
数据总线的时钟频率,字长和带宽。