• 有限状态机vhdl > 一种基于状态机设计的串并行转换电路
  • 一种基于状态机设计的串并行转换电路

    免费下载 下载该文档 文档格式:DOC   更新时间:2014-07-24   下载次数:0   点击次数:1
    一种基于状态机设计的串并行转换电路 摘要:利用有限状态机等设计一种将LTC1196(ADC)的串行输出数据转换成并行数据的转换电路, ADC的时钟由转换电路提供,CS信号由转换电路处理后提供给ADC,以保证LTC1196的时序要求.编好的程序在Quartus II上调试并仿真通过,实现了把八位的串行数据转换成并行数据的目的. 关键词:有限状态机;LTC1196(ADC);串并行转换 Abstract: By using finite state machine to design a conversion circuit which can change the serial data into parallel data, the serial data is the output of LTC1196(ADC). The clock of the conversion circuit is provided by the clock of ADC. CS signal is provided to ADC after processing by conversion circuit, to ensure the schedule requiring of LTC1196. The edited program was debugging in Quartus II and running well. The end realized the goal of converting the serial data to 8 bits parallel data. Keywords: FSM; TC1196(ADC); Converting serial to parallel 引言:有限状态机在VHDL语言中有着广泛的应用,许多实际问题都是通过状态机来实现的,尤其是同步时序逻辑电路的设计.有限状态机把复杂的控制逻辑分解为有限个稳定状态,在每个状态上判断所发生的事件,将连续处理变成离散处理,特别适合于VHDL数字系统设计的工作特点.同时,因为有限状态机具有有限个状态所以在实际的工程应用中很容易实现.本文就是充分利用有限状态机的特点设计一种把串行输出数据转换为并行数据的电路.这个串行输出的数据由LTC1196(ADC)提供.LTC1196的时钟是由设计的转换电路提供,并且经过转换电路处理后把CS信号提供给LTC1196以满足其时序的要求. 1 有限状态机 有限状态机(Finite State Machine)主要用于顺序逻辑电路的建模,在顺序逻辑电路设计中,因不同阶段具有明确的顺序状态,所以其显得非常有用.图1是一个状态机的基本结构.有限状态机的主要功能是用来实现一个数字电路设计的控制部分,其功能和CPU的功能十分相似.在进行数字系统的电路设计时,如果考虑实现一个控制功能,通常会选择状态机或者是CPU来实现,但是在执行耗费时间和执行时间的确定性方面,状态机要比CPU好. 有限状态机可以有多种不同的描述方式.描述状态机的VHDL代码必须遵守一定的规则. 至少要包括一个用来指定状态机状态的状态信号; 状态转移指定和输出指定,它们对应于控制单元中与每个控制步有关的转移条件; 用来进行同步的时钟信号; 复位信号. 使用枚举数据类型来定义状态机的状态,并使用多进程方式来描述状态机的内部逻辑,可以得到高效、可综合的VHDL状态机描述.状态变量不能是接口或端口信号,而且状态变量的操作只限于等于或不等于的比较操作.在描述有限状态机的过程中常使用的描述方式有单进程方式、双进程方式和三进程方式.三进程方式就是将有限状态机的次态逻辑、状态寄存器和输出逻辑分别使用三个进程来描述.这种描述方式可以把状态机的组合逻辑部分和时序逻辑部分分开,有利于对状态机的组合逻辑部分和时序逻辑部分分别进行测试.双进程描述方式是将有限状态机的次态逻辑、状态寄存器和输出逻辑分别用两个进程来描述.同样一个单进程描述方式就是将有限状态机的次态逻辑、状态寄存器和输出逻辑使用一个进程来描述. 2 LTC1196(ADC) LTC1196是一个8位、1MSPS 、3线高速串行低功耗AD 转换器,模拟信号输入范围0~5V.内含采样和保持电路,具有高阻抗方式的串行接口,完成一次转换需要12个时钟周期.下图2就是LTC1196(ADC). 图2 LTC1196(ADC) 由图2知LTC1196能够把0~5v范围的模拟信号转换为数字信号,可以使转换后的数据连接到ASIC,PLD,MPU,DSP或移位寄存器等.本文设计的电路就是在每个转换周期内把输出的数字信号相当于存在一个移位寄存器中,当8位的数据转换完成时就把这8位的数据一次性的输出,从而达到使这些串行数据转化为并行数据的目的.此芯片的控制信号时序图如图3所示. 图3中的CS为片选信号,低电平有效,它的下降沿离上一个CLK上升沿至少13ns,离下一个CLK上升沿至少26ns(建立时间);CLK为时钟信号,CS低电平后,约经过2.5个CLK开始输出转换结果的最高位,所以单次转换不少于12个时钟频率,且时钟频率不得高于12MHz. 图3 LTC1196控制信号时序图 由图3 LTC1196的控制信号时序图可以看出在CS高电平变为低电平后大约经过三个时钟周期开始输出转换后的高位数据,到第11个时钟周期结束时正好8个数据输出完,此时CS由低电平变为高电平,准备下一个时钟周期数据的输出.在CS处于高电平状态时,输出都是高阻信号,在每12个时钟周期的第一个到第二个周期是没有任何的数据输出的.在充分了解了LTC1196的控制信号时序图之后就可以编写VHDL语言来实现把LTC1196在每12个时钟周期内输出的8位数据进行输出,因为LTC1196输出的是串行数据这样就可以达到这8位数据的并行输出. 下图4是该实现电路设计时用到的状态机的状态图. 图4 状态图 由时序图可知从CS的下降沿开始的第三个周期开始有数据输出,此时输出的是8位数据中的最高位,在接下来的8个时钟周期中把这8位数输完,也就是计数Count从0010计到1001,在计数到1010时转换到状态ST0,如上图所示,当计到1011时此时12个周期计满,并且在RESET=1的条件下把这个8位数据输出.然后再进入下一个串行数据的输出. 3 仿真 把编好的程序运行在Quartus II上,本程序采用的三进程的有限状态机描述方式.仿真的结果如下图5所示. 此仿真图是取一次转换即12个时钟周期的数据转换结果.其中的ltc1196out是LTC1196的输出,在仿真的时候任意设置其取值,从仿真结果上可以看出当计数到1010时开始有数据输出,计到1011时,整个数据便输出,然后再接着下一组数据的输出.由程序设计可知当计数为0010时开始输出数据的最高位,从图5中可知在这个12时钟周期中,第三个时钟周期的下降沿ltc1196out处于高电平,而输出的最高位为1,在接着往下的每个时钟周期的下降沿ltc1196out依次是1110100,输出的也是1110100.所以此程序设计是正确的,达到了把8位串行数据并行输出的目的. 4 结束语 本文利用有限状态机等完成了把LTC1196(ADC)的串行输出数据转换成并行数据的转换电路.并且通过实验仿真实现了8位串行到并行的输出.结果验证是正确的.通过本次设计对有限状态机有了一个比较深刻的理解,同时也加深了对Quartus II的熟悉和使用,对于以前没有接触过VHDL和Quartus II的我是一个很好的锻炼机会.但是对有限状态机和Quartus II仍然还有很多地方要学习,希望在以后的学习和锻炼中进一步提高. 参考文献 [1] 江思敏.数字电路及系统设计.机械工业出版社,2006,156~175. [2] 侯伯亨等.现代数字系统设计.西安电子科技大学出版社,2004. [3] 齐洪喜等.VHDL电路设计实用教程.清华大学出版社,2004,192~197. 所用的代码如下: library ieee; use ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all; entity liu is port(ltc1196out: in std_logic; clk:in std_logic; cs:out std_logic; y:out std_logic_vector(7 downto 0) ); end liu; architecture behav of liu is type state is (st0,st1,st2); signal current_state,next_state:state; signal RESET:std_logic; signal a:std_logic ; signal q:std_logic_vector(7 downto 0); signal count:std_logic_vector(3 downto 0); begin COM:process (current_state ) begin case current_state is when st0=> --q<="ZZZZZZZZ" RESET<='1'; cs<='1' next_state<=st1; when st1=> RESET<='0' cs<='0' if(count="0001") then next_state<=st2; else next_state<=st1; end if; when st2=> if(count<="1001") then cs<='0'; RESET<='0'; next_state<=st2; end if; if(count="1010") then next_state<=st0; RESET<='0'; cs<='0' end if; end case; end process COM; REG:process(clk) begin if(clk'event and clk='0') then if(RESET='0') then count<=count+1; else count<="0000"; end if; a<=ltc1196out; current_state<=next_state; end if; end process REG; COUNT1:process(count) begin if(count="0010") then q(7)<=a; elsif(count="0011") then q(6)<=a; elsif(count="0100") then q(5)<=a; elsif(count="0101") then q(4)<=a; elsif(count="0110") then q(3)<=a; elsif(count="0111") then q(2)<=a; elsif(count="1000") then q(1)<=a; elsif(count="1001") then q(0)<=a; end if; if(count="1011"and RESET='1') then y<=q; else y<="ZZZZZZZZ" end if; end process COUNT1; end behav; 第 1页,共 6页
  • 下载地址 (推荐使用迅雷下载地址,速度快,支持断点续传)
  • 免费下载 DOC格式下载
  • 您可能感兴趣的
  • vhdl三段式状态机  vhdl状态机  vhdl事件驱动状态机  状态机vhdl代码  有限状态机  有限状态机编程  有限状态机模型  有限状态机在ai  一般有限状态机的设计  洗衣机有限状态机