Chip123 科技應用創新平台

標題: VHDL基本語法請教 [打印本頁]

作者: day766    時間: 2007-8-8 07:44 PM
標題: VHDL基本語法請教
小弟最近要用Deisgn vision來synthesis一些VHDL code,最後目標是能用PrimePower來測出這processor的耗電量。
/ }2 I) v  j; h/ G7 F現在卡在一個問題不得其解。
1 n! Y7 E' t- }" ~8 H; s( U* s其中Program Counter元件的code可以用ModelSim的軟體compile,可是在Design Vision卻沒辦法synthesis....., d( l2 j, g0 o$ E# p0 x" {
其error code為An if statement containing a clock event has an illegal else branch and is not supported for synthesis.8 F3 Y' a! Z; i; j( P
後來去查,才發現在synthesis的過程中,元件不能有任何timing 或 clock的描述在其中。3 k, w% w1 U. J1 t# j

$ }* A, k  E* \4 U5 @元件的碼如下
- k- X% o# u1 k9 C+ U% y0 C
& j4 I2 G; R+ Y  G        process(PCclr, PCinc, PCld, PCin)# V$ z3 M! G+ F2 J5 t/ f
        begin0 C5 r: c$ |% l: v. _4 W! t  `
                        if PCclr='1' then
) j8 @( e, S, z: u) u* Y$ k                                tmp_PC <= "0000000000000000";
. }2 {& R( Q& X; o0 D" }                        elsif (PCld'event and PCld = '1') then
; E$ \. J# @) O! k$ f8 U0 f                        --elsif PCld = '1' then        
0 s2 N, _# s) f: k                                tmp_PC <= PCin;, Z' c( C: [; q! [9 A1 c
                        elsif (PCinc'event and PCinc = '1') then0 z$ q8 O, u& ~6 T! c
                        --elsif PCinc = '1' then- x% {  R; p1 J9 F
                                tmp_PC <= tmp_PC + 1;
/ Y" _, g0 ]- W4 A& B9 d                        end if;
" m' m* L! Q7 D  B# _* C9 _! e  @2 s        end process;, {7 z+ e! B! G

: E2 Z. Z, a' z! s8 q$ z也就是說問題出現在event這個敘述。由於剛學VHDL,所以對有些字元描述不是很清楚,請問可以怎麼改寫或替換呢?
作者: yuming    時間: 2007-8-9 01:13 PM
-- 使用雙層 if 指令看看 !9 F5 T: X6 R! h( G% D4 C
process(PCclr, PCinc, PCld, PCin)
) {( T8 A9 K. y2 r3 u$ @" U% Ubegin
: _0 Z! z7 m; k2 q% u0 _% v   if PCclr='1' then  tmp_PC <= "0000000000000000";. b8 A& d0 Z( g% v$ c: N7 v4 z
   elsif (PCld'event) then
3 \& k; _' c5 v4 ~      if (PCld = '1') then, M" j  @1 N5 }
              tmp_PC <= PCin;
) |4 p9 V" w* z0 Z, O; h      elsif (PCinc = '1') then
' Z9 S# l: ~& Y# o* o5 M$ I              tmp_PC <= tmp_PC + 1;% X2 k1 J9 Q2 b3 d; a& a
     end if;% I7 T$ I$ m! S+ V# r* _/ o- r
   end if;) J$ g" P' y* U/ x4 m" C
end process;
作者: ssejack1    時間: 2007-8-9 01:39 PM
您要的是 ASYNC. LOAD/CLEAR ? 如果是建議如下:& F: ^; M" q4 B' J# N
process(PCclr, PCinc, PCld, PCin)! ?! E* [& V3 s
begin
1 P" e3 x* X, _0 c: U/ @if ( PCclr='1' or PCld ='1')then
" d& a& Q4 W6 e  `6 c5 t     if( PCclr = '1')then -- ASYNC. clear9 `3 I& c5 v0 m0 o5 t) _" c
         tmp_PC <= "0000000000000000";) K7 c$ T8 B% W( ~0 y- c; b5 b
     else -- ASYNC. load: W8 J# Z8 D5 V+ I* L( M- v6 d3 w
        tmp_PC  <= PCin;
. J( q1 p) T& N& }4 I     end if;
  K7 q1 b6 O7 I3 ~elsif (PCinc'event and PCinc = '1') then
: U% f, ^" y( Z. b     tmp_PC <= tmp_PC + 1;. s3 f7 {! B+ m8 E2 |# Z6 e% _
end if;4 _+ ^2 @0 y: x! s4 I, T7 K
end process;( B" ~7 u( |3 }: R# Y
如要的是 SYNC. LOAD / ASYNC. CLEAR 建議如下:) v7 N; _9 X' U+ v8 i
process(PCclr, PCinc, PCld, PCin)  i' g' e! q! b0 ?; c
begin
3 D" ]/ o$ ^4 c0 k8 |! y1 Zif ( PCclr='1')then
2 Z  r! m# \4 a9 K4 Y: T0 _         tmp_PC <= "0000000000000000";  q- S/ y% K3 }  o- X1 u
elsif (PCinc'event and PCinc = '1') then' J# q' w5 ^/ `  X1 l2 f
     if( PCld = '1') then   -- SYNC. load1 L7 u& q! o# u$ O
         tmp_PC <= PCin;0 C- x) t. q+ ]0 s# L
     else                        -- upcount
8 g$ G3 x) }# {& x- Q9 N3 e8 l         tmp_PC <= tmp_PC + 1;
( d- ]! r% _6 ]) S. k7 Y     end if;
6 V% [5 o. t; k- {0 q7 n4 Fend if;
) @0 Q- H9 M  qend process;
作者: day766    時間: 2007-8-10 04:47 AM
試過兩位大大的方式,還是不行。情況是,只要有event字元的出現,Design vision就會出現illegal的訊息。我之前在compile有遇過類似的情況,就是其中有些字元是用ZERO來代表"0000000000000000",可是compile的時候會說不認識這字元,所以我改成"0000000000000000",就沒問題了。現在在synthesis的時候遇到認為event是illegal,所以我想說,是不是有類似替換字元的方式可以使用?因為當我把event刪除時,synthesis就沒問題了。但這樣怕又失掉原來的功能。
作者: ssejack1    時間: 2007-8-10 09:35 AM
Sorry ! 沒仔細看啦....
7 W2 z( X( x1 M  |0 R應是< PCinc'event> PCinc空格'event 才是! ( PCinc 'evnet and PCinc='1' 是 edge trigger , PCinc='1' 是 level trigger (latch ); event illegal 應是缺<空格> 造成的吧!
作者: addn    時間: 2007-8-10 09:48 AM
您好- t1 h: K. u8 K- r: ?& a% P

& {: B. Y" k/ I0 ~' C* U應該不是event問題7 W$ W9 M) M; ]
否則Design vision不就沒辦法合成同步電路了
* u9 y3 l$ W; A, N, r9 t( H$ q
7 \: a, I% K0 s; K" D) \VHDL的語法event,Design vision應該會有支援才對/ h) s( v: B4 n
1 D5 s: O! b7 Z9 J! S
個人認為你的CODE寫法有些問題,一般COUNTER只
* B3 s! ^4 ?' c9 W) r會有一個CLOCK去驅動,而你的寫法卻有兩個(PCld'event及PCinc'event)
6 g# Y3 n) A3 w+ }! q6 U: t建義用一個全域CLOCK去做同步
作者: yuming    時間: 2007-8-10 12:52 PM
sorry ! 昨天沒看清問題 ! 問題點 就像 addn 所說的 :
4 L" `! O4 S- O現實中沒有(至少我不知道)雙 clock 驅動的 Register !/ p* b( d+ K/ u0 Q6 ?4 O
因此前一段程式是可以模擬 , 卻無法合成的 !
! P8 t1 j$ E9 j. x4 p. A4 t% o! C% J7 {8 e" U8 w6 l7 S: {
可改成如下 :
) v4 U$ T' y8 S; p1 b& f- K* z# S0 P8 k
process(PCclr, PCclk), \' x' d2 j& i- o7 S
begin1 \# }, y% A! Q* S
   if PCclr='1' then  tmp_PC <= "0000000000000000";
$ b  @& J6 A2 b* a' l. T   elsif rising_edge(PCclk) then
2 P8 @# Z  b: h5 Q1 @( ]      if (PCld = '1') then0 d2 d0 q6 c$ l: r0 W
              tmp_PC <= PCin;
. Y) Y% X: s* N5 x: {0 R      elsif (PCinc = '1') then1 V- J2 t' x% @( m
              tmp_PC <= tmp_PC + 1;' r8 `6 t/ Q/ B4 T$ N
     end if;& l. y) c8 T/ b" Z( \& o2 w  t
   end if;
* K% D8 _: K' m+ `end process;
7 {& y8 e( R" M; I7 P
4 }; J6 P: r( c但此處  PCINC 相當於只要 = '1' 就會作用 , 如何改成每次變動作用一次) V1 l- F6 w* L4 X/ A
! 就讓你試看看了 ! (PCINC 可能不只一個 clock 寬)




歡迎光臨 Chip123 科技應用創新平台 (http://free.vireal.world/chip123_website/innoingbbs/) Powered by Discuz! X3.2