日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

vhdl——inout類(lèi)型的設(shè)計(jì)

 zhangquanling 2012-07-11
引自 EDN博客 博主jiangyi_love 的同名博文

最近在用VHDL設(shè)計(jì)簡(jiǎn)易CPU,想用總線式的,這就要求端口模式必須是INOUT,之前沒(méi)接觸過(guò)。在網(wǎng)上搜到了博主jiangyi_love的一篇文章,轉(zhuǎn)載過(guò)來(lái),我們大家共同學(xué)習(xí)。

在工程應(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類(lèi)型,在構(gòu)造體需要對(duì)輸出信號(hào)進(jìn)行有條件的高阻控制.在雙向電路的處理問(wèn)題上,常用的處理方式有兩種,在介紹雙向電路的處理方式之前,先看看雙向電路的基本格式:

ENTITY bidir_pin IS
(
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類(lèi)型,即把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類(lèi)型,而在輸出時(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ǔ),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;

針對(duì)這個(gè)程序,我編了一個(gè)仿真波形,僅供參考!



        在程序設(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ù)總線。


    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類(lèi)似文章 更多