260 likes | 461 Views
08/09 学年第 1 学期. 硬件描述语言及器件. 教材:任勇峰等编著 《VHDL 与硬件实现速成 》. 主讲教师:刘文怡. 教学安排. 第 1 讲: VHDL 概述及其开发环境 第 2 讲: VHDL 的基本元素 第 3 讲: VHDL 的进程 第 4 讲:其它并行语句 第 5 讲: VHDL 实例剖析 第 6 讲: VHDL 的顺序描述语句 第 7 讲:结构体的描述风格 第 8 讲:计数器状态控制 第 9 讲:不同风格的状态机举例 第 10 讲: VHDL 综合举例. 第 8 讲: 计数器状态控制. 1 同步复位与异步复位
E N D
08/09学年第1学期 硬件描述语言及器件 教材:任勇峰等编著《VHDL与硬件实现速成》 主讲教师:刘文怡
教学安排 • 第1讲:VHDL概述及其开发环境 • 第2讲:VHDL的基本元素 • 第3讲:VHDL的进程 • 第4讲:其它并行语句 • 第5讲:VHDL实例剖析 • 第6讲:VHDL的顺序描述语句 • 第7讲:结构体的描述风格 • 第8讲:计数器状态控制 • 第9讲:不同风格的状态机举例 • 第10讲:VHDL综合举例
第8讲: 计数器状态控制 • 1 同步复位与异步复位 • 2 计数器设计 • 3 基于计数器的状态变更 • 4 分频器
1同步复位与异步复位 • 时序逻辑概述: • 时序逻辑电路又称为同步电路,基础电路包括触发器、寄存器、计数器。 • 由数字电路知道,任何时序电路都以时钟为驱动信号,时序电路只是在时钟信号的边沿到来时,其状态才发生改变。因此,时钟信号是时序电路程序的执行条件,时钟信号是时序电路的同步信号。 • 什么是时钟?其作用是什么?
时序电路中进程敏感信号是时钟信号 • 在时序电路描述中,时钟信号作为敏感信号,显式的出现在PROCESS语句后的括号中。 • PRCESS(clock_signal) • 时序信号边沿的到来将作为时序电路语句执行的条件来启动进程的执行。 • 这种以时钟为敏感信号的进程描述方法为:
PROCESS (clock_signal) • BEGIN • IF(clock_edge_condition)THEN • Signal_out <= signal_in; • —其他时序语句 • END IF; • END PROCESS; • clock信号作为进程的敏感信号,每当clock发生变化,该进程就被触发、启动,而时钟边沿的条件得到满足时,才真正执行时序电路所对应的语句。
组合逻辑和时序逻辑 数字电路通常分为组合逻辑电路和时序电路: 组合逻辑电路 outputs = F(current_inputs) 时序电路 outputs = F(current_inputs, past_inputs) 有限状态机就是时序电路的数学抽象,一个有限状态机系统包括inputs ,outputs, states . present state 现态,next state 次态
复位,设定初始状态 • 时序电路的初始状态应由复位信号来设置。根据复位信号对时序电路复位的操作不同,使其可以分为同步复位和异步复位。 • 所谓异步复位,就是当复位信号有效时,时序电路立即复位,与时钟信号无关。
同步复位 PROCESS (clock) BEGIN if clock =‘1’ and clock’EVENT then if reset = ‘1’ then sout <= ‘0’; tmp <= ‘0’; else sout <= sin; tmp <= not tmp; end if; END IF; END PROCESS; sin sout clock tmp reset
异步复位 PROCESS (clock, reset) BEGIN if reset = ‘1’ then sout <= ‘0’; tmp <= ‘0’; elsifclock =‘1’ AND clock’EVENT then sout <= sin; tmp <= not tmp; end if; END PROCESS; sin sout clock tmp reset
2 计数器设计 • 计数器干什么用? • 计数器计什么样的数? • 在硬件电路中,“数”都用一组总线上电平对应的二进制值来表示。 • 计数器用来计信号变化的次数,通常用来计上升沿或下降沿到来的个数。 • 如果clk等周期变化,就等价于计时 q0 clk q7
带异步复位的沿敏感计数器 SIGNAL counter:STD_LOGIC_VECTOR (7 DOWNTO 0); process ( fosc,rst) begin if rst = ‘1’ then counter <= “00000000”; else --上升沿和下降沿都敏感 counter <=counter +1; end if; end process; 关键指标:计数次数、计数时间,与晶振频率有关。
带异步复位的沿敏感计数器 SIGNAL counter:STD_LOGIC_VECTOR (7 DOWNTO 0); process ( fosc,rst) begin if rst = ‘1’ then counter <= “00000000”; else fosc’event and fosc = ‘1’ then --上升沿敏感 counter <=counter +1; end if; end process; 关键指标:计数次数、计数时间,与晶振频率有关。
可逆计数器 • 可逆计数器根据计数脉冲的不同,控制计数器在同步信号脉冲的作用,进行加1操作,或者减1操作。 • 可逆计数器的计数方向,由特殊的控制端updn控制。 • 当updn = ‘1’时,计数器加1操作; • 当updn = ‘0’时,计数器加1操作; updn CLR Q CLK
LIBRARY IEEE; • USE IEEE.STD_LOGIC_1164.ALL; • USE IEEE.STD_LOGIC_UNSIGNED.ALL; • ENTITY count IS • PORT (clk,clr,updn: IN STD_LOGIC; • Q: OUT STD_LOGIC_VECTOR(7 downto 0)); • END count; • ARCHITECTURE example OF count IS • SIGNAL count_B:STD_LOGIC_VECTOR (7 DOWNTO 0);
BEGIN • Q <= count_B; • PROCESS (clr,clk) • BEGIN • IF(clr=‘1’) THEN • Count_B<=“00000000”; • ELSIF (clk’EVENT AND clk= ‘1’ ) THEN • IF (updn=‘1’) THEN • Count_B<=count_B + 1; • ELSE • Count_B<=count_B – 1; • END IF; • END IF; • END PROCESS; • END example;
s1 s2 s1 s3 s1 s4 s2 s5 s2 3 基于计数器的状态变更 • 上升沿到来的条件可写为: • IF clk = ‘1’ AND clk’EVENT THEN; • 时钟信号下降沿的属性描述为: • IF clk = ‘0’ AND clk’EVENT THEN; • 沿敏感、状态改变 状态区间:沿1<状态≤沿2 • 上升沿敏感,状态转换
用计数器值做条件来控制时序 • PROCESS (clr,clk) • BEGIN • IF(clr=1) THEN • Count_B<=“00000000”; • q <= ‘0’; • ELSIF (clk'EVENT AND clk= ‘1’ ) THEN • Count_B<=count_B + 1; • IF (Count_B = “00000000”) THEN • q <= ‘1’; • ELSIF (Count_B = “00000001”) THEN • q <= ‘0’; • ELSIF (Count_B = “00000011”) THEN • q <= ‘1’; • ELSIF (Count_B = “00000100”) THEN • q <= ‘0’; • END IF; • END IF; • END PROCESS;
调整周期 • PROCESS (clr,clk) • BEGIN • IF(clr=‘1’) THEN • Count_B<=“00000000”; • q <= ‘0’; • ELSIF (clk'EVENT AND clk= ‘1’ ) THEN • IF (Count_B = “00001111”) THEN • Count_B<=“00000000”; • else • Count_B<=count_B + 1; • IF (Count_B = “00000000”) THEN • q <= ‘1’; • ELSIF (Count_B = “00000001”) THEN • q <= ‘0’; • ELSIF (Count_B = “00000011”) THEN • q <= ‘1’; • ELSIF (Count_B = “00000100”) THEN • q <= ‘0’; • END IF; • END IF; • END IF; • END PROCESS;
用计数值控制产生精确时序 • 只要知道晶振频率f,即可知道周期T=1/f; • 使用一个计数器,可以通过计数值n,精确知道当计数值为n时消耗的时间t=nT; • 上例中以n为控制条件,可以控制其它信号在某时刻变高,某时刻变低,从而产生精确时序; • 但要注意:时间分辨率(或叫最小控制时间间隔)取决于晶振频率。
4 分频器设计 • 分频器就是根据输入时钟,采用计数器,计多次数输出一次。从而实现降频。
最简单的时钟输出 • process ( fosc,rst) • begin • if rst = ‘1’ then • q <= ‘0’; • else • q <= not q; • end if; • end process; • 本例中,fosc两个沿都会触发进程 rst fosc q=‘0’ q q q=‘1’
分频器(2分频) • signal count : std_logic_vector(7 DOWNTO 0); • process ( fosc,rst) • begin • if rst = ‘1’ then • count <= “00000000”; • q <= ‘0’; • elsif fosc'event and fosc='1' then • if count = "00000010" then • count <= "00000000"; • q <= not q; • else • count <= count +1; • end if; • end if; • end process;
作业 • 认真查找阅读ADS8402芯片资料 • 自己尝试生成ADS8402的控制时序,实现数据采集。
关键信号 • convst • rd • cs • reset • byte • db • busy