EDA:quartus II 13. 1
平台:CycloneV:5CSEMA5F31C6
阅读“《自己设计制作CPU与单片机》 ---- 姜咏江”
个人笔记中的文字表达极差。读书后为此次笔记对应的quartus II 13.1工程register的保存地址:to_registers。
2015.06.05 – 06.08
ey_register版本寄存器来自笔记者手笔。dffe版本寄存器来自书本。还不能根据需求从0笔记到寄存器。
【1】逻辑函数
1位暂存寄存器的功能大概是这样:
Figure 1. 1位暂存寄存器真值表
将具有这样功能的暂存寄存器别名为ey_register。根据真值表得到对应的逻辑表达式:qn+1= !e·qn + e·d。
【2】原理图
在quartusII工程中新建ey_register.bdf文件,用quartus II的库(~\altera\13.1\quartus\libraries\primitives\logic)中的逻辑门符号描述ey_register的逻辑表达式(已经是最简)。得ey_register的电路描述图:
Figure 2. ey_register寄存器门级描述图
在quartus II 中,导线若拥有相同的名字则表示它们是连接关系。保存ey_register.bdf文件,将其设置为顶层文件。在quartusII中编译ey_register.bdf(Processing>> Start Compile)直至通过。
【3】功能仿真
在quartus II工程中新建ey_register.vwf文件,作为ey_register原理图的功能仿真文件(认识FPGA Verilog HDL笔记中含有为原理图建立功能仿真的过程)。设置: e引脚的信号的周期为诸如120ns的值,d引脚的信号的周期为诸如60ns的值,在Edit >> Set end time中将仿真结束时间设置为诸如600ns的值。点击Simulation >> Run Functional Simulation对ey_register进行功能仿真,得到下图(前2个周期):quartus II功能仿真模块证明了ey_register在理想情况下(不考虑器件延时等因素)的正确性。
在quartusII工程中封装ey_register.bdf中的逻辑设计图:Project Navigator >> Files,选中ey_register.bdf文件。File>> Create/Update >> Create Symbol Files for current Files生成ey_register.bsf:
Figure 4. ey_register封装
ey_register.bsf为ey_register版本的1位寄存器的封装图(在工程根目录下保存有.bsf文件时quartus II才能发现工程其它目录下的.bsf文件)。
将ey_register8.bdf设置为新的顶层文件,对其进行编译、功能仿真。
在quartusII中对ey_register版的8位寄存器进行封装,利用这个封装可以得到位数更多诸如32位的寄存器。
由ey_register得来的n位寄存器可用于简单的场景中。可将根据ey_register.bdf或ey_register8.bdf编译得到的二进制文件下载到FPGA(CycloneV:5CSEMA5F31C6)平台中进行验证(开关作为输入,LED灯作为输出,my_first_fpga和 DE1-SOC中FPGA的流水灯笔记中含有针对FPGA平台的引脚分配的过程)。
ey_register版的寄存器不具有“时钟控制”、“边沿触发”、“预置”等特色。用ey_register设计的寄存器不能被用到复杂的环境中(如CPU中)。若有一些简单的应用环境,被设计的寄存器也可能像ey_register一样简单。待环境逐渐变得复杂后,寄存器的结构由运行环境的需求而变得复杂。
dffe是quartusII库中(~\altera\13.1\quartus\libraries\primitives\storage)被设计好的一个基本的存储元件的封装。由dffe可以设计出常被念叨的16或32位寄存器。
quartus II库中的dffe封装如下(原谅忽然冒出一个dffe):
Figure6. dffe 封装
dffe功能(简述):ENA= 1且CLK上升沿时,Q= D,否则Q保持不变。PRN和CLRN作预置(设定Q最开始的状态)Q状态之用,PRN为0时,Q输出1;CLRN为0时,Q输出为0。dffe具有1位暂存寄存器的功能。
根据dffe功能的简述,在quartusII工程中新建dffe_register8.bdf文件,在其中设计8位寄存器(每位独立,共用CLK,ENA,PRN,CLRN):
Figure8. 每个dffe位的连接II
将dffe_register8.bdf设为顶层文件,编译。新建dffe_register8.vwf文件仿真dffe_register8.bdf文件中的设计。以下是仿真结果。
【1】CLK上升沿 && ENA控制触发Q的值为D 否则Q保持不变
Figure9. dffe随D改变的条件
【2】 dffe预置端不受时钟控制
Figure10. 预置dffe寄存器初值为0
在CLK上升沿到来之前,CLRN= 0让dffe_register8初始值为0。根据(封装的)dffe_register8,可以继续得到诸如32位的寄存器。
突然冒出来的dffe,只伴随着对其功能进行简述(模糊)的描述,不足以给人留下深刻印象以至于让人做出正确的dffe_register8.vwf文件,或被正确地拿去作设计。刨一下dffe有助于更好的理解寄存器的组成(或者其它概念、背景)。笔记还无法解释忽然冒出来的东西(如RS触发器,它的诞生或许是某个前辈发现像ey_register这样的寄存器版本根本满足不了实际设计需求,然后拿起笔在草稿纸上乱画,流了些汗水后没注意就把RS触发器斗出来了)。
【1】 RS触发器
以下是RS触发器的结构。
Figure11. RS触发器结构(AD 10)
停在数字电路的层面去理解RS触发器(莫一不小心进入了模电区域):
[1] 三极管G的ec两端有适当电压时,b为高时G导通;(晶体管导通时电阻很小)
[2] R1、R2用来给晶体管的ec两端提供适当电压;R1和R3、R2和R4将保证晶体管b端的电压(Q或Q’为高时,b端电压为高)。
K1和K2同时关闭,RS触发器的工作过程:
[1] R和S断开时,Q和Q’都为高电位(1),这使得G1、G2导通;G1、G2导通使得Q和Q’变成低电位(0),这使得G1和G2不导通;G1、G2的不导通使得Q和Q’变成高电位……在R和S均断开的情况下,RS触发器的Q和Q’端处于高低电位不断变化状态,表现出不稳定的状态。
[2] S=R=0时,G1和G2截止,Q=Q’=1;当同时断开R和S时,RS触发器的状态同[1]。
[3] S=R=1时,G1和G2导通,Q=Q’=0;当同时断开R和S时,RS触发器的状态同[1]。
[4] 瞬间S=1时,G1导通,Q’=0,从而使得G2的b端为0,Q=1;Q=1使得G1的b端在断开S的情况下仍旧为1,所以Q’=0且Q=1得到保持。
[5] 瞬间R=1时,G2导通,Q=0,从而使得G1的b端为0,Q’=1;Q’=1使得G2的b端在断开R的情况下依旧为1,所以Q’=1且Q=0得到保持。
[6] S=1且R=0时,同[4];R=1且S=0时,同[5]。
RS触发器被利用的是[4]和[5]中表现出来的特性。[4]和[5]不仅能够让RS处于一个稳定的状态,还能够依据R或S的一个瞬间的值就改变Q和Q’的状态,之后,就算R和S断开,RS触发器也能够保持原来的状态。
【2】 D型触发器
为了避开RS触发器的不稳定状态,可以让输入R和S的值相反,得到D型触发器。
Figure12.D型触发器
D=0(瞬间或长久),Q=1且Q’=0;D=1(瞬间或长久),Q=0且Q’=1。
【3】时标D触发器
在D触发器中加一个具有一定周期T的输入CLK,只有当CLK为1时D才能送到D触发器的输入端。这样,只要在CLK为1时D输入已经准备好,那么Q和Q’的变化也是以T为周期变化(这是为什么叫时标触发器的原因吧)。
Figure13. 时标D触发器
图中的TRI为三态门符号,当CLK为1时,TRI输出端同输入端,否则三态门的输出端和输入端成断开状态---- 高阻状态(即使RS端断开,RS也能够保持前一时刻状态)。因为CLK成周期变化,所以让RS触发器的输出也成周期变化,时标触发器的名字诞生。
【4】边沿D触发器
时标的目的是让触发器输出成周期T变化,如果CLK为1的时间长到T1,D信号在T1这段时间内变化了n次(高低电位变化),那么RS触发器的Q和Q’也会变化n次,那么在周期T内,触发器输出至少变化了n次,没有达到一个周期T触发器输出变化一次的目的。为了达到这个目的,可以将CLK为1的时间缩短为T1d,短到一瞬间。
Figure14. 边沿时标D触发器
RC电路充放电的微积分方程在大一的《电路原理》课程中有介绍,如果课本中没有解的图像变化,请看这里(也可以用matlab画一下解的曲线)。上图的CLK周期依旧可以为T,但只有在CLK的每个周期中从0变化到1的瞬间(上升沿)三态门才被打开。在时标触发器中,CLK周期为T,三态门被打开的时间为T1,T1可能能够对应连续变化的好几个D的状态(高低电位转换);在这里,CLK周期为T,三态门被打开的时间为CLK从0变到1的瞬间(上升沿,具体时间跟RC的值有关)T1d,这就让T1d(几乎)只能对应D的一个状态。这样就能够保证RS触发器以周期T接收D的输入,不接收D在周期T内变化的电位状态。
【5】带预置端的边沿D触发器
RS触发器的初始状态是不稳定的,RS进入稳定状态需要在CLK的控制下给R或S端给一个电位。或许是考虑到用R或者S端给RS触发器一个初始值会浪费一个时钟,就增加了预置边沿触发器的功能。
Figure15. 预置边沿触发器
PRN和CLRN不受时钟控制。PRN=0,Q=1且Q’=0;CLRN=0,Q=0且Q’=1。带预置端的边沿触发器在quartusII中的元件库中的名字为DFF。
【6】 dffe
带预置端的边沿触发器(DFF)在以周期T的时间间隔接收D输入使得Q跟着变化(Q=D),DFF不能将数据(Q)保持任意长的时间(不掉电的情况下)。这就回到了ey_register的那个逻辑函数:如果不让DFF接收新D的输入就保持触发器的输出Q不变。同ey_register相比,只需要将DFF的Q作为qn即可。
Figure 16. dffe
为了能更好的利用dffe,刨了一下dffe。笔记也跟随众书下一个结论:锁存器是构成触发器的良好选择,触发器是构成寄存器的良好选择。像ey_register也可以被叫作寄存器,但其各方面没有由触发器构成的dffe好。
【7】三态门
三态门是一个输入端到输出端的开关。
Figure17. 三态门结构体
当E=0时,O1和O2的都为0,G1和G2都截止,B处于断开状态。
当E=A=1时,O2为0,G2截止,O1为1,G1导通,B为1;当E=1,A=0时,O2为1,G2导通,B为0,同时O1为0,G1截止。
【8】逻辑门
在数字系统中,逻辑门似乎是最“底层”的器件,逻辑门的封装屏蔽了(模电)器件的特性而只与逻辑系统相对应。以逻辑门为基础的数字设计,能让设计者只执笔于逻辑的设计。其实逻辑门是由(模电中的)晶体管、电阻等基本元件构成的。比如:Figure18. 基本逻辑门的组成
站在数字逻辑的角度上理解逻辑门的组成,不必深究具体器件特性。如对于D,只需要理解输入为高时导通,否则截止;对于Q,只需要知道在有合适的Vec情况下,b为高时Q导通,否则截止。电阻在电路中起调节、保护晶体管的作用。
当然,如果深入了解了每个晶体管的特性,就可能可以尝试模电设计(CPU外围电路)了。
【9】晶体管
晶体管也是由人根据一些特殊材料发明制造的。简见百度百科。
2015.06.09– 06.11
用dffe作为移位寄存器的基本单元。
串入串移寄存器的描述:数据D从n(n>= 3)位寄存器的一端如高位端进入。第一个时钟上升沿到来时,第n位寄存器的输出端为D;第二个时钟上升沿到来时,第n-1位寄存器的输出端为上一时钟周期内的第n位寄存器的值,第n位寄存器的输出端为D;第三个时钟上升沿到来时,第n-2位寄存器的输出端为上一时钟周期内第n-1位寄存器的值,第n-1位寄存器的输出端为上一时钟周期内的第n位寄存器的值,第n位寄存器的输出端为D;……。像用一根线来传递数据的串口,串入串移寄存器可作为串口缓冲区寄存器。
根据serial_shift_register功能写一个逻辑表达式,则第i个时钟上升沿则为Qj= Qj+1(n - i - 1 <= j <= n - 2)且Qn-1=D(第n位寄存器的输出端记为Qn-1)。因为serial_shift_register中的每一位只与上一位寄存器有关系,2位serial_shift_register可以作为串入串移寄存器的最小单元。可以利用2位serial_shift_register的封装得到4、8、16、32、64位的串入串移寄存器;也可以在2位serial_shift_register的基础之上再加1个dffe得到3位的串入串移寄存器。
在quartusII工程中新建serial_shift_register2.bdf文件,根据serial_shift_register的逻辑表达式得serial_shift_register2电路描述图:
Figure19. 2位串入串移寄存器
在quartus II中将serial_shift_register2.bdf设为顶层文件,编译。新建serial_shift_register2.vwf文件,对serial_shift_register2.bdf中的电路设计进行功能仿真。结果如下:
Figure20. serial_shift_register2功能仿真
能说明serial_shift_register2移位的是后两个红色方框的内容。
串入串移寄存器通过移位的方式让每一位依次拥有值。并入串移寄存器是指此寄存器既能够像暂存寄存器那样每位都能够被同时赋值,被赋值后的寄存器也能够被移位。
给每一位寄存器设计一个选择赋值或移位的模块2t1。其功能描述为:当e端使能,则给寄存器赋值,否则寄存器的值来自移位。用真值表将此功能描述出来:
Figure21. 2t1的真值表
根据2t1的真值表得到2t1的逻辑图:o= !e·s + ed(e=0时,o与d数据无关;e=1时,o与s端数据无关)
Figure22.logic_2t1逻辑图
在2t1描述的电路图中,e=1且d断开且s=0时,o=0(本应为d断开状态,不过先就这样将就将就,遇到这种情况时再来完善2t1)。
利用2t1的封装跟1位dffe组成一个2选1输入给dffe的d数据端的元件pissr1:
Figure23. 2选1输入到dffe的元件原理图
pissr1功能仿真结果如下:
Figure24. pissr1仿真结果
pissr1在e= 1时,q=d;e=0时,q=s。(其它输入输出引脚含义见dffe或者2t1)。
按照“串入串移”寄存器的逻辑表达式,如果将pissr1的s端作为寄存器移位的接收端,在e=0的情况下可以用pissr1构成n位的移位寄存器。而且,在e=1时,每位寄存器还能够同时接收来自d端的数据。先用pissr1的封装构成2位的右移寄存器:
Figure26. pissr2 原理描述图II
pissr2的功能仿真如下:
Figure27. pissr2仿真
clk上升沿到来时,ena=1时:e=1时,pissr2接收d端数据,pissr2被赋值;e=0时,pissr2向右移一位,高位补0(s=0)。ena=0时,pissr2保存原来的数据。
n位并入串移寄存器的连接方式(逻辑函数)同pissr2。
对于以dffe为基础的寄存器,其功能是“暂存”还是“左右移”关键看dffe的D端的数据来源(pissr1中dffe的D端具有暂存和右移的数据来源)。
若要让寄存器具有“暂存”、“左移”及“右移”功能模式,那么每位寄存器要能够选择3个数据来源(这3个数据来源分别与“外部数据端”、“相邻高位寄存器输出端”、“相邻低位寄存器输出端”相对应)。在使能寄存器D端接收外部数据(相邻高位寄存器、相邻低位寄存器)时,寄存器对应暂存(右移、左移)功能模式。
【1】 3选1电路
根据2t1的步骤斗一个three21出来。three21真值表如下:
Figure28. three21真值表
根据真值表得three21逻辑表达式:o= !s0·!s1·d+ s0·!s1·r+ !s0·s1·l。(不太清楚这是否为最简逻辑表达式)根据o的逻辑函数式得到three21的逻辑电路描述图:
Figure29. three21逻辑电路描述图
验证three21电路描述图的.vwf仿真图形:
Figure30. three21功能仿真图形
【2】具有3选1输入的1位dffe
同pissr1,具有选择3数据输入的1位寄存器pirls1:
Figure31. pirls1电路原理图描述
针对选择pirls1电路各输入的仿真:
Figure32. pirls1功能仿真
【3】n位并入左右移寄存器
只要按照pirls1的引脚功能,将n个寄存器连接在一起,在s0和s1的控制下就可以得到n位并入左右移寄存器。利用pirls1组合一个3位的并入左右移寄存器:
Figure33. pirlsr3电路描述图
rh为3位寄存器右移时最高位所补的值;ll为3位寄存器左移时最低位所补的值。
pirls3电路的仿真过程:
Figure34. pirlsr3功能仿真
2015.06.12
在硬件描述语言Verilog HDL中,用关键字register与寄存器相对应。在Verilog HDL程序中,若要使用寄存器,只需在程序中用register关键字定义一个实例(变量)即可,编译器根据实例的上下文会决定其具体的类型(暂存、串移还是左右移寄存器)并生成与寄存器类型一致的硬件电路描述图(或配置FPGA的二进制流)。但,了解一下肚子肠子可能有利于了解美女本质。
古时有纸上谈兵,此时是电脑上谈寄存器。与在战场上厮杀活下来的相差一大截。
[2015.06.12-09:56]