写在前面:
本次实验是完成cpu设计的时序部件,整体难度较小但涉及板块较多,细心完成就能顺利通过全部测评
一、实验目的
1.了解模型机中 SM 的作用。
2.熟悉指令寄存器、状态寄存器、指令计数器、寄存器的工作原理
3.学会使用 VERILOG 语言设计时序电路。
二、实验内容
1.用 VERILOG 语言设计 SM;
2.用 VERILOG 语言设计一个 8 位的指令寄存器 IR;
3.用 VERILOG 语言设计一个 1 位的状态寄存器 PSW;
4.用 VERILOG 语言设计一个 8 位的指令计数器 PC;
5.用 VERILOG 语言设计 4 个 8 位寄存器组成的寄存器组,实现读写操作;
6.用 LPM_RAM_IO 定制一个 256*8 的 RAM,实现对 RAM 的读写操作。
三、实验过程
1、SM
A) 源代码
module sm(sm_en,sm,clk);
input sm_en,clk;
output sm;
reg t=1'b0;
always @(negedge clk)
begin
if(sm_en==1'b1) t<=~t;
end
assign sm=t;
endmodule
B) 编译与调试(包含编译调试过程中的错误、警告信息以及资源消耗)
(选择的芯片为 family=Cyclone II;name=EP2C5T144C8)
C) RTL 视图
D) 功能仿真波形
E) 时序仿真波形
F)结果分析及结论
结果分析:对于功能仿真,当 sm_en 使能有效时(高电平有效),输出信号 sm 在时钟下降沿发生翻转,当 sm_en 禁止时,输出信号不发生翻转。对于时序仿真,输出结果与功能与功能仿真基本一致,但存在 7.5ns 的延迟。
结论:
元件设计符合要求,元件内部存在 7.5ns 的延迟。
2、指令寄存器 IR
A) 源代码
module ir(clk,ld_ir,a,x);
input clk,ld_ir;
input [7:0]a;
output reg [7:0]x=8'b00000000;
always @(negedge clk)
begin
if(ld_ir==1'b1)
x<=a;
end
endmodule
B) 编译与调试(包含编译调试过程中的错误、警告信息以及资源消耗)
(选择的芯片为 family=Cyclone II;name=EP2C5T144C8)
C) RTL 视图
D) 功能仿真波形
E) 时序仿真波形
F)结果分析及结论
结果分析:对于功能仿真,在 0-100ns 范围内 ld_ir 使能有效,在时钟信号的下降沿将 a写入 x,在 100ns 之后 ld_ir 使能禁止,不再将 a 进行写入操作。对于时序仿真,基本功能与波形和功能仿真类似,但输出存在 9ns 左右的延迟,同时部分变化出现冒险。
结论:
元件设计符合要求,元件内部存在 9ns 左右的延迟。
3、状态寄存器 PSW
A) 源代码
module psw(g_en,gf,g,clk);
input g,clk,g_en;
output reg gf=1'b0;
always @(negedge clk)
begin
if(g_en==1'b1)
gf<=g;
end
endmodule
B) 编译与调试(包含编译调试过程中的错误、警告信息以及资源消耗)
(选择的芯片为 family=Cyclone II;name=EP2C5T144C8)
C) RTL 视图
D) 功能仿真波形
E) 时序仿真波形
F)结果分析及结论
结果分析:对于功能仿真,在 0-70ns 范围内 g_en 使能有效,在时钟信号的下降沿将 g 写入gf,在 70ns 之后 g_en 使能禁止,不再对 gf 进行写入操作。对于时序仿真,基本功能与波形和功能仿真类似,但输出存在 7ns 左右的延迟。
结论:
元件设计符合要求,元件内部存在 7ns 左右的延迟。
4、指令计数器 PC
A) 源代码
module pc(ld_pc,in_pc,clk,a,c);
input in_pc,clk,ld_pc;
input [7:0]a;
output reg [7:0]c=8'b00000000;
always @(negedge clk)
begin
if(in_pc==1'b1 && ld_pc==1'b0)
c<=c+8'b00000001;
else if(in_pc==1'b0 && ld_pc==1'b1)
c<=a;
end
endmodule
B) 编译与调试(包含编译调试过程中的错误、警告信息以及资源消耗)
(选择的芯片为 family=Cyclone II;name=EP2C5T144C8)
C) RTL 视图
D) 功能仿真波形
E) 时序仿真波形
F)结果分析及结论
结果分析:对于功能仿真,当 in_pc=0,ld_pc=1 时进行写入操作,在时钟信号的下降沿将a 写入 c,当 in_pc=0,ld_pc=1 时进行自加操作,c 中的数自加一。对于时序仿真,基本功能与波形和功能仿真类似,但输出存在 9.6ns 左右的延迟,同时部分变化出现冒险。
结论:
元件设计符合要求,元件内部存在 9.6ns 左右的延迟。
5、通用寄存器组
A) 源代码
module reg_group(we,clk,sr,dr,i,s,d);
input we,clk;
input [1:0]sr,dr;
input [7:0]i;
output reg[7:0]s,d;
reg [7:0]r0=8'b00000001,r1=8'b00000001,r2=8'b00000001,r3=8'b00000001;
always @(*)
begin
if(sr==2'b00)
s=r0;
else if(sr==2'b01)
s=r1;
else if(sr==2'b10)
s=r2;
else
s=r3;
if(dr==2'b00)
d=r0;
else if(dr==2'b01)
d=r1;
else if(dr==2'b10)
d=r2;
else
d=r3;
end
always @(negedge clk)
begin
if(we==1'b1)
begin
case(dr)
2'b00:r0<=i;
2'b01:r1<=i;
2'b10:r2<=i;
2'b11:r3<=i;
endcase
end
end
endmodule
B) 编译与调试(包含编译调试过程中的错误、警告信息以及资源消耗)
(选择的芯片为 family=Cyclone II;name=EP2C5T144C8)
C) RTL 视图
D) 功能仿真波形
E) 时序仿真波形
F)时序分析
操作方法是:编译后,在 compilation report 中选择【timing analysis】-【summary】
G) 结果分析及结论
结果分析:对于功能仿真,当 we=1 时进行写入操作,在时钟信号的下降沿根据 dr 的值将 i写入寄存器(R0、R2、R1、R0,在波形中未体现),当 dr=00 时将 R0 的值从 d 中输出,dr=01时将 R1 的值从 d 中输出,dr=10 时将 R2 的值从 d 中输出,dr=11 时将 R3 的值从 d 中输出。当 sr=00 时将 R0 的值从 s 中输出,sr=01 时将 R1 的值从 s 中输出,sr=10 时将 R2 的值从 s中输出,sr=11 时将 R3 的值从 s 中输出。对于时序仿真,基本功能与波形和功能仿真类似,但输出存在 10s 左右的延迟,同时其中较多变化出现冒险。
结论:
元件设计符合要求,元件内部存在 10ns 左右的延迟。
6、RAM 的使用
A)电路图
B) 编译与调试(包含编译调试过程中的错误、警告信息以及资源消耗)
(选择的芯片为 family=Cyclone II;name=EP2C5T144C8)
C) RTL 视图
D) 功能仿真波形
E) 时序仿真波形
F) 结果分析及结论
结果分析:对功能仿真,当 RE 和 WR 都为 0 时,输出为高阻态。当 WR 为 1,RE 为 0 时,进行写入操作,对于两个上升沿,分别将输入信号 00001111,00000001 分别写入地址 3,2中。当 WR 为 0,RE 为 1 时,进行读操作,对于每个上升沿,分别将 1、3、2、7、21 地址中的指令读出并输出,其中 7 和 21 地址中的指令已提前存入对应的 mif 文件中,3、2地址中的指令在写入操作中读入,仿真正确。对于时序仿真,输出波形与功能与功能仿真相似,但输出存在 6.5ns 左右的延迟,同时由于输入的改变导致某些位置出现冒险。
结论:
元件设计符合要求,输出存在 6.5ns 左右延迟。
四、思考题
1.时钟周期的上升沿实现对 RAM 的读写操作,为何 PC、SM、IR、PSW以及寄存器组的操作是下降沿完成?
答:因为我们既要保证取址操作在一个周期内完成,同时又要保证 RAM 为优先级较高,如果同步处理,可能会导致无法及时进行数据处理,导致出错。
2.采用 VERILOG 语言描述时序部件应该采用阻塞赋值语句还是非阻塞赋值
语句?
答:时序部件应该采用非阻塞赋值语句。
3.通用寄存器组只有 WE 的控制信号,实现通用寄存器组读操作的电路是组合电路还是时序电路?请大致画出对寄存器组进行读操作的电路部分。
答:实现通用寄存器组读操作的电路时组合电路。
五、实验总结、必得体会及建议
从需要掌握的理论、遇到的困难、解决的办法以及经验教训等方面进行总结。
答:需要掌握的理论:需要了解模型机中 ir、pc、通用寄存器组、sm、psw 以及寄存器 ram的基本结构和功能,需要掌握 quartus 的使用以及使用 Verilog 语言进行程序的编写,以及使用 quaartus 进行电路设计。遇到的困难:本次实验中 ram 的设计与先前多个实验不同,不是通过 Verilog 语言实现的,一开始有点无从下手,后来通过老师的耐心答疑最后终于理解了指导书的内容并顺利完成设计。经验教训:对于电路设计的每一个板块一定要细心分析、认真理解每一步的原理和使用方法,不懂的及时和同学讨论或者向老师提问,以及多使用仿真对结果进行分析,实践是设计电路必不可少的环节。