繁体中文
高级搜索
 
首页 | 电子技术应用 | 行业最新动态 | 行业最新产品 | 软件资料下载 | 电路图纸欣赏 | 博客文章精选 | 电子精品论坛 | 电子技术贴吧

当前位置:首页 >> 博客文章精选 >> EDA与PLD---博客 >> VHDL之状态机学习笔记
VHDL之状态机学习笔记
作者:   来源: 发表时间:2006-12-30  字号:  

由于平时比较忙,没有时间系统的学习,所以一般情况下只能周末稍微系统的学习一下。前几周主要学习了一下如何用VHDL来实现一个状态机。因为状态机的应用实在是太广泛了,例如各种存储器的控制,AD的控制外部器件的控制,也包括内部电路的控制,到了非学不可的地步了。

对于状态机的理论没有涉及太多,只有几点需要注意:

(1)moore和mealy的区别在于输出是否只和当前状态有关。

(2)状态机的两种基本操作:一是状态机内部状态的转换,另一是产生输出信号序列。

(3)状态机的分析可以从状态图入手,同样,状态机的设计也可以从状态图入手。

在集成电路设计时,通常可以将整个系统划分为两部分,一部分是数据单元,另一部分是控制单元。数据单元包含保存运算数据和运算结果的数据寄存器,也包括完成数据运算的组合逻辑。控制单元用来产生信号序列,以决定何时进行何种数据运算,控制单元要从数据单元得到条件信号,以决定继续进行那些数据运算。数据单元要产生输出信号,数据运算状态等有用信号。数据单元和控制单元中,有两个非常重要的信号,即复位信号和时钟信号。复位信号保证了系统初始状态的确定性,时钟信号则是时序系统工作的必要条件。状态机通常在复位信号到来的时候恢复到初始状态,每个时钟到来的时候内部状态发生变化。

正如上面的(3)提到的,设计状态机时一般先构造出状态图。构造状态图的一般方法是从一个比较容易描述的状态开始,通常初始态是一个很好开始的状态,也就是状态机复位以后开始的状态。在建立每个状态时最好都清楚的写出关于这个状态的文字描述,为硬件设计过程提供清晰的参考资料,也为最后完成的设计提供完整的设计文档。

下面给出一个用VHDL实现ADC0804控制器的完整设计过程。

首先根据ADC0804的时序图分析所有可能的状态,并且建立起来状态图。

时序图:

http://pic13.album.tom.com/album_pic/2005/09/12/b15fe2073e48e1bb3780e6431f695e8c?uNoDjwIqmt

4个状态如下:

idle: CS="0",WR=0,RD=1 启动AD0804开始转换

convert:CS=1,WR=1,RD=1,AD0804进行数据转换

read1: CS="1",WR=1,RD=1,INTR,转换结束,开始读

read2: CS="1",WR=1,RD=0,读取数据。

状态图:

http://pic13.album.tom.com/album_pic/2005/09/12/8427a2ae7a7a9c03018d4f83dfce23a4?uNoDjwKsir

VHDL程序如下,所用的综合器是XST

--------------------------------------------------------------------------------
-- Design Name: skycanny
-- Module Name: ad_controller - Behavioral
-- Description: This VHDL design is created to implement a state machine
-- to control AD0804
--------------------------------------------------------------------------------
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity ad_controller is
port(
reset : in std_logic;
clk : in std_logic;
intr : in std_logic;
data_i : in std_logic_vector(7 downto 0);
data_o : out std_logic_vector(7 downto 0);
cs : out std_logic;
wr : out std_logic;
rd : out std_logic
);
end ad_controller;

architecture Behavioral of ad_controller is

type state is (start, convert, read1, read2);
signal current_state, next_state : state;
signal data_r : std_logic_vector(7 downto 0);
signal read_data : std_logic;

begin
sync :process(reset,clk)
begin
if(reset = '0') then
current_state <= start;
elsif(clk'event and clk = '1') then
current_state <= next_state;
end if;
end process sync;

comb :process(current_state, intr)
begin
case current_state is
when start =>
next_state <= convert;
cs <= '0';
wr <= '0';
rd <= '1';
read_data <= '0';
when convert =>
if(intr = '0') then
next_state <= read1;
else
next_state <= convert;
end if;
cs <= '1';
wr <= '1';
rd <= '1';
read_data <= '0';
when read1 =>
next_state <= read2;
cs <= '0';
wr <= '1';
rd <= '0';
read_data <= '1';
when read2 =>
next_state <= start;
cs <= '1';
wr <= '1';
rd <= '1';
read_data <= '0';
when others =>
next_state <= start;
end case;
end process comb;

get_data: process(reset,clk)
begin
if(reset = '0') then
data_r <= X"00";
elsif(clk'event and clk = '1') then
if(read_data = '1') then
data_r <= data_i;
end if;
end if;
end process;

data_o <= data_r;
end Behavioral;

功能仿真图:

http://pic13.album.tom.com/album_pic/2005/09/12/da734f0b3c9a730aed2a367e13d9f833?uNoDjwKums

从仿真图可以看出,该控制器工作正常。

RTL原理图:

http://pic13.album.tom.com/album_pic/2005/09/12/8427a2ae7a7a9c03018d4f83dfce23a4?uNoDjwKsir

总结:对于时序电路中用到的状态机,分析时序电路中间经历的状态可以很快得出状态机的整体结构,然后用VHDL实现就可以。另外ISE提供了StateCad,方便了状态机的设计,仿真等等。


!注意:如果您发现此文章出现影响您的阅读的状况,请从浏览器地址栏里复制本文的链接到留言本报告给站长解决!
  • 上一篇: CMOS逻辑电路
  • 下一篇: IBM采用自成形材料绝缘 芯片提速三分之一

  • >> 联系我们请给我们留言·留言本
    本站所有提供的信息软件资料均来自网络,版权及著作权归原作者所有,如果无意中侵犯了您的相关权利或触及法律法规,请给我们留言, 我们将在24小时内删除。
      浙ICP备05071687号  电子技术精品网