资源描述:
《verilog双向口问题小节》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、双向口问题小节在工程应用中,双向电路是设计者不得不面对的问题.在实际应用中,数据总线往往是双向的.如何正确处理数据总线是进行时序逻辑电路设计的基础.在程序设计过程中,关键技术在于:实体部分必须对端口属性进行申明,端口属性必须为inout类型,在构造体需要对输出信号进行有条件的高阻控制.在双向电路的处理问题上,常用的处理方式有两种,在介绍双向电路的处理方式之前,先看看双向电路的基本格式:ENTITYbidir_pinIS(bidir:INOUTstd_logic;oe,clk,from_core:INstd_logic;to_core
2、:OUTstd_logic;……ENDbidir_pin;ARCHITECTUREbehaviorOFbidir_pinISBEGINbidir<=from_coreWHENoe=‘1’ELSE“ZZZZ”;to_core<=bidir;___ENDbehavior;该程序揭示了双向电路的处理技巧,首先在实体部分bidir属于双向信号,在端口定义时,端口属性为inout类型,即把bidir信号作为输入三态输出.语句“bidir<=from_coreWHENoe=‘1’ELSE“ZZZZ”;”表示bidir信号三态输出,语句”to_c
3、ore<=bidir;”把bidir信号作为输入信号.由此可见,双向电路在程序设计中,didir输入当着普通的in类型,而在输出时,需要加一定的控制条件,三态输出.问题的关键在于:如何确定这个条件?1)双向信号作一个信号的输入,作另一信号的输出ENTITYbidirISPORT(bidir:INOUTSTD_LOGIC_VECTOR(7DOWNTO0);oe,clk:INSTD_LOGIC;from_core:INSTD_LOGIC_VECTOR(7DOWNTO0);to_core:OUTSTD_LOGIC_VECTOR(7DOWN
4、TO0));ENDbidir;ARCHITECTURElogicOFbidirISSIGNALa:STD_LOGIC_VECTOR(7DOWNTO0);SIGNALb:STD_LOGIC_VECTOR(7DOWNTO0);BEGINPROCESS(clk)BEGINIFclk='1'ANDclk'EVENTTHENa<=from_core;to_core<=b;ENDIF;ENDPROCESS;PROCESS(oe,bidir)BEGINIF(oe='0')THENbidir<="ZZZZZZZZ";b<=bidir;ELSEbid
5、ir<=a;b<=bidir;ENDIF;ENDPROCESS;ENDlogic;这种设计方式叫做寄存双向信号的方法.本设计中bidir为双向信号,from_core为数据输入端,to_core为数据输出端,oe为三态输出使能,clk为读写数据的时钟.在程序设计中,需要定义两个signala和b信号.a信号用于输入数据from_core的寄存器,b用于输出数据to_core的寄存器.采用寄存器的方法需要设计两个进程,一个进程把a,b信号在时钟的控制下负责端口的输入信号from_core和端口输出信号to_core的连接,这一步实现了
6、寄存双向的功能.另外一个进程则负责信号a,b和双向口之间的赋值关系.本设计只揭示了简单的双向信号操作方式,即bidir既可以作为from_core的输出,又可以作为to_core的输入2)双向信号既做输出又做输出上例是最简单的双向信号应用的特例.在实际的工程中,双向信号既做信号的输入,又做信号的输出,常见的数据总线就是这种操作模式.libraryIEEE;useIEEE.STD_LOGIC_1164.all;entitydir_dataisport( clk:inSTD_LOGIC; rst:inSTD_LOGIC; rw:i
7、nSTD_LOGIC; address:inSTD_LOGIC_VECTOR(1downto0); data:inoutSTD_LOGIC_VECTOR(7downto0) );enddir_data;architecturearc_dirofdir_dataissignaldata_in:STD_LOGIC_VECTOR(7downto0);signaldata_out:STD_LOGIC_VECTOR(7downto0);signalreg_a:STD_LOGIC_VECTOR(7downto0);signalreg
8、_b:STD_LOGIC_VECTOR(7downto0);begin data_in<=data;d1:process(clk,rst,rw)begin ifrst='1'then reg_a<=(others=>'0')