五位纽环计数器
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
五比特纽环计数器设计
一、设计要求:
用D触发器来设计一个五比特纽环计数器要求用观察其计数器序列;2)列出至少三个制约系统正常工作的最高频率的因素;3估计系统的最高工作频率。
二、设计原理:
纽环计数器又叫作约翰逊计数器,五位纽环计数器由五个D触发器构成,后四位D触发器的输入由分别由前一个的触发器的输出作为输入,而最高位的输入由最低位的输出经过反向后输入,因此五位纽环计数器的有效状态位有2n个(这里n=5)所以有十个有效状态,所以有32-10=22个状态是非法的。我们使用五位计数器就是要使它在正常状态中工作,才能达到理想的工作状态,如果进入了非法状态,那么计数器就不能正常工作了。所以要使(B’00000’)成为初始状态这样才能使得计数器进入非法状态后经过初始才能使计数器回到正常状态中去。因此根据这个原理我们可以建立初步的设计思想。
三、实验过程
首先根据设计要求对五位纽环计数器的工作状态进行分析,通过计算可以得出该计数器有以下几个有效状态:
纽环计数器的真值表
根据上面的真值表利用AHDL硬件设计语言就可以在QuartusⅡ软件中进行设计。在设计中除了需要满足正常状态的循环计数以外,我们还应该注意计数器进入非法状态后的工作情况,如果进入非法状态系统就不会回到正常工作状态了,这就需要在设计过程中对非法状态进行编程,以便使得系统进入非法状态后能自动回到正常状态。这可以运用AHDL中的CASE语句,把非法状态区分。(程序见附表)
编程工作完成后就需要进行编译,运用QuartusⅡ软件中的编译工具可以对设计进行编译来检查所编程序的正确与否以便及时修改。
编译成功后下一步就是仿真,来验证设计是否满足题目所提出的要求。在设计中Mem[]表示触发器的输出,T0—T9表示计数器在各有效状态时产生的脉冲,这可以作为计数器的解码器表示计数器计数到了那个状态。的通过仿真图可以看见Mem[]的确是按照真值表的内容输出的,T0—T9在每个状态时有且只有一个脉冲输出。可见设计是满足题目需要的。
在仿真波形图中我们可以看到若计数器工作在正常循环状态,那么解码器就可以输出瀑布型脉冲来显示当前计数状态。我们可以借此来进行逻辑控制。
作为设计最终我们要投入实际工作,所以要对设计工作状态进行必要的时序分析。作为计数器我们要关心它的最大计数频率。因此利用时序分析工具可以看到最大工作频率。
由下图可以看见该计数器工作的最大频率为422.12MHZ
四、试验结论:
五位纽环计数器是一种较为简单的逻辑控制的实现,可以根据当前的状态准确地控制下一状态。系统的状态被一系列的组合逻辑所驱动,所以它的工作只有在:输入的驱动功能(存储元件的输出)达到稳定;传播时延(这种时延决定于组合逻辑与存储元件的同步脉冲输出的的时延)之后才能达到稳定。根据分析这就是影响计数器最大频率的因素此外还有有:SU T (时钟建立时间)h T (时钟保持时间)CO T (时钟到输出延时)这几种时延的长短决定了最大工作频率。
通过本次试验,我具体进一步熟悉了Quartus Ⅱ软件的使用,初步掌握了编程技巧,加深了AHDL 语言的使用的熟悉程度。进一步了解了时序分析在硬件设计中的重要性。
附AHDL 源程序
SUBDESIGN 'twist5' ( clock :INPUT; Mem[4..0] :OUTPUT; T9,T8,T7,T6,T5,T4,T3,T2,T1,T0 :OUTPUT; )
V ARIABLE Mem[4..0] :DFF; BEGIN Mem[4..0].clk=clock; CASE Mem[4..0] IS WHEN B"00010",B"00100",B"01000" => Mem[4..0].d=B"00000";
WHEN
B"10100",B"10010",B"10001",B"01100",B"01010",B"01001",B"00110",B"00101" => Mem[4..0].d=B"00000";
WHEN
B"11010",B"11001",B"10110",B"10101",B"10011",B"01110",B"01101",B"01011" => Mem[4..0].d=B"00000";
WHEN B"10111",B"11011",B"11101" =>
Mem[4..0].d=B"00000";
WHEN OTHERS =>
Mem[3..0].d=Mem[4..1].q;
Mem[4].d=!Mem[0];
END CASE;
% GENERATE T0 to T9%
IF (Mem[4..0]==B"00000") THEN
T0=VCC;
ELSE T0=GND;
END IF;
IF (Mem[4..0]==B"10000") THEN
T1=VCC;
ELSE T1=GND;
END IF;
IF (Mem[4..0]==B"11000") THEN
T2=VCC;
ELSE T2=GND;
END IF;
IF (Mem[4..0]==B"11100") THEN
T3=VCC;
ELSE T3=GND;
END IF;
IF (Mem[4..0]==B"11110") THEN
T4=VCC;
ELSE T4=GND;
END IF;
IF (Mem[4..0]==B"11111") THEN
T5=VCC;
ELSE T5=GND;
END IF;
IF (Mem[4..0]==B"01111") THEN
T6=VCC;
ELSE T6=GND;
END IF;
IF (Mem[4..0]==B"00111") THEN
T7=VCC;
ELSE T7=GND;
END IF;
IF (Mem[4..0]==B"00011") THEN
T8=VCC;
ELSE T8=GND;
END IF;
IF (Mem[4..0]==B"00001") THEN
T9=VCC;
ELSE T9=GND;
END IF;
END;