资源描述
资料内容仅供您学习参考,如有不当或者侵权,请联系改正或者删除。
《计算机组成原理》
实验指导书
计算机科学与技术学院
目录
实验一 熟悉实验平台……………………………………………………………………(3)
实验二 总线传送…………………………………………………………………………(10)
实验三 运算器的设计与调试……………………………………………………………(14)
实验四 存贮器的设计与调试……………………………………………………………(20)
实验五 控制器的设计与调试…………………………………………………………...(26)
附 录 常见器件简介……………………………………………………………………(30)
实验一 熟悉实验平台
一.实验目的
1. 熟悉使用Verilog硬件描述语言
2. 熟悉ISE开发环境
3. 掌握实验箱组成
4. 熟悉时序发生器的组成原理;
5. 掌握数字逻辑器件Verilog语言的编写;
二.实验设备
1. 装有ISE10.1的PC机一台
2. EDK-3SAISE实验箱一台
三.实验内容
1.节拍信号T1—T4波形如图-1所示
图-1 节拍时序波形图
每个节拍内均包含脉冲clk_m1。节拍信号有三种工作方式。这三种工作方式受Clk_sel, Clk_sel1电平开关组合控制。
Clk_sel
Clk_sel1
功能说明
0
0
连续时标方式
0
1
单周期时标方式
1
0
单周期时标方式
1
1
单拍时标方式
时标信号的启动, 停止受Button,Rstn按钮开关控制。
2.用Verilog语言实现时序代码如下:
module Timeen(
input Clk, //System Clock 40Mhz
input Button, // setep clock
input Rstn, // reset, low active
input Clk_sel, // sequence timing or step timing select
input Clk_sel1,
output [4:1] t, // Display( T1-T4)
output M1
);
wire Clk_m1;
wire Clk_i,Clk_ii;
wire PB_R;
assign M1=Clk_m1;
GenClk_i Clk_i_Module (
.Clk_s(Clk),
.Clk_i(Clk_i),
.Rstn(Rstn)
);
GenClk_ii Clk_ii_Module (
.PB_R(PB_R),
.Clk(Clk),
.Clk_ii(Clk_ii)
);
Debouncer Debouner_Module (
.Clk_s(Clk),
.PB(Button),
.PB_state(),
.PB_up(PB_R),
.PB_down()
);
ClkSel ClkSel_Module (
.Clk_s(Clk),
.Clk_i(Clk_i),
.Clk_ii(Clk_ii),
.Clk_m1(Clk_m1),
.Clk_sel(Clk_sel),
.Clk_sel1(Clk_sel1)
);
Bit1_Display Bit1_Display_Module (
.Clk_s(Clk),
.Clk_m1(Clk_m1),
.T(t),
.Rstn(Rstn),
.Clk_i(Clk_i)
);
endmodule
module GenClk_i(
input Clk_s,
output Clk_i,
input Rstn
);
reg [24:0] Cnt;
assign Clk_i= Cnt[24];
always@(posedge Clk_s or negedge Rstn)
begin
if (!Rstn)
Cnt<=0;
else
Cnt <= Cnt + 1;
end
endmodule
module GenClk_ii(
input PB_R,
input Clk,
output Clk_ii
);
reg Clk_o,Clk_o1,Clk_o2;
assign Clk_ii=Clk_o2;
always@(posedge Clk )
begin
Clk_o<=PB_R;
Clk_o1<=Clk_o;
Clk_o2<=Clk_o1;
end
endmodule
module Debouncer(Clk_s, PB, PB_state, PB_up, PB_down);
input Clk_s; // "clk" 时钟信号
input PB; // "PB" 有毛刺的、 异步的、 低有效的按键信号
output PB_state; // 当按键被按下时输出1
output PB_down; // 按键被按下的瞬间输出一个高电平脉冲
output PB_up; // 按键被松开的瞬间输出一个高电平脉冲
// 首先使用两个触发器来同步PB信号
reg PB_sync_0;
always @(posedge Clk_s)
PB_sync_0 <= ~PB; // 翻转PB, 使之高有效
reg PB_sync_1;
always @(posedge Clk_s) PB_sync_1 <= PB_sync_0;
// 声明一个16位的剖?
reg [21:0] PB_cnt;
// 当按键被按下或松开时, 计数?// 当计数器计数溢出时, 便认为按键的状态确定。
reg PB_state; // 按?(0: 松开, 1: 按下)
wire PB_idle = (PB_state==PB_sync_1);
wire PB_cnt_max = &PB_cnt; //当B_cn为全1时, 输出为真
always @(posedge Clk_s)
if(PB_idle)
PB_cnt <= 0; // 没发生任何事情
else begin
PB_cnt <= PB_cnt + 1; // 按键被按下或者松开, 增加计数器的值
if(PB_cnt_max) PB_state <= ~PB_state; // 如果计数器溢出, 改变PB_state的值
end
wire PB_down = ~PB_state & ~PB_idle & PB_cnt_max; // 当按键被按下时, 有效一个时钟周期
wire PB_up = PB_state & ~PB_idle & PB_cnt_max; // 当按键被松开时, 有效一个时钟周期
endmodule
module ClkSel(
input Clk_s,
input Clk_i,
input Clk_ii,
output Clk_m1,
input Clk_sel,Clk_sel1
);
reg [3:0] count;
reg Clk_o,Clk_o1,Clk_o2;
assign Clk_m1=Clk_o1 & (~Clk_o2);
always@(posedge Clk_s)
begin
case ({Clk_sel,Clk_sel1})
2'b00: begin Clk_o<= Clk_i; end
2'b01: begin if (count<4) Clk_o<=Clk_i; end
2'b10: begin if (count<4) Clk_o<=Clk_i; end
2'b11: begin Clk_o<= Clk_ii; end
default:begin if (count<4) Clk_o<=Clk_i; end
endcase
end
always@(posedge Clk_s)
begin
if (Clk_ii) count <= 0;
else if (Clk_m1 & ((Clk_sel==0 & Clk_sel1==1) |(Clk_sel==1 & Clk_sel1==0))) if (count<4) count <= count +1; else count <=4;
end
always@(posedge Clk_s)
begin
Clk_o1<=Clk_o;
Clk_o2<=Clk_o1;
end
endmodule
module Bit1_Display(
input Clk_s,
input Clk_m1,
output reg [3:0] T,
input Rstn,
input Clk_i
);
reg [2:0] cnt_clk;
always@(posedge Clk_s or negedge Rstn)
begin
if (!Rstn)
begin cnt_clk<=1; end
else
begin
if (Clk_m1==1)
begin
cnt_clk<=cnt_clk+1;
if (cnt_clk==4) cnt_clk<=1;
end
end
end
always @(cnt_clk)
begin
case (cnt_clk)
3'b001 : begin
T <= 4'b0001;
end
3'b010 : begin
T <= 4'b0010;
end
3'b011 : begin
T <= 4'b0100;
end
3'b100 : begin
T <= 4'b1000;
end
default : begin
T <= 4'b0001;
end
endcase
end
endmodule
3.用Verilog语言实现74ls244功能模块代码
module ls244(G,A,Y);
input G;
input [3:0] A;
output [3:0] Y;
assign Y=(G==0)?A:'bz;
endmodule
四.实验报告格式
1.实验目的
2.实验设备
3.实验内容
A.模块代码
B.引脚映射表
C.功能仿真测试时序图
D.加载后运行情况
4.实验小结
实验二 总线传递
一. 实验目的
1. 熟悉并掌握Xilinx ISE 10.1 开发平台;
2. 了解FPGA, 学习Verilog 语言, 掌握如何在FPGA 里面实现数字逻辑开发;
3. 掌握采用总线结构进行信息传递的方法。
二 . 实验环境
1. 软件环境: Xilinx ISE Design Suit 10.1
2. 硬件环境: EDK-3SAISE教学平台实验箱
三 .原理
下面我们介绍几种在实验中常见三态”TTL”器件。
I.74LS244—三态输出八缓冲器/总线驱动器
它是专作挂总线用的三态逻辑器件之一。
其逻辑图见下:
该器件有8位数据输入。8位原码三态输出, 二个输出控制端1G, 2G, 分别控制两组独立的4位数据传送, 当1G, 2G连接时, 可作8位控制端, 控制端为”0”时为数据传送状态为”1”时输出为高阻状态, 整个器件与总线隔离。用一片74LS244可作为单向数据传送, 若用二片器件则可构成双向数据传送, 事实上, 当前市场上也有现成的双向总统驱动器件出售。如: 74LS245。
II.74LS373/ 74LS374一八D锁存器
它们都是由八个D触发器和八个三态输出缓冲器组成的, 有8个数据输入端1D-8D, 8个数据输出端1Q一8Q, 一个使能端K 和一个输出控制端G。其逻辑图见后, 74LS373 和74LS374 的功能是完全一样的, 只是控制信号不同, 74LS373的使能端K是电平控制, 而74LS374是由脉冲的上跳沿控制的。它们与74LS244的不同之处在于: 它们具有数据保存功能, 而74LS244无保存功能。当传送数据时。它相当于一个直通门, 因此74LS373和74LS374 不但可作为直接挂总统器件, 也可作为寄存器、 暂存器、 缓冲器等。
74LS373 逻辑图
74LS374 逻辑图
2.总线建立的原则
( 1) 互斥性: 指挂在总线上的各总线驱动器( 指发送端) 必须分时操作, 即不允许在同一总线上同时有多个数据源发送信息但允许有几个部件同时接收总线上的信息。
( 2) 一致性: 指在同一总线上所用的总线控制器件类型( 如OC线或门或三态传输门) 应一致, 同时应考虑总统的负载能力和阻抗匹配, 挂总线器件的有关参数可查手册。
三、 框图: 该图表示一个简单系统的总体框图。
1. 实验要求:
① 信息传送部件有4个, 分别用I, O, M, P表示。
② 信息的宽度为4位。
③ 经过改变时序的控制, 完成以下两种各部件之间信息的传送功能。
T1、 I→O, M, P
T2、 I→M
T3、 M→P
T4、 P→O
T1、 I→O, P
T2、 I→M
T3、 M→P
T4、 P→O
2. 74ls373的Verilog 语言代码:
module ls373(cp,clr,D,Q);
input cp,clr;
input [3:0] D;
output [3:0] Q;
reg [3:0] Q;
always@(*)
begin
if (clr==0) Q<=4'b0000;
else if (cp) Q<= D ;
end
endmodule
四.实验报告格式
1. 实验目的
2. 实验设备
3. 实验内容
A. 方案框图
B. 时序逻辑函数表示式
C. 模块代码
D. 引脚映射表
E. 加载后运行情况
4. 实验小结
实验三 运算器的设计与调试
一. 实验目的
1.熟悉MSI、 74LS181 ALU的功能和使用方法。
2.了解运算部件的基本结构和数据传输过程, 并掌握其设计和调试方法。
二 . 实验环境
1. 软件环境: Xilinx ISE Design Suit 10.1
2. 硬件环境: EDK-3SAISE教学平台实验箱
三 .原理
运算器是计算机的组成部件之一, 不同的计算机具有不同结构的运算器, 且同一结构的运算器也能够因使用器件的不同而使运算器结构在组成细节上出现, 较大的差异, 运算部件主要由ALU、 通用寄存器和一些专用寄存器等构成, 而ALU是其核心。因此, 下面介绍本实验采用的MU芯片的功能和使用。
1.芯片介绍
( 1) 74LS 181—算术逻辑单元( 或称函数发生器)
MSI( 中规模集成电路) 74LS181 ALU能够对输人的两个4位数据A和B执行32种算术及逻辑运算功能, 其中算术、 逻辑运算各16种, 该器件有A0~A3, B0~B3 两个4位数据输入端, F0~F3为结果输出端, 高位进位输出端CN+4, 组成进位辅助函数P和G输出端。S3、 S2、 S1、 S0、 Cn、 M为控制端, 其中M为模式控制, 当M=1时, ALU执行对A, B的逻辑运算; M=0时执行算术运算。ALU的功能表、 引脚图及内部逻辑图详见附录和器件手册。
A3
G
P
S0
S1
S2
S3
M
Cnn
F0
F1
F2
F3
74LS181的逻辑图
Cn+4
A=B
A2
A1
A0
B3
B2
B1
B0
四、 框图: 该图表示一个简单运算部件系统的总体框图。
Cn+4
D0…D7
F
ALU
(B) (A)
B
AC
在图中, ALU的数据输入, 输出及对数据的处理都采用并行方式, ALU的B输入端数据来自开关输入寄存器B、 A输入端数据来自累加器AC的输出, ALU的运算结果F存放在AC中, 状态寄存器放两种特征: C和Z
具体要求:
(1) 数据为4位无符号二进制整数;
(2) 完成5种运算功能:
I F=B
II F=A+ B
III F=AB
IV F=A加B
V F=A减B
AC的初始状态能够经过对它直接清零或者执行F=B操作给予置数; ALU的控制端由开关设置;
显示运算结果 AC和状态 C、 Z;
ALU用 1片 74LS181 AC用1片74LS273, B用1片74LS244,状态寄存器用1片74LS74;
五、 74ls273、 74ls181、 74ls74代码
module ls273(clk_s,Clock,Clear,D,Q);
input clk_s,Clock,Clear;
input [3:0] D;
output [3:0] Q;
reg [3:0] Q;
always@(posedge clk_s )
begin
if (Clear==0) Q<=0;
else
if (Clock) Q<=D;
end
endmodule
module ls181(clk_s,S_in,A_in,B_in,Cn,M_in,F_out,Cn4,Zero);
input clk_s;
input [3:0] S_in;
input [3:0] A_in;
input [3:0] B_in;
input Cn;
input M_in;
output [3:0] F_out;
output Cn4,Zero;
reg [4:0] F_out_tmp=0;
reg Zero=0;
wire Cn4;
assign F_out=F_out_tmp[3:0];
assign Cn4=F_out_tmp[4];
///ACTIVE HIGHT DATA
always@(posedge clk_s)
begin
case(S_in)
4'b0000 : begin
if (M_in==1) F_out_tmp<=A_in;else begin if (Cn==1) F_out_tmp<=A_in;else F_out_tmp<=A_in+1; end
end
4'b0001 : begin
if (M_in==1) F_out_tmp<=(A_in|B_in);else begin if (Cn==1) F_out_tmp<=A_in|B_in;else F_out_tmp<=(A_in|B_in)+1;end
end
4'b0010 : begin
if (M_in==1) F_out_tmp<=(A_in)&B_in;else begin if (Cn==1) F_out_tmp<=A_in|(B_in);else F_out_tmp<=A_in|(B_in)+1;end
end
4'b0011 : begin
if (M_in==1) F_out_tmp<=0;else begin if (Cn==1) F_out_tmp<=-1;else F_out_tmp<=0;end
end
4'b0100 : begin
if (M_in==1) F_out_tmp<=(A_in&B_in);else begin if (Cn==1) F_out_tmp<=A_in+(A_in&(B_in));else F_out_tmp<=A_in+(A_in&(B_in))+1;end
end
4'b0101 : begin
if (M_in==1) F_out_tmp<=B_in;else begin if (Cn==1) F_out_tmp<=(A_in|B_in)+(A_in&(B_in));else F_out_tmp<=(A_in|B_in)+(A_in&(B_in))+1;end
end
4'b0110 : begin
if (M_in==1) F_out_tmp<=A_in^B_in;else begin if (Cn==1) F_out_tmp<=A_in-B_in-1;else F_out_tmp<=A_in-B_in;end
end
4'b0111 : begin
if (M_in==1) F_out_tmp<=A_in&(B_in);else begin if (Cn==1) F_out_tmp<=A_in&(B_in)-1;else F_out_tmp<=A_in&(B_in);end
end
4'b1000 : begin
if (M_in==1) F_out_tmp<=(A_in)|B_in;else begin if (Cn==1) F_out_tmp<=A_in+(A_in&B_in);else F_out_tmp<=A_in+(A_in&B_in)+1;end
end
4'b1001 : begin
if (M_in==1) F_out_tmp<=(A_in^B_in);else begin if (Cn==1) F_out_tmp<=A_in+B_in;else F_out_tmp<=A_in+B_in+1;end
end
4'b1010 : begin
if (M_in==1) F_out_tmp<=B_in;else begin if (Cn==1) F_out_tmp<=(A_in|(~B_in))+(A_in&B_in);else F_out_tmp<=(A_in|(B_in))+(A_in&B_in)+1;end
end
4'b1011 : begin
if (M_in==1) F_out_tmp<=A_in&B_in;else begin if (Cn==1) F_out_tmp<=A_in&B_in-1;else F_out_tmp<=A_in&B_in;end
end
4'b1100 : begin
if (M_in==1) F_out_tmp<=1;else begin if (Cn==1) F_out_tmp<=A_in+A_in;else F_out_tmp<=A_in+A_in+1;end
end
4'b1101 : begin
if (M_in==1) F_out_tmp<=A_in|(B_in);else begin if (Cn==1) F_out_tmp<=(A_in|B_in)+A_in;else F_out_tmp<=(A_in|B_in)+A_in+1;end
end
4'b1110 : begin
if (M_in==1) F_out_tmp<=A_in|B_in;else begin if (Cn==1) F_out_tmp<=(A_in|(B_in))+A_in;else F_out_tmp<=(A_in|(B_in))+A_in+1;end
end
4'b1111 : begin
if (M_in==1) F_out_tmp<=A_in;else begin if (Cn==1) F_out_tmp<=A_in-1;else F_out_tmp<=A_in;end
end
default : F_out_tmp<=5'b00000;
endcase
end
always@(F_out_tmp)
begin
if (F_out_tmp[3:0]==4'b0000)
Zero<=1'b1;
else
Zero<=1'b0;
end
endmodule
module ls74(clk_s,clock,clear,din,dout
);
input clk_s;
input clock;
input clear;
input din;
output dout;
reg dout;
always@(posedge clk_s )
begin
if (clear==1)
begin
if (clock==1)
dout<=din;
end
else dout<=1'b0;
end
endmodule
六、 验报告要求
1. 实验目的
2. 实验设备
3. 实验内容
A. 方案框图
B. 时序逻辑函数表示式
C. 模块代码
D. 引脚映射表
E. 加载后运行情况
4. 实验小结
实验四 存贮器的设计与调试
一. 实验目的
1.掌握静态RAM的存取方法和器件的检测方法。
2.学会如何利用现成的RAM器件来构成系统中所需的存贮空间。
二 . 实验环境
1.软件环境: Xilinx ISE Design Suit 10.1
2. 硬件环境: EDK-3SAISE教学平台实验箱
三 .原理
1. 器件介绍
(1) RAM器件MN2114是一种4位1K字节的NMOS静态随机存贮器, 其逻辑电平与TTL兼容。
4×16×64存储矩阵
由该器件的内部逻辑结构图知道, 它是由存贮体、 地址译码器。读/写寄存器、 读写控制器、 三态输入输出缓冲器等部分组成的, 各组成部分的功能是:
存贮体—寄存信息代码。
译码器—分行译码和列译码, 选择要访问的存贮单元。
读/写寄存器—把代码从存贮体读出并放大或将代码写入存贮体。
读/写控制器—接收读写命令, 并发出相应的信息来控制相应的读写作。
三态输入/输出缓冲器—接收或发送数据。
器件的读写功能是由选片端CS和读写端WE控制实现的, 见下面功能表:
Cs非
WE非
I/O状态
操作功能
H
╳
高阻
片子未选中
L
L
H
写”1”
L
L
L
写”0”
L
H
H
读”1”
L
H
L
读”0”
( 2) MN2ll4的读写操作
①、 读操作
(a) 时序波形
上图是存储器对控制信号的时序要求, 在A点处, CUP送出存储器单元地址。经tA时间之后, 读出的数据真正在数据总线上稳定, 因此, 就要求在地址信号有效后不超过tA~tCO的时间段中, 片选信CS有效。C点之后, 输出数据成为有效, 而且只要地址信号和输出允许信号没有撤消, 那输出数据一直保持有效。在此图中, 未对读/写控制信号R/W作说明, 可是, 在整个读周期中, R/W应该保持高电平。
②、 写操作
( a) 时序波形
上图表示了存储器对写周期的时序要求。在写周期开始时, 先要求有一段地址建立时间, 在B点处, 地址已经有效, 为了提高速度, 此时, 要求另外两个写操作必须具备的信号即片选信号和写信号均应处于低电平。对于写入数据来讲, 只要在片选信号和读/写信号为低电平时, 数据能够保持稳定就行了, 为了简单起见, 有些存储器要求在整个写周期中, 数据保持稳定。
在写周期中, 要求最严格的时间参数有两个, 一个就是前面提到的地址建立时间tAW。另一个是写脉冲的宽度tW。地址建立时间是指地址出现到稳定所需的时间, 写操作时, 它要在写脉冲到来之前稳定。A点到B点的时间段就是地址建立时间。写脉冲宽度就是读/写控制线维持低电平的时间, 它不能小于规定的值。
写周期就是A点到D点之间的时间, 它为地址建立时间、 写脉冲宽度和写操作恢复时间三者的总和。写操作恢复时间和读操作恢复时间的含义类似, 也是为了进行器件内部操作而设置的。对于某些存储器件, 读操作恢复时间和写操作恢复时间很小, 于是认为是”0”。
( A) 操作步骤
a.将地址输入到地址输入端A0~A9
b.置控制端WE为低电平”0”。
c.把要写入的数据线I/O1~I/O4上。
d.置控制端CS为低电平”0”, 经一定的延时(tDS+tDH)后, 就完成把数据写入内存的操作。
步骤a、 b、 c、 d为单写时的操作步骤, 若要连写, 则应在改变地址输入之前抬高CS( 或CS和WE任一为高) , 再重复步骤a~d步骤, 抬高CS的目的是避免在改变地址输入时会发生误写, 冲掉原来写好的信息, 这一点应特别注意。
2.器件的检测
存贮器是计算机的重要组成部件, 它的可靠性和稳定性对机器的可靠运行有较大的影响。因此, 在机器运行之前必须对存贮器进行检测, 以便及早地发现器件的稳定性故障及了解对各种控制信号的参数要求, 下面介绍一种对RAM MN2114器件进行自动检测的方法。
检测步骤:
(1) 设置测试码, 全”0”、 全”1”, 及”0”和”1”间隔码或者其它码均可。
(2) 自动连续加载测试码于RAM中。
(3) 自动读出一个被加载单元的内容。
将读出的信息与原设置的测试码进行比较, 若两者相等, 则执行下一个单元的测试, 直至检测完毕, 若两者不相等, 则停止运行, 记下出错的地址和相应单元的错误信息。
流程图:
N
Y
启动
设置测试码
自动连续加载代码于RAM中
读出一个单元内容
正确
Y
N
比较结束
地址加1
显示出错地址内容容
停机
三、 实验内容
1.画出设计框图
2.要求
(1) 字长: 4位
(2) 采用总线结构
建立总线的原则
互斥性—挂在总线上的各发送部件必须具有分时操作的可能性, 即不允许在同一时刻有多个部件向同总线发送几种信息, 但几个部件可同时接收总线上的信息。
一致性—指挂在同一总线上的部件所采用的器件类型应一致, 本实验的均采用三态器件, 例如。MN2ll4, 74LS374, 74LS373, 74LS244等。
( 3) 实现下列功能
a.写某单元的内容。
b.读某单元的内容。
c.连续写几个单元的内容。
d.连续读几个单元的内容。
四、 2114、 74ls161代码
module ram2114(
inout [3:0] data,
input [3:0] addr,
input cs,
input rw,
input en,
input clk
);
reg [3:0] arm [15:0];
reg [3:0] temp;
assign data=(cs==0 & rw==1 & en==0
展开阅读全文