FPGA的基本结构
FPGA是可编程逻辑单元:
1 可编程IO单元
2 可编程逻辑单元:LUT和寄存器。通过LUT实现组合逻辑
3 丰富的布线资源:包括专用布线资源,长线资源,短线资源
4 嵌入式块RAM: 可以配置为单端口RAM,双端口RAM,fifo等
5 底层嵌入式功能单元:DSP PLL等
6 内嵌专用硬核:通用性较弱的硬核
通信协议
1 UART
异步半双工,RS232中最常用的是 八个数据位,无奇偶校验,一个停止位。
异步是指: 发送方发出数据后,不等待接受方发回响应,接着发送下个数据包的通讯方式。
接口信号有TX和RX,TX用于发送数据,RX用于接收数据。数据传输前,发送端和接收端都要设置一样的波特率。传输时,发送端先发出一个0表示起始位,后面跟着数据位,数据位的最后有一个奇偶校验位,最后有高电平的停止位(可以是1/1.5/2位),空闲位是1,表示没有数据传输。
2 SPI 四线
同步全双工
是一个主设备对应多个从设备。接口有CS(片选信号,用来选定通信的从设备. MOSI主输出从输入 MISO主输入从输出 SCLK时钟 cs片选信号
3 IIC:
同步半双工
只有一个时钟线SCL和一个数据线SDA。
比如A给B发数据,二者的时钟线和数据线要对应接好,最开始时钟线和数据线上的电平都是高电平,然后A发送端先把数据线拉低,等到数据线变成低电平后,再把SCL拉低(这两个动作构成了通信的起始信号),之后数据线SDA就可以发送数据了,同时时钟线发送脉冲,并且时钟线会在上升沿对数据线进行采样,
所以数据线必须在时钟线是高电平时保持有效,在低电平时发送下一个数据。
DMA
DMA(Direct Memory Access,直接存储器访问)
在实现DMA传输时,不需要通过CPU调度,是由DMA直接控制总线。是一种快速传送数据的机制。
即DMA传输前,CPU要把总线控制权交给DMA控制器,而在结束DMA传输后,DMA控制器应立即把总线控制权再交回给CPU。
-
请求:CPU对DMA控制器初始化,并向I/O接口发出操作命令,I/O接口提出DMA请求。
-
响应:DMA控制器对DMA请求判别优先级及屏蔽,向总线裁决逻辑提出总线请求。当CPU执行完当前总线周期即可释放总线控制权。此时,总线裁决逻辑输出总线应答,表示DMA已经响应,通过DMA控制器通知I/O接口开始DMA传输。
-
传输:DMA控制器获得总线控制权后,CPU即刻挂起或只执行内部操作,由DMA控制器输出读写命令,直接控制RAM与I/O接口进行DMA传输。
在DMA控制器的控制下,在存储器和外部设备之间直接进行数据传送,在传送过程中不需要中央处理器的参与。开始时需提供要传送的数据的起始位置和数据长度。
- 结束:当完成规定的成批数据传送后,DMA控制器即释放总线控制权,并向I/O接口发出结束信号。当I/O接口收到结束信号后,一方面停 止I/O设备的工作,另一方面向CPU提出中断请求,使CPU从不介入的状态解脱,并执行一段检查本次DMA传输操作正确性的代码。最后,带着本次操作结果及状态继续执行原来的程序
DMA传输方式无需CPU直接控制传输,通过硬件为RAM与I/O设备开辟一条直接传送数据的通路,使CPU的效率大为提高。
流水线
单指令周期处理器:
一条CPU指令的执行,由FDE三步组成。这个执行过程,至少需花费一个时钟周期。因为在取指令的时候,我们需要通过时钟周期的信号,来决定计数器的自增。
一个时钟周期可执行一条指令,CPI=1,看着就比执行一条指令要多个时钟周期性能好。这就是单指令周期处理器(Single Cycle Processor):一个时钟周期内,处理器正好能处理一条指令。
虽然CPI能够保持在1,但时钟频率却没法太高。太高,有些复杂指令没法在一个时钟周期内完成。在下个时钟周期到来,开始执行下条指令时,前一条指令执行结果可能还没写入寄存器。下一条指令读取的数据就不准确了。
无论是Intel CPU or ARM CPU,都不是单指令周期处理器,而是采用一种叫作指令流水线(Instruction Pipeline)的技术。
现代处理器的流水线设计
指令执行过程会拆分成“取指令、译码、执行”三步。
还包含从寄存器或内存读数据,通过ALU运算,把结果写回寄存器或内存。
CPU的指令执行过程,其实也是由各电路模块组成:
-
取指令时,需要译码器,把数据从内存取出来,写入寄存器
-
指令译码时,需要另外一个译码器,把指令解析成对应控制信号、内存地址和数据
-
指令执行时,需要一个完成计算工作的ALU。这些都是一个一个独立的组合逻辑电路,
这就不用把时钟周期设置成整条指令执行的时间,而是拆分成完成这样的一个一个小步骤需要的时间。
同时,每一个阶段的电路在完成对应的任务之后,也不需要等待整个指令执行完成,而是可以直接执行下一条指令的对应阶段。
这样的协作模式,就是指令流水线。这里每个独立步骤,称为流水线阶段或流水线级(Pipeline Stage)。
把一个指令拆分成“取指令-指令译码-执行指令”三部分,那这就是一个三级流水线。
进一步把“执行指令”拆分成“ALU计算(指令执行)-内存访问-数据写回”,就变成一个五级流水线。
五级流水线:同一时钟周期里,同时运行五条指令的不同阶段。这时,虽然执行一条指令的时钟周期变成5,但可提高CPU的主频。
无需确保最复杂那条指令在时钟周期里执行完成,只要保障一个最复杂的流水线级操作,在一个时钟周期内完成即可。
若某一操作步骤时间太长,可考虑把该步骤拆分成更多步骤,让所有步骤需执行时间尽量差不多长。这就可解决在单指令周期处理器中遇到的,性能瓶颈来自最复杂的指令的问题。
像ARM或IntelCPU,流水线级数都已到14级。
虽然不能通过流水线,减少单条指令执行的“延时”指标,但通过同时在执行多条指令的不同阶段,提升了CPU的“吞吐率”。
低功耗
功耗主要分为三部分,分别是浪涌功耗、静态功耗和动态功耗。 在进行IC设计时一般不需要关注浪涌功耗。
功耗的组成:
动态功耗有switching power翻转功耗(充放电电容引起的。和负载电容、电压、01翻转的频率、时钟频率有关)、short circuit power短路功耗(瞬时的短路引起的,比如说反相器,输入信号翻转时,中间会有很短的时间PMOS和NMOS同时导通,形成短路电流。和电压、MOS管的阈值电压、01翻转的频率有关);
动态功耗是指由于逻辑转换所产生的功耗。
静态功耗是因为漏电流引起的,亚阈值状态下MOS管的漏电流。栅极漏电流(因为工艺方面,栅极不是完全绝缘的,从栅极到衬底有一部分漏电流
各部分功耗的降低方法:
动态功耗:
翻转功耗------降低电压、降低01翻转的频率、降低时钟频率、减小负载电容
短路功耗------降低电压、降低01翻转的频率、降低时钟频率、选用阈值电压更大的MOS管。
动态功耗:
动态功耗是指由于逻辑转换所产生的功耗。
1 合理规划芯片的工作模式,通过功耗管理模块控制芯片各模块的Clock,Reset信号起到控制功耗的目的。
2 门控时钟,有效降低动态功耗
在数据无效时,将寄存器时钟关闭的技术
3 多电压供电:通过控制模块的电压降低功耗
动态功耗与供电电压成正比,因此降低供电电压可以有效的降低功耗。
4 多阈值电压:对性能要求较高的电路使用低阈值电压单元,对功耗要求较高的电路使用高阈值电压单元。
5 寄存器传输级降低功耗技术:优化代码来实现。如选择合适的编码:格雷码。
数字ic设计流程
制定设计需求
要进行系统级设计,
就要进行前端设计Synopsys 的VCS--对RTL做功能仿真,Cadence--逻辑综合,RTL代码转化成门级电路,Design Compiler生成网表文件。--STA静态时序分析,套用一些时序模型来针对电路分析有没有时序为例--
就把网表文件给后端
后端最终会生成GDSII格式的文件,就可以找工厂流片了,流片回来的demo要再做测试。
逻辑综合的流程
逻辑综合是将RTL电路转换成基于具体工艺库的门级网表。
1. 转译:把电路转换成EDA内部数据库,这个数据库跟工艺库是独立无关的;
2. 优化:根据工作频率、面积、功耗来对电路进行优化,进而推断出满足设计指标要求的门级网表
3. 映射:将门级网表映射到晶圆厂给定的工艺库上,最终形成该工艺库对应的门级网表。
工作频率 面积 功耗来进行优化
DC逻辑综合的流程:
1 预综合过程:启动DC -> 设置各种库文件(link_library, target library, symbol library) -> 创建启动脚本文件 -> 读入设计文件(analyze, elaborate, read_file) -> DC中的设计对象 -> 各种模块划分 -> Verilog的编码
2 施加设计约束:设计环境约束
3 设置时序约束
-
设计综合
-
后综合