【文章內(nèi)容簡介】
— 與觸發(fā)器的記憶功能有很好的對應(yīng)關(guān)系,只是不必注明信號上數(shù)據(jù)流動的方向。 信號初始值的設(shè)置不是必須的 ,而且初始值僅在 VHDL的行為仿真中有效。 除了沒有方向說明外, 信號 與實(shí)體的端口( Port) 概念是一致的,它可以看成是實(shí)體內(nèi)部( 設(shè)計(jì)器件內(nèi)部 )的端口 。 信號的使用和定義范圍是實(shí)體、結(jié)構(gòu)體和程序包,在進(jìn)程和子程序的順序語句中不允許定義信號。 第 6章 VHDL設(shè)計(jì)進(jìn)階 當(dāng)信號定義了數(shù)據(jù)類型和表達(dá)式后,在 VHDL設(shè)計(jì)中就能對信號進(jìn)行賦值了。 信號的賦值語句表達(dá)式 為: 目標(biāo)信號名 = 表達(dá)式; 這里的“表達(dá)式”可以是一個運(yùn)算表達(dá)式,也可以是數(shù)據(jù)對象(變量、信號或常量)。數(shù)據(jù)信息的傳入可以設(shè)置延時(shí)量。 信號的賦值可以出現(xiàn)在一個進(jìn)程中,也可以直接出現(xiàn)在結(jié)構(gòu)體的并行語句結(jié)構(gòu)中,但它們運(yùn)行的含義是不一樣的。前者屬 順序信號賦值 ( 這時(shí)的信號賦值操作要視進(jìn)程是否已被啟動 ); 后者屬 并行信號賦值 ( 其賦值操作是各自獨(dú)立并行地發(fā)生的 )。 在進(jìn)程中,可以允許同一信號有多個驅(qū)動源(賦值源),即在同一進(jìn)程中存在多個同名的信號被賦值,其結(jié)果只有最后的賦值語句被啟動,并進(jìn)行賦值操作。 第 6章 VHDL設(shè)計(jì)進(jìn)階 例如: SIGNAL a, b, c, y, z: INTEGER; … PROCESS(a,b,c) BEGIN y=a+b。 z=ca。 y=b。 END PROCESS。 其中, a、 b、 c被列入進(jìn)程敏感表,當(dāng)進(jìn)程被啟動后,信號賦值將自上而下順序執(zhí)行,但第一項(xiàng)賦值操作并不會發(fā)生,這是因?yàn)?y的最后一項(xiàng)驅(qū)動源是 b, 因此 y被賦值 b。 在并行賦值語句中,不允許如上例所示的同一信號有多個驅(qū)動源的情況。 第 6章 VHDL設(shè)計(jì)進(jìn)階 表 61 信號與變量賦值語句功能的比較 四、進(jìn)程中的信號與變量賦值語句 從硬件電路系統(tǒng)來看, 變量和信號相當(dāng)于邏輯電路系統(tǒng)中的連線和連線上的信號值;常量相當(dāng)于電路中的恒定電平,如 GND或 VCC接口。 從行為仿真和 VHDL語句功能上看 ,信號與變量具有比較明顯的區(qū)別,其差異主要表現(xiàn)在接受與保持信號的方式和信息保持與傳遞的區(qū)域大小上。 表 61在三方面對信號與變量作了比較,之后給出了一些實(shí)例。 第 6章 VHDL設(shè)計(jì)進(jìn)階 【 例 65】 LIBRARY IEEE 。 USE 。 ENTITY DFF3 IS PORT ( CLK,D1 : IN STD_LOGIC 。 Q1 : OUT STD_LOGIC)。 END 。 ARCHITECTURE bhv OF DFF3 IS BEGIN PROCESS (CLK) VARIABLE : STD_LOGIC 。 BEGIN IF CLK39。EVENT AND CLK = 39。139。 THEN := D1 。 END IF。 Q1 = 。 END PROCESS 。 END 。 第 6章 VHDL設(shè)計(jì)進(jìn)階 【 例 66】 . . . ARCHITECTURE bhv OF DFF3 IS SIGNAL : STD_LOGIC 。 BEGIN PROCESS (CLK) BEGIN IF CLK39。EVENT AND CLK =39。139。 THEN = D1 。 END IF。 Q1 = 。 END PROCESS 。 END 。 第 6章 VHDL設(shè)計(jì)進(jìn)階 圖 66 例 66 的 RTL電路 第 6章 VHDL設(shè)計(jì)進(jìn)階 【例 67】 SIGNAL in1, in2, e1, ... : STD_LOGIC 。 ... PROCESS( in1, in2, . . .) VARIABLE c1, . . . : STD_LOGIC_VECTOR(3 DOWNTO 0) 。 BEGIN IF in1 = 39。139。 THEN ... – 第 1 行 e1 = 1010 ; – 第 2 行 ... IF in2 = 39。039。 THEN . . . – 第 15+n 行 ... c1 := 0011 ; – 第 30+m 行 ... END IF。 END PROCESS。 第 6章 VHDL設(shè)計(jì)進(jìn)階 【 例 68】 LIBRARY IEEE 。 USE 。 ENTITY DFF3 IS PORT ( CLK,D1 : IN STD_LOGIC 。 Q1 : OUT STD_LOGIC)。 END 。 ARCHITECTURE bhv OF DFF3 IS SIGNAL A,B : STD_LOGIC 。 BEGIN PROCESS (CLK) BEGIN IF CLK39。EVENT AND CLK = 39。139。 THEN A = D1。 B = A。 Q1 =B。 END IF。 END PROCESS 。 END 。 第 6章 VHDL設(shè)計(jì)進(jìn)階 圖 67 例 68 的 RTL電路 第 6章 VHDL設(shè)計(jì)進(jìn)階 【 例 69】 LIBRARY IEEE 。 USE 。 ENTITY DFF3 IS PORT ( CLK,D1 : IN STD_LOGIC 。 Q1 : OUT STD_LOGIC)。 END 。 ARCHITECTURE bhv OF DFF3 IS BEGIN PROCESS (CLK) VARIABLE A,B : STD_LOGIC 。 BEGIN IF CLK39。EVENT AND CLK =39。139。 THEN A:= D1。 B := A。 Q1 = B。 END IF。 END PROCESS 。 END 。 第 6章 VHDL設(shè)計(jì)進(jìn)階 【 例 610】 —— 錯誤的 4 選 1多路選擇器 LIBRARY IEEE。 USE 。 ENTITY mux4 IS PORT (i0, i1, i2, i3, a, b : IN STD_LOGIC。 q : OUT STD_LOGIC)。 END mux4。 ARCHITECTURE body_mux4 OF mux4 IS signal muxval : integer range 7 downto 0。 BEGIN process(i0,i1,i2,i3,a,b) begin muxval = 0。 if (a = 39。139。) then muxval = muxval + 1。 end if。 if (b = 39。139。) then muxval = muxval + 2。 end if。 case muxval is when 0 = q = i0。 when 1 = q = i1。 when 2 = q = i2。 when 3 = q = i3。 when others = null。 end case。 end process。 END body_mux4。 第 6章 VHDL設(shè)計(jì)進(jìn)階 【 例 611】 —— 4 選 1多路選擇器 LIBRARY IEEE。 USE 。 ENTITY mux4 IS PORT (i0, i1, i2, i3, a, b : IN STD_LOGIC。 q : OUT STD_LOGIC)。 END mux4。 ARCHITECTURE body_mux4 OF mux4 IS BEGIN process(i0,i1,i2,i3,a,b) variable muxval : integer range 7 downto 0。 begin muxval := 0。 if (a = 39。139。) then muxval := muxval + 1。 end if。 if (b = 39。139。) then muxval := muxval + 2。 end if。 case muxval is when 0 = q = i0。 when 1 = q = i1。 when 2 = q = i2。 when 3 = q = i3。 when others = null。 end case。 end process。 END body_mux4。 第 6章 VHDL設(shè)計(jì)進(jìn)階 圖 68 例 610 的 RTL電路 第 6章 VHDL設(shè)計(jì)進(jìn)階 例 611 的 RTL電路 第 6章 VHDL設(shè)計(jì)進(jìn)階 圖 610 例 610的錯誤的工作時(shí)序 圖 611 例