- 1、本文档共5页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
PAGE
PAGE5
VHDL之状态机学习笔记
由于平时比较忙,没有时间系统的学习,所以一般情况下只能周末稍微系统的学习一下。前几周主要学习了一下如何用VHDL来实现一个状态机。因为状态机的应用实在是太广泛了,例如各种存储器的控制,AD的控制外部器件的控制,也包括内部电路的控制,到了非学不可的地步了。
??????对于状态机的理论没有涉及太多,只有几点需要注意:
??????(1)moore和mealy的区别在于输出是否只和当前状态有关。
???????(2)状态机的两种基本操作:一是状态机内部状态的转换,另一是产生输出信号序列。
???????(3)状态机的分析可以从状态图入手,同样,状态机的设计也可以从状态图入手。
???????在集成电路设计时,通常可以将整个系统划分为两部分,一部分是数据单元,另一部分是控制单元。数据单元包含保存运算数据和运算结果的数据寄存器,也包括完成数据运算的组合逻辑。控制单元用来产生信号序列,以决定何时进行何种数据运算,控制单元要从数据单元得到条件信号,以决定继续进行那些数据运算。数据单元要产生输出信号,数据运算状态等有用信号。数据单元和控制单元中,有两个非常重要的信号,即复位信号和时钟信号。复位信号保证了系统初始状态的确定性,时钟信号则是时序系统工作的必要条件。状态机通常在复位信号到来的时候恢复到初始状态,每个时钟到来的时候内部状态发生变化。
?????正如上面的(3)提到的,设计状态机时一般先构造出状态图。构造状态图的一般方法是从一个比较容易描述的状态开始,通常初始态是一个很好开始的状态,也就是状态机复位以后开始的状态。在建立每个状态时最好都清楚的写出关于这个状态的文字描述,为硬件设计过程提供清晰的参考资料,也为最后完成的设计提供完整的设计文档。
??????下面给出一个用VHDL实现ADC0804控制器的完整设计过程。
首先根据ADC0804的时序图分析所有可能的状态,并且建立起来状态图。
时序图:
/album_pic/2005/09/12/b15fe2073e48e1bb3780e6431f695e8c?%75%4e%6f%44%6a%77%49%71%6d%74
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,读取数据。
状态图:
/album_pic/2005/09/12/8427a2ae7a7a9c03018d4f83dfce23a4?%75%4e%6f%44%6a%77%4b%73%69%72
VHDL程序如下,所用的综合器是XST
--DesignName:???skycanny??
--ModuleName:???ad_controller-Behavioral
--Description:???ThisVHDLdesigniscreatedtoimplementastatemachine
--????????????????tocontrolAD0804
libraryIEEE;
useIEEE.STD_LOGIC_1164.ALL;
useIEEE.STD_LOGIC_ARITH.ALL;
useIEEE.STD_LOGIC_UNSIGNED.ALL;
entityad_controlleris
?port(
??reset??:?in?std_logic;
??clk??:?in?std_logic;
??intr??:?in?std_logic;
??data_i?:?in?std_logic_vector(7downto0);
??data_o?:?out?std_logic_vector(7downto0);
??cs??:?out?std_logic;
??wr??:?out?std_logic;
??rd??:?out?std_logic
??);
endad_controller;
architectureBehavioralofad_controlleris
type?state?is?(start,convert,read1,read2);
signal?current_state,next_state?:state;
signal?data_r?:?std_logic_vector(7downto0);
signal?read_data?:?std_logic;
begin
?sync?:process(res
文档评论(0)