上例是最簡(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)論