实验一.做一个4选1的mux,并且进行波形仿真和2选1的mux对比,观察资源消耗的变化
四选一mux代码如下:
RTL视图如下:
波形仿真如下:
2选1的mux资源消耗情况:
4选1的mux资源消耗情况:
4选1比2选1消耗资源更多。
实验二.编写一个4X4路交叉开关的RTL,然后编译,看RTL View 比较2x2与4x4之间消耗资源的区别。通过对比资源,你有什么结论?
4X4路交叉开关实验代码设计如下:
4X4路交叉开关RTL视图如下:
2X2路交叉开关RTL视图如下:
2X2路交叉开关资源消耗情况:
4X4路交叉开关资源消耗情况:
可见4X4的交叉开关消耗资源成倍的增长了。
实验三.编写一个8输入的优先编码器,然后编译,看RTL View
实验四.
- 编写一个4-16的译码器,编译
- 和3-8译码器对比资源开销
- 看RTL View
4-16译码器实验代码如下:
资源消耗变化如下:
3-8译码器资源消耗:
4-16译码器资源消耗:
输入多了一位、输出多了八位的情况下资源消耗几乎多了一倍,可见资源消耗主要与输出位数正相关。
实验五.
- 把加法器的输出信号改成4比特位宽,编译,波形仿真。观察输出结果,说出输出和输入的对应关系。
- 把加法器的输入信号改成8比特位宽,编译,波形仿真。观察加法器的输出延迟,和4比特输入位宽的情况对比,你有什么结论,为什么?
1.把加法器的输出信号改成4比特位宽,程序如下:
波形仿真如下:
可见当输出信号位宽下降时,不能完整的实现其功能,当输出值大于15之后就会出错。
2.把加法器的输入信号改成8比特位宽,程序如下:
仿真波形图如下:
可见其输出时延稍大于4输入的无符号加法器。
实验六.
- 把加法器的输出信号改成4比特位宽,编译,波形仿真。观察输出结果,观察输出结果在什么时候是正确的?。
- 把加法器的输入信号改成8比特位宽,编译,波形仿真。观察加法器的输出延迟,和4比特输入位宽的情况对比,你有什么结论,为什么?
1.把加法器的输出信号改成4比特位宽:
2.把加法器的输入信号改成8比特位宽:
实验七.
-
不改变流水线的级数,把加法器的输入信号改成8比特位宽,编译,波形仿真,和不带流水线的情况对比一下,你有什么结论?
-
在8比特输入位宽的情况下,在输入上再添加一级流水线,观察编译和仿真的结果,你有什么结论?
分析:
纯粹的加法器是一堆组合逻辑门构成的,这些组合逻辑的计算延迟较大,如果加法器电路的前极或后级电路也是一个规模较大的组合逻辑,那么它们会和加法器电路合并成为一个更大的组合逻辑,从而带来更大的组合逻辑计算延迟。
每一个D触发器都有其所容许的最小的建立与保持时间,当两个D触发器之间的组合电路逻辑延迟变得更大的时候,会导致电路只能工作在更低的时钟频率,为了让电路能够工作在更高的时钟频率,需要用D触发器来把大块的组合逻辑分割为小块,这就是流水线技术。(建议自行Google 关键字 D触发器 建立与保持时间)
与不加流水线的加法器相比,带流水线的加法器即在加法器的输入与输出都连接了D触发器,有效的减少了组合逻辑的竞争与冒险,从而明显减少了“毛刺”的长度。而流水线的级数越高,毛刺也随之越短,但输出的时延也会相应的多一个时钟周期。
1.不改变流水线的级数,把加法器的输入信号改成8比特位宽,代码:
与不加流水线的加法器相比,带流水线的加法器即在加法器的输入与输出都连接了D触发器,有效的减少了组合逻辑的竞争与冒险,从而明显减少了“毛刺”的长度。
2.在8比特输入位宽的情况下,在输入上再添加一级流水线:
可以发现流水线的级数越高,毛刺也随之越短,但输出的时延也会相应的多一个时钟周期。
实验八.
- 改变乘法器的输入位宽为8比特,编译,波形仿真,观察信号毛刺的时间长度。
- 选一款没有硬件乘法器的FPGA芯片(例如Cyclone EP1C6)对比8比特的乘法器和加法器两者编译之后的资源开销(LogicCell的数目)
- 编写一个输入和输出都有D触发器的流水线乘法器代码,编译后波形仿真,观察组合逻辑延迟和毛刺的时间,和不带流水线的情况下对比。
1.改变乘法器的输入位宽为8比特,编译,波形仿真,观察信号毛刺的时间长度。
2.选一款没有硬件乘法器的FPGA芯片(例如Cyclone EP1C6)对比8比特的乘法器和加法器两者编译之后的资源开销(LogicCell的数目)
乘法器资源消耗
加法器资源消耗
3.编写一个输入和输出都有D触发器的流水线乘法器代码,编译后波形仿真,观察组合逻辑延迟和毛刺的时间,和不带流水线的情况下对比。
实验九
- 设计一个最简单的计数器,只有一个CLK输入和一个OVerflow输出,当计数到最大值的时钟周期CLK输出1
- 设计复杂的计数器,和本例相似,带有多种信号,其中同步清零CLR的优先级最高,使能EN次之,LOAD最低。
1.设计一个最简单的计数器,只有一个CLK输入和一个OVerflow输出,当计数到最大值的时钟周期CLK输出1
2.设计复杂的计数器,和本例相似,带有多种信号,其中同步清零CLR的优先级最高,使能EN次之,LOAD最低。
实验十
设计一个用于识别2进制序列“1011”的状态机
- 基本要求: 电路每个时钟周期输入1比特数据,当捕获到1011的时钟周期,电路输出1,否则输出0
使用序列101011010作为输出的测试序列 - 扩展要求:给你的电路添加输入使能端口,只有输入使能EN为1的时钟周期,才从输入的数据端口向内部获取1比特序列数据。
实验分析:因为要捕获的是“1011”序列,从最低位开始进行匹配,匹配成功跳转到下一状态匹配更高一位,只要有一位匹配错误就应该跳转至状态0重新开始。而加上使能信号后,只有EN为1才从输入端读入输入数据进行匹配。 - 状态跳转逻辑表:
当前状态 | 输入 | 次态 |
---|---|---|
ST0 | IN==0 | ST0 |
ST0 | IN==1 | ST1 |
ST1 | IN==0 | ST2 |
ST1 | IN==1 | ST0 |
ST2 | IN==0 | ST0 |
ST2 | IN==1 | ST3 |
ST3 | IN==0 | ST0 |
ST3 | IN==1 | ST4 |
ST4 | DONOT CARE | ST0 |
- 输出逻辑表:
当前状态 | 输出OUT |
---|---|
ST0 | 0 |
ST1 | 0 |
ST2 | 0 |
ST3 | 0 |
ST4 | 1 |
代码及仿真波形图如下:
实验十一
设计一个如本节“电路描述”部分的“带加载使能和移位使能的并入串出”的移位寄存器,电路的RTL结构图如“电路描述”部分的RTL结构图所示。
实验分析:所谓“串入并出”的移位寄存器,及输入一个1位输入信号,移位寄存器将这个一位数据存入第0位,并将原本的后3位一同前移1位,最后从高到低并行输出四位数据。而“并入串出”的移位寄存器是指,输入一个4位输入信号,存入移位寄存器,若移位使能有效,则将最高位输出,移位寄存器后三3同时前移1位,最低位存入0;若加载时能有效,则从输入端重新读入4位数据。