乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      vhdl——inout類型的設(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類型,在構(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類型,即把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ǔ),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)買等信息,謹(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)論公約

        類似文章 更多