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