实验六 计数器与序列检测器的仿真
一、实验内容
1.用VHDL语言设计一个按余3码顺序计数的计数器,并进行仿真与分析; 2.用VHDL语言设计一个?1101001?位串的序列检测器,并仿真与分析。 二、实验要求
1.进实验室前,请写一份预习报告;进实验室时经指导老师检查后,才可上机操作。
2.预习报告内容有:
用VHDL语言编写余3码计数器程序;
用VHDL语言编写?1101001?序列检测器程序。
3.在文本编辑区使用VHDL硬件描述语言设计逻辑电路,再利用波形编辑区进行逻辑功能仿真,以此验证电路的逻辑功能是否正确,最后在实验箱上进行下载验证。
4.实验结束前,由指导老师检查了仿真波形和实验箱上的实验结果后方可离开。
三、电路功能介绍
1、计数器
计数器: 一般来说,在状态图中包含有一个循环(见下图)的任何时钟时序电路都可称为计数器。
计数器的模是指在循环中的状态个数。
一个有m个状态的计数器称为模m计数器,有时也称为m分频计数器。如果一个计数器的模不是2的幂,就会有多余状态,在正常工作时是不用这些状态的。
最常用的计数器可能就是n位二进制计数器。这样的计数器有n个触发器及2n
1
种状态,这些状态的循环顺序是0, 1, 2, ..., 2n-1, 0, 1, ...。其中,每一种状态都被编码成对应的n位二进制整数。
行波计数器:当某一位由1变到0,这一位就会向高位产生一个进位,由低位到高位,每次传送一位,如T触发器。
同步计数器: 所有的触发器都共用一个CLK信号,在经过仅仅tTQ纳秒的延迟后,所有的触发器的输出都同时变化,它包括两种结构:同步串行计数器和同步并行计数器。
1.同步串行计数器:采用一个主计数使能信号CNTEN来实现控制。每一个T触发器要发生翻转的充要条件是CNTEN信号有效且所有的低阶计数位都为1,同步n位二进制计数器的每一位都可以用一定数量的逻辑元件来实现,它的缺点是组合型的使能信号由最低位到最高位串行传送,如果时钟周期太短的话,计数器LSB(最低位)的变化可能来不及传送到MSB(最高位)。
2.同步并行计数器:每一个EN输入都用一个专门的与门来驱动,这样,CNTEN信号到达各个触发器的EN输入端只需要经过一级逻辑电路,它是最快的二进制计数器的结构形式。
2
2.序列检测器
应用状态机的概念设计一个序列检测器,以?1110010?序列检测器的设计为例。该序列检测器收到一组串行码(1110010)后输出检测标志为‘1’,否则为‘0’。
3
一、计数器
1. VHDL语言实现
library ieee;
use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity count is
port(clk,clr,en:in std_logic;
a:out std_logic_vector(3 downto 0); cout:out std_logic); end count;
architecture bhv of count is
signal b:std_logic_vector(3 downto 0); begin
process(clk,clr,en,b) begin
if(clr='1') then b<=\elsif(clk'event and clk='1') then if(en='1') then
if(b<\ else b<=\ end if; end if; end if;
if(b=\else cout<='0'; end if; a<=b; end process; end bhv; 2. 波形仿真
4
3. 逻辑图
clrb[1..0]PREDQ4' h1 --ENACLRADDERA[3..0]B[3..0]Add0b[3..2]PREA[3..0]Equal04' hC --B[3..0]clken+LessThan0DQ=EQUALcouta[3..0]ENACLRA[3..0]4' hC --B[3..0] use ieee.std_logic_1164.all; entity xulie is port(clk,rst,d:in std_logic; z: out std_logic); end xulie; architecture bhv of xulie is type state_type is(s0,s1,s2,s3,s4,s5,s6); --状态定义 signal state: state_type; --状态寄存器 begin process(clk,rst) --次态设置 begin if rst= '1' then state<=s0; --异步重启 elsif (clk'event and clk ='1') then case state is --根据d判断状态转移 when s0 => if d='1' then state<=s1; else state<=s0; end if; when s1=> if d='1' then state<=s2; else state<=s0; 5