上例是最簡單的雙向信號應用的特例.在實際的工程中,雙向信號既做信號的輸入,又做信號的輸出,常見的數據總線就是這種操作模式.
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;
在程序設計中,首先需要定義Data_in, Data_out, Reg_a, Reg_b四個Signal,我們把Data_in叫做輸入寄存器,它是從雙向信號Data接收數據的寄存器,Data_out叫做輸出寄存器,它是向雙向信號Data發送信號的寄存器,Reg_a和Reg_b叫做操作寄存器,它們是在一定的時序控制下把Data_in數據送給Reg_a,Reg_b,在一定的時序控制下從Reg_a和Reg_b讀出數據的.
這樣的處理方式必須有兩個進程,因為在Architecture Arc_dir Of Dir_data Is和Begin之間定義了Data_in, Data_out, Reg_a, Reg_b四個Signal,它在同一進程內不支持既賦值,又調用,也就是說它不支持在D1進程中對信號Reg_a, Reg_b賦值,又在D1進程中又調用Reg_a, Reg_b.
首先有語句”Data_in<=Data;”它表示輸入寄存器無條件的接收雙先信號的數據.在D1進程中,首先在Rst信號有效時,對操作寄存器Reg_a,和Reg_b進行清零操作,然后在時鐘(Clk)的控制下,在寫 (Rw)信號有效的情況下,對Reg_a, Reg_b寄存器在不同的地址控制下寫入不同的Data_in值.在D2進程中,在時鐘(Clk)的控制下,在讀(Rw)信號有效的時候,把不同地址的 Reg_a, Reg_b的值送進Data_out中.
最關鍵的是最后一句:“Data<=Data_out When (Rw=''0'' And Address(1)=''0'') Else (Others=>''Z'');”它表示雙向信號的三態輸出,而最最關鍵的是When后面的條件,如果條件限制太寬,就會錯誤占用雙向信號總線,引起總線的誤操作,如果條件限制太窄,輸出寄存器的數據就不能夠正確的送到數據總線上去,會引起數據的丟失.也就是說,只有正確的限制了When語句后面的條件,才能夠把輸出寄存器的數據正確地送到數據總線上去.仔細查看此條件,有如下的規律:When語句后的條件是操作寄存器寫入輸出寄存器的條件的公共條件.比如:Rw=’0’是操作寄存器的數據寫入輸出寄存器的讀使能信號,Address(1)是地址線的公共部分.在實際工程應用中,需要設計者在分配地址總線的時候掌握一定的技巧,盡量從地址的低位到到高位,保證地址總線有更多位的公共部分,比如只對四個寄存器操作時,地址線分配為”100”,” 010”,”110”,”001”是不科學的,而”000”,”001”,”010”和”011”則是理想的.兩者不同的是前者地址線沒有公共部分,這樣的設計無法用When語句對條件進行直接的控制,如果置之不理,由于列舉不全,在邏輯綜合時,電路會利用器件的乘積項和查找表的資源形成一個Latch, Latch不僅會把電路的時序變得復雜,而且電路存在潛在的危險性.雖然When語句后的條件不能夠對條件進行直接的控制,但是可以使用枚舉法一一把用到的地址線羅列出來,表示只有在這樣的地址線的情況下才會用到數據總線,否則其他狀態對數據總線送高阻,表示不占用數據總線.
總而言之,雙向信號是程序設計中尤其重要的基礎,設計者在設計程序的時候,要尤其注意,何時會占用數據總線,何時不占用數據總線.
評論
查看更多