首先叠个甲,这里是课程笔记,如果觉得侵权请联系删帖。数字IC/数字电路/FPGA设计_从入门到精通。
接下来可能不会再更新此课程的笔记,因为可能涉及到侵权的问题,数字IC设计入门,学习老师的东西确实十分全面,我并没有主动给老师打广告的意思(侧面可能帮老师做了宣传,希望老师不要寄律师函),笔记是自己辛苦总结的。
也希望能够点赞、收藏啥的,希望无私的付出能得到你的肯定!
目录
2.设计需求分析—BIN2BCD设计说明(specification)—完成第①步
1.设计思路
设计是由设计思想决定的,重点是规划好再设计!
设计思想:为什么会给出三种设计方法?因为需要多种方案对比才知道方案最优!因此尽可能要想到多种方案,优缺点列出来,然后根据设计需求选择最合适的方案!
2.设计需求分析—BIN2BCD设计说明(specification)—完成第①步
1.设计说明
BCD码——二进制表示的十进制编码
2.模块IO定义(理论上在第③步中完成)
①理论上先进行算法模型与优化,这个小例子反一下,先统一IO方便验证设计对错
因为对于一个不清楚的IP,理论上是先有算法,然后根据算法知道有什么输入得到什么输出,数据是从ddr还是从memory来,才能分析出它的IO。
②做了框图(block diagram)后,通常需要写一个IO的excel表,将信号的方向(I输入O输出)、信号的bit数、信号的作用,都详细的写清楚
3.示例波形
至此完成了整个IP设计的需求分析!!!
3.算法模型与优化(不是接口协议类问题)—完成第②步
2.算法思路及coding
简化:思考出算法后,查看sky的思路,实现他完成coding思路的RTL coding 和 仿真——再做对比和反馈!
1.查表法
RAM的深度是有多少个格子,宽度是一个格子可以放多少bit的数据,总容量是深度×位宽。
综上,如果不差表的千位,则Ram深度为1024,位宽由17位,去掉1位符号位(可以自己在电路中决定)、去掉千位的4位(通过比较器无需在Ram中查千位),只需要位宽12位。即RAM的大小为1024*12。
查表法PPA分析
2.除法
!!!这怎么没想到?十进制数——不断的除10取余,不就把千位、百位、十位、个位的BCD码得到了!因为给我的是一个11的有符号二进制数,所以没直接想到转换为十进制数,直接对应相应的千位、百位、十位、个位的BCD码!
除法PPA分析
取余操作、除法操作都是用到除法器,都是一堆减法器穿行起来实现除法,没有CSA做电路结构优化得到类似Wallace Tree。因而电路面积比较大,速度慢。 但是比查表法的Ram应该会小一点。
3.穷举法
bcd码的每一位,如百位——只能是0 1 ... 8 9一共十种情况中的一种。 思想:不知道就进行比较和猜测。
4.还有别的算法吗?
要保持怀疑态度——才能得到最好的设计方案!
4.Cycle级pipeline结构分析与举例
1.pipeline介绍
pipeline划分的需求,思路一:直接一个周期输入输出——达不到频率要求。 思路二:在多个周期内,只处理一次bin输入,此时不接收行的bin输入——相当于串行逻辑,效率低。
流水线优点——Pipeline好处有二!!!:
①对比串行的实现方式,串行每N个周期才能输入一个数据,电路频率(电路延时)和流水线是一样,但流水线能提高吞吐率。 ②使用纯组合逻辑实现方式,一个周期算出来bin到bcd的输出,吞吐率是上去了,但电路延迟会很大,时钟频率提不上去。(一个周期做的事情很多—占用的时长会很大—频率低) 而pipeline方式,每个周期都能接一个输入,N周期后能一个一个输出,吞吐率和时钟频率都比较高。 总结:①对比串行方式,提高了吞吐率。②对比纯组合逻辑方式,提高了时钟频率。
HZ和S是倒数关系,1s = 1hz,1ms = 1000hz = 1khz,1μs = 10^6hz = 1Mhz 1ns = 10^9hz = 1000Mhz!!! 10ns = 1000/10 = 100Mhz, 20ns = 1000/20 = 50Mhz
答:上面的pipeline结构不正确 多个信号是需要同时有效的,但有的信号是在第一个cycle使用(如s0选择输出),而有的信号是在第二个cycle使用(如s1选择输出),很容易忘记对第二个周期使用的信号做pipe,会导致功能出错!!!——刚开始做pipeline最容易犯的错误!
2.几种方案的pipeline划分
如何判断电路pipeline是高效的?:去看每个时钟周期是否都在做有效的计算,没有间隔。
1.查表法
2.除法
3.穷举法——电路图和pipeline划分
注意:减法电路900 800 700....是并行电路,都在减,9个减法器是并行运算,但是选择器存在优先级,先判断900。
完整的电路结构,寄存器就插在虚线的地方,用于Pipeline划分
脑海中对电路结构的大概认识:
1.千位有一个减法器,选出千位的bcd码和剩下的绝对值。
2.百位有9个并行的减法器,会同时进行减法运算,但通过10选1的优先级mux会选出百位的bcd码,并得到剩下的绝对值......(通过这里反推——代码判断if—else if,都会判断和执行里面的代码?——应该是DC工具进行了优化,使得电路更合理?)
因而有了电路结构的大概认识,coding才是自然而然的事情!