仅供参考
一、实验目的
1.了解模型机中 SM 的作用;
2.熟悉指令寄存器、状态寄存器、指令计数器、寄存器的工作原理;
3.学会使用 VERILOG语言设计时序电路。
二、实验内容
1.用 VERILOG 语言设计 SM;
2.用 VERILOG 语言设计一个 8 位的指令寄存器 IR;
3.用 VERILOG 语言设计一个 2 位的状态寄存器 PSW;
4.用 VERILOG 语言设计一个 8 位的指令计数器 PC;
5.用 VERILOG 语言设计 3 个 8 位寄存器组成的寄存器组,实现读写操作;
6.用 LPM_RAM_IO 定制一个256*8 的 RAM,实现对 RAM 的读写操作。;
三、实验过程
1、SM
A)创建工程(选择的芯片为family=Cyclone II;name=EP2C5T144C8)
B) 编写源代码
C) 编译与调试(包含编译调试过程中的错误、警告信息以及资源消耗)
D) RTL视图
E) 功能仿真波形
F) 时序仿真波形
G)结果分析及结论
分析:
对于功能仿真,可以看到:
当 sm_en 信号为 1 有效时,输出 sm 在时钟的下降沿发生翻转;
当 sm_en 信号为 0 时,输出信号 sm 保持不变;
对于时序仿真,其输出结果和功能仿真类似,但存在8纳秒左右的延迟
结论:
元件设计符合设计要求,元件内部存在8纳秒左右的延迟
2、指令寄存器IR
A)创建工程(选择的芯片为family=Cyclone II;name=EP2C5T144C8)
B) 编写源代码
C) 编译与调试(包含编译调试过程中的错误、警告信息以及资源消耗)
D) RTL视图
E) 功能仿真波形
F) 时序仿真波形
G)结果分析及结论
分析:
对于功能仿真:
在 0-30ns以及50-70ns,ir_ld 为 1,在时钟下降沿将输入写入输出;
当30-50ns以及70ns-1us,ir_ld 为0 时,输出保持不变;
对于时序仿真:
可以看到输出存在 9纳秒 左右的延迟,同时部分时刻输入的变化导致冒险出现,使得输出错误,输出的变化情况大致与功能仿真相同
结论:
元件设计符合设计要求,元件内部存在 9纳秒 左右的延迟
3、状态寄存器PSW
A)创建工程(选择的芯片为family=Cyclone II;name=EP2C5T144C8)
B) 编写源代码
C) 编译与调试(包含编译调试过程中的错误、警告信息以及资源消耗)
D) RTL视图
E) 功能仿真波形
F) 时序仿真波形
G)结果分析及结论
分析:
对于功能仿真:
0-20ns,cf_en 和 zf_en 为 1,在时钟下降沿,将 cf 和 zf 的值写入,输出 c,z 中;20-40ns,cf_en 和 zf_en 为 0,输出 c 和 z 保持不变;
对于时序仿真:
其中输出 c 有 7ns 左右延迟,z 有 8ns 左右延迟,其输出变化与功能仿真大致相同。
结论:
元件设计符合要求,输出 c 有 7ns 延迟,输出 z 有 8ns 延迟。
4、指令计数器PC
A)创建工程(选择的芯片为family=Cyclone II;name=EP2C5T144C8)
B) 编写源代码
C) 编译与调试(包含编译调试过程中的错误、警告信息以及资源消耗)
D) RTL视图
E) 功能仿真波形
F) 时序仿真波形
G)结果分析及结论
分析:
对于功能仿真:
0-20ns以及50-60ns,pc_inc 为 1,pc_ld 为 0,执行地址加 1 操作;
20ns-40ns以及60-80ns,pc_inc为 0,pc_ld 为 1,执行写入操作,将输入写入到输出中;
40-50ns以及80ns-1us,pc_inc 为 0,pc_ld 为0,数据保持不变;
对于时序仿真:
存在 9ns 左右的延迟,输出结果大致与功能仿真相同
结论:
元件设计符合要求,元件存在 9ns 左右的延迟
5、通用寄存器组
A)创建工程(选择的芯片为family=Cyclone II;name=EP2C5T144C8)
B) 编写源代码
C) 编译与调试(包含编译调试过程中的错误、警告信息以及资源消耗)
D) RTL视图
E) 功能仿真波形
F) 时序仿真波形
G)时序分析
操作方法是:编译后,在compilation report中选择【timing analysis】-【summary】
H)结果分析及结论
分析:
对于功能仿真:
在 30ns-60ns,we 为 0,进行写入操作,在每个下降沿,当 rwba=00,01,10时,将输入 i 分别写入寄存器 A,B,C 中;
而在 0-30ns以及60ns-1us,we 为 1,进行读取操作,在每个下降沿,根据 raa 和 rwba 的值 s,d 输出对应寄存器的值,当 raa=00,s 输出 A 的值,raa=01,s 输出 B 的值,raa=10,s 输出 C 的值;
对于时序仿真,输出 s 存在 9ns 左右的延迟,输出 d 存在 10ns 左右延迟,其余输出结果大致与功能仿真相同;
对于时序分析,可以得到时钟输出延迟 tco 为7.942ns,建立时间 tsu 为 5.326ns,保持时间 th 为 0.235ns,电路延迟时间 tpd 为 12.036ns
结论:
元件设计符合要求,输出 s 存在 9ns 左右的延迟,输出 d。
6、RAM的使用
A)创建工程(选择的芯片为family=Cyclone II;name=EP2C5T144C8)
B) 电路图
C) 编译与调试(包含编译调试过程中的错误、警告信息以及资源消耗)
D) RTL视图
E) 功能仿真波形
F) 时序仿真波形
G)结果分析及结论:
分析:
对功能仿真:
15-20ns,xl 和 dl 都为 0,输出为高阻态;
0-15ns以及70ns-1us,xl 为 1,dl 为 0,进行写入操作,首先将104写入0和1地址,然后把102写入4地址,再把103写入 5和1地址;
30-70ns,xl 为 0,dl 为 1,进行读操作,对于每个上升沿,分别将64,1,2,3地址中的指令读出并输出,有的指令已提前存入对应的 mif 文件中,仿真正确;
对于时序仿真,输出存在 11ns 左右的延迟,同时由于输入的改变导致某些位置出现冒险。
结论:
元件设计符合要求,输出存在 11ns 左右延迟。
四、思考题
1.时钟周期的上升沿实现对RAM的读写操作,为何PC、SM、IR、PSW以及寄存器组的操作是下降沿完成?
答:
我们不但要保证取址操作在一个周期内完成,而且要保证 RAM 优先级较高,所以需要放在不同的跳变沿执行。假设放在同一时间,可能会便数据处理来不及,导致混乱,从而出错。
2.采用Verilog描述时序部件应该采用阻塞赋值语句还是非阻塞赋值语句?
答:
是非阻塞赋值。
3、通用寄存器组只有WE的控制信号,实现通用寄存器组读操作的电路是组合电路还是时序电路?请大致画出对寄存器组进行读操作的电路部分。
答:
组合电路
五、实验总结、必得体会及建议
1、从需要掌握的理论、遇到的困难、解决的办法以及经验教训等方面进行总结。
需要掌握的理论:
1. 如何用 Verilog 语言编写时序逻辑元件;
2. 每一种信号在clock的上升沿还是下降沿进行跳转;
3. 阻塞赋值和非阻塞赋值;
4. LMP_RAM里面的mif文件如何使用,如何判断存放成功;
5. 熟悉指令寄存器、状态寄存器、指令计数器、寄存器的工作原理。
遇到的困难:
1.LMP_RAM不清楚文件mif的用处何在,如何和仿真结合起来;
2.有两个控制变量,在功能和时序仿真时,两者能否同时为1或同时为0;
3.RAM读写如何验证是否成功;
4.输出变量是在always语句外面初始化还是里面;
5.找不到tpd。
解决的办法:
1.询问同学后,得知mif文件可预先存储一些非0的值,然后通过控制信号DL,XL来控制读写,把相应ADDR的值从mif文件中读取出来或者读取出去,或者呈高阻态,可以设定一些值,在功能仿真时,通过特定的输入,看是否输出附和我们在mif里存的值,则可知道仿真是否正确;
2.仔细研究老师在实验指导里面给出的信号变化以及用途的表格;
3.可以通过逻辑推理(简单的情况下),也可以直接两个都试一下,看仿真是否正确(复杂情况下);
4.老师告知,时序电路无tpd,属于正常现象。
经验教训:
多询问同学和老师,代码或者仿真不对时,多加尝试,bdf文件画图时连线一定要仔细,不得断线或者乱线,用Verilog语言实现之前,一定要熟悉元件的功能和信号变化原理。
2、对本实验内容、过程和方法的改进建议(可选项)。
答:ram不可以用代码实现吗?