?
在工程應(yīng)用中,雙向電路是設(shè)計(jì)者不得不面對(duì)的問(wèn)題.在實(shí)際應(yīng)用中,數(shù)據(jù)總線往往是雙向的.如何正確處理數(shù)據(jù)總線是進(jìn)行時(shí)序邏輯電路設(shè)計(jì)的基礎(chǔ).在程序設(shè)計(jì)過(guò)程中,關(guān)鍵技術(shù)在于:實(shí)體部分必須對(duì)端口屬性進(jìn)行申明,端口屬性必須為Inout類型,在構(gòu)造體需要對(duì)輸出信號(hào)進(jìn)行有條件的高阻控制.在雙向電路的處理問(wèn)題上,常用的處理方式有兩種,在介紹雙向電路的處理方式之前,先看看雙向電路的基本格式:
(
Bidir : INOUT Std_logic;
Oe, Clk, From_core : IN Std_logic;
To_core : OUT Std_logic;
……
END Bidir_pin;
ARCHITECTURE Behavior OF Bidir_pin IS
BEGIN
Bidir <= From_core WHEN Oe=‘1’ ELSE “ZZZZ”;
To_core <= Bidir;
_
_
_
END Behavior;
該程序揭示了雙向電路的處理技巧,首先在實(shí)體部分Bidir屬于雙向信號(hào),在端口定義時(shí),端口屬性為Inout類型,即把Bidir信號(hào)作為輸入三態(tài)輸出. 語(yǔ)句“Bidir <= From_core WHEN Oe=‘1’ ELSE “ZZZZ”;”表示Bidir信號(hào)三態(tài)輸出,語(yǔ)句”To_core <= Bidir;”把Bidir信號(hào)作為輸入信號(hào).
由此可見(jiàn),雙向電路在程序設(shè)計(jì)中,Didir輸入當(dāng)著普通的In類型,而在輸出時(shí),需要加一定的控制條件,三態(tài)輸出.問(wèn)題的關(guān)鍵在于:如何確定這個(gè)條件?
1)雙向信號(hào)作一個(gè)信號(hào)的輸入,作另一信號(hào)的輸出
ENTITY Bidir IS
PORT(
Bidir : INOUT STD_LOGIC_VECTOR (7 DOWNTO 0);
Oe, Clk : IN STD_LOGIC;
From_core : IN STD_LOGIC_VECTOR (7 DOWNTO 0);
To_core : OUT STD_LOGIC_VECTOR (7 DOWNTO 0)
);
END Bidir;
ARCHITECTURE Logic OF Bidir IS
SIGNAL A : STD_LOGIC_VECTOR (7 DOWNTO 0);
SIGNAL B : STD_LOGIC_VECTOR (7 DOWNTO 0);
BEGIN
PROCESS (Clk)
BEGIN
IF Clk = ''1'' AND Clk''EVENT THEN
A <= From_core;
To_core <= B;
END IF;
END PROCESS;
PROCESS (Oe, Bidir)
BEGIN
IF( Oe = ''0'') THEN
Bidir <= "ZZZZZZZZ";
B <= Bidir;
ELSE
Bidir <= A;
B <= Bidir;
END IF;
END PROCESS;
END Logic;
這種設(shè)計(jì)方式叫做寄存雙向信號(hào)的方法.本設(shè)計(jì)中Bidir為雙向信號(hào),From_core為數(shù)據(jù)輸入端,To_core為數(shù)據(jù)輸出端,Oe為三態(tài)輸出使能,Clk為讀寫(xiě)數(shù)據(jù)的時(shí)鐘.在程序設(shè)計(jì)中,需要定義兩個(gè)Signal A和B信號(hào).A信號(hào)用于輸入數(shù)據(jù)From_core的寄存器,B用于輸出數(shù)據(jù)To_core的寄存器.采用寄存器的方法需要設(shè)計(jì)兩個(gè)進(jìn)程,一個(gè)進(jìn)程把A, B信號(hào)在時(shí)鐘的控制下負(fù)責(zé)端口的輸入信號(hào)From_core和端口輸出信號(hào)To_core的連接,這一步實(shí)現(xiàn)了寄存雙向的功能.另外一個(gè)進(jìn)程則負(fù)責(zé)信號(hào) A,B和雙向口之間的賦值關(guān)系.本設(shè)計(jì)只揭示了簡(jiǎn)單的雙向信號(hào)操作方式,即Bidir既可以作為From_core的輸出,又可以作為To_core的輸入
2)雙向信號(hào)既做輸出又做輸出
上例是最簡(jiǎn)單的雙向信號(hào)應(yīng)用的特例.在實(shí)際的工程中,雙向信號(hào)既做信號(hào)的輸入,又做信號(hào)的輸出,常見(jiàn)的數(shù)據(jù)總線就是這種操作模式.
Library IEEE;
Use IEEE.STD_LOGIC_1164.All;
Entity Dir_data Is
Port(
Clk : In STD_LOGIC;
Rst : In STD_LOGIC;
Rw : In STD_LOGIC;
Address : In STD_LOGIC_VECTOR(1 Downto 0);
Data : Inout STD_LOGIC_VECTOR(7 Downto 0)
);
End Dir_data;
Architecture Arc_dir Of Dir_data Is
Signal Data_in : STD_LOGIC_VECTOR(7 Downto 0);
Signal Data_out: STD_LOGIC_VECTOR(7 Downto 0);
Signal Reg_a: STD_LOGIC_VECTOR(7 Downto 0);
Signal Reg_b: STD_LOGIC_VECTOR(7 Downto 0);
Begin
Data_in<=Data;
D1:Process(Clk,Rst,Rw)
Begin
If Rst=''1'' Then
Reg_a<= (Others=>''0'');
Reg_b<= (Others=>''0'');
Elsif Clk''Event And Clk=''1'' Then
If Rw=''1'' Then
If Address="00" Then
Reg_a<=Data_in;
Elsif Address="01" Then
Reg_b<=Data_in;
Else Null;
End If;
Else Null;
End If;
Else Null;
End If;
End Process D1;
D2:Process(Clk,Rw,Reg_a,Reg_b)
Begin
If Clk''Event And Clk=''1'' Then
If Rw=''0'' Then
If Address="00" Then
Data_out<=Reg_a;
Elsif Address="01" Then
Data_out<=Reg_b;
Else Null;
End If;
Else Null;
End If;
Else Null;
End If;
End Process D2;
Data<=Data_out When (Rw=''0'' And Address(1)=''0'') Else
(Others=>''Z'');
End Arc_dir;
在程序設(shè)計(jì)中,首先需要定義Data_in, Data_out, Reg_a, Reg_b四個(gè)Signal,我們把Data_in叫做輸入寄存器,它是從雙向信號(hào)Data接收數(shù)據(jù)的寄存器,Data_out叫做輸出寄存器,它是向雙向信號(hào)Data發(fā)送信號(hào)的寄存器,Reg_a和Reg_b叫做操作寄存器,它們是在一定的時(shí)序控制下把Data_in數(shù)據(jù)送給Reg_a,Reg_b,在一定的時(shí)序控制下從Reg_a和Reg_b讀出數(shù)據(jù)的.
這樣的處理方式必須有兩個(gè)進(jìn)程,因?yàn)樵贏rchitecture Arc_dir Of Dir_data Is和Begin之間定義了Data_in, Data_out, Reg_a, Reg_b四個(gè)Signal,它在同一進(jìn)程內(nèi)不支持既賦值,又調(diào)用,也就是說(shuō)它不支持在D1進(jìn)程中對(duì)信號(hào)Reg_a, Reg_b賦值,又在D1進(jìn)程中又調(diào)用Reg_a, Reg_b.
首先有語(yǔ)句”Data_in<=Data;”它表示輸入寄存器無(wú)條件的接收雙先信號(hào)的數(shù)據(jù).在D1進(jìn)程中,首先在Rst信號(hào)有效時(shí),對(duì)操作寄存器Reg_a,和Reg_b進(jìn)行清零操作,然后在時(shí)鐘(Clk)的控制下,在寫(xiě) (Rw)信號(hào)有效的情況下,對(duì)Reg_a, Reg_b寄存器在不同的地址控制下寫(xiě)入不同的Data_in值.在D2進(jìn)程中,在時(shí)鐘(Clk)的控制下,在讀(Rw)信號(hào)有效的時(shí)候,把不同地址的 Reg_a, Reg_b的值送進(jìn)Data_out中.
最關(guān)鍵的是最后一句:“Data<=Data_out When (Rw=''0'' And Address(1)=''0'') Else (Others=>''Z'');”它表示雙向信號(hào)的三態(tài)輸出,而最最關(guān)鍵的是When后面的條件,如果條件限制太寬,就會(huì)錯(cuò)誤占用雙向信號(hào)總線,引起總線的誤操作,如果條件限制太窄,輸出寄存器的數(shù)據(jù)就不能夠正確的送到數(shù)據(jù)總線上去,會(huì)引起數(shù)據(jù)的丟失.也就是說(shuō),只有正確的限制了When語(yǔ)句后面的條件,才能夠把輸出寄存器的數(shù)據(jù)正確地送到數(shù)據(jù)總線上去.仔細(xì)查看此條件,有如下的規(guī)律:When語(yǔ)句后的條件是操作寄存器寫(xiě)入輸出寄存器的條件的公共條件.比如:Rw=’0’是操作寄存器的數(shù)據(jù)寫(xiě)入輸出寄存器的讀使能信號(hào),Address(1)是地址線的公共部分.在實(shí)際工程應(yīng)用中,需要設(shè)計(jì)者在分配地址總線的時(shí)候掌握一定的技巧,盡量從地址的低位到到高位,保證地址總線有更多位的公共部分,比如只對(duì)四個(gè)寄存器操作時(shí),地址線分配為”100”,” 010”,”110”,”001”是不科學(xué)的,而”000”,”001”,”010”和”011”則是理想的.兩者不同的是前者地址線沒(méi)有公共部分,這樣的設(shè)計(jì)無(wú)法用When語(yǔ)句對(duì)條件進(jìn)行直接的控制,如果置之不理,由于列舉不全,在邏輯綜合時(shí),電路會(huì)利用器件的乘積項(xiàng)和查找表的資源形成一個(gè)Latch, Latch不僅會(huì)把電路的時(shí)序變得復(fù)雜,而且電路存在潛在的危險(xiǎn)性.雖然When語(yǔ)句后的條件不能夠?qū)l件進(jìn)行直接的控制,但是可以使用枚舉法一一把用到的地址線羅列出來(lái),表示只有在這樣的地址線的情況下才會(huì)用到數(shù)據(jù)總線,否則其他狀態(tài)對(duì)數(shù)據(jù)總線送高阻,表示不占用數(shù)據(jù)總線.
總而言之,雙向信號(hào)是程序設(shè)計(jì)中尤其重要的基礎(chǔ),設(shè)計(jì)者在設(shè)計(jì)程序的時(shí)候,要尤其注意,何時(shí)會(huì)占用數(shù)據(jù)總線,何時(shí)不占用數(shù)據(jù)總線.
電子發(fā)燒友App














評(píng)論