Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

搜索
1 2 3 4
查看: 8084|回復: 6
打印 上一主題 下一主題

[問題求助] VHDL基本語法請教

[複製鏈接]
跳轉到指定樓層
1#
發表於 2007-8-8 19:44:39 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
小弟最近要用Deisgn vision來synthesis一些VHDL code,最後目標是能用PrimePower來測出這processor的耗電量。
9 w9 V4 e+ ^6 ^4 q  @% V現在卡在一個問題不得其解。' i) @: v, U2 l' W
其中Program Counter元件的code可以用ModelSim的軟體compile,可是在Design Vision卻沒辦法synthesis.....& l9 c. g$ w. ?4 S8 S
其error code為An if statement containing a clock event has an illegal else branch and is not supported for synthesis.  \+ e" {! b  t, j! E* F
後來去查,才發現在synthesis的過程中,元件不能有任何timing 或 clock的描述在其中。4 f$ B, l" A; Q) n2 L* h% w. N
1 C* \& Y5 M' b$ h+ |0 m, \
元件的碼如下. e  |4 A1 P3 X! e1 ?  X& G
% s2 l' }: b2 Q0 X4 V
        process(PCclr, PCinc, PCld, PCin)
3 ~- I3 R& J; j5 K% e) k, j1 B        begin* V- b' U6 q- I3 _. i& X
                        if PCclr='1' then
" q* U6 t. d. i$ U+ i                                tmp_PC <= "0000000000000000";
) M0 @# M" l: U5 k$ L, H                        elsif (PCld'event and PCld = '1') then; k+ h  M6 l9 z9 x9 Z0 p
                        --elsif PCld = '1' then        
( k: P& P  Q0 s( y  W% E7 q                                tmp_PC <= PCin;
9 C' o% ~* t8 {$ J* ~7 H  \, f4 a                        elsif (PCinc'event and PCinc = '1') then
) U" }' D7 a8 M7 A                        --elsif PCinc = '1' then
2 A0 B8 v- W8 c7 K; s" }0 P; {* w                                tmp_PC <= tmp_PC + 1;% H  r. K& j9 A. `1 g
                        end if;
: X3 I1 F' ?+ ]        end process;! s3 R8 }/ M( c$ x, N

3 g! N" U" z, I( a: N& R) U1 E也就是說問題出現在event這個敘述。由於剛學VHDL,所以對有些字元描述不是很清楚,請問可以怎麼改寫或替換呢?
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂 踩 分享分享
2#
發表於 2007-8-9 13:13:46 | 只看該作者
-- 使用雙層 if 指令看看 !
  ]7 t& j1 A$ `- Vprocess(PCclr, PCinc, PCld, PCin)
4 O( m) n* w8 ^# g6 kbegin
4 C" D; M! f0 ]9 c4 V4 W5 R   if PCclr='1' then  tmp_PC <= "0000000000000000";0 w* D# l- f3 L# e  Y+ d
   elsif (PCld'event) then
0 }2 W" d4 s( U$ F6 T: ~      if (PCld = '1') then/ G& z, d- V' J# t  i& j( }
              tmp_PC <= PCin;
6 D6 h" a( C7 t  x      elsif (PCinc = '1') then# P/ K7 q0 r! l' Z7 _
              tmp_PC <= tmp_PC + 1;
$ u$ A1 X; P5 _     end if;
9 ?: G, [  ?* p' |! `. O   end if;8 S1 a/ Z% {: O4 \( j
end process;

評分

參與人數 2Chipcoin +5 +5 收起 理由
tommywgt + 5 多謝補充!
day766 + 5 非常感謝!我會去試試看的!

查看全部評分

3#
發表於 2007-8-9 13:39:33 | 只看該作者
您要的是 ASYNC. LOAD/CLEAR ? 如果是建議如下:
7 d+ C( K; w$ ]: F: f- Vprocess(PCclr, PCinc, PCld, PCin)! m5 B2 w) W5 u& N/ S/ [
begin
: k0 D4 x, [# u4 g# bif ( PCclr='1' or PCld ='1')then, U' m- q. v8 ]' f$ G' }
     if( PCclr = '1')then -- ASYNC. clear! @- I8 u3 G% G2 f$ A6 @
         tmp_PC <= "0000000000000000";1 h0 n$ {7 P  A6 ?' D4 T' z7 ~" Q
     else -- ASYNC. load2 l" G( o0 f2 Y
        tmp_PC  <= PCin;
/ r" }4 W& K) X& ~: r     end if;
4 v) n% P, M0 C+ p* }; Velsif (PCinc'event and PCinc = '1') then/ U: ^6 j/ X: y; c$ W( ~2 c
     tmp_PC <= tmp_PC + 1;. ^- \; j1 C3 D( y: r
end if;, ], e1 G3 j5 M+ x  ]% y
end process;& L2 e! j* U2 U( u+ h' s
如要的是 SYNC. LOAD / ASYNC. CLEAR 建議如下:
5 q4 d% I, W: Aprocess(PCclr, PCinc, PCld, PCin)
6 I) S% n( z1 ?9 h4 {- Ebegin/ q9 ?& {, T" U( l% e9 G3 o
if ( PCclr='1')then5 J7 @5 z* K# Y+ q* _  L6 L) E
         tmp_PC <= "0000000000000000";- k1 R" O' I$ E  _# W
elsif (PCinc'event and PCinc = '1') then: w' c$ P, o3 V7 w* w
     if( PCld = '1') then   -- SYNC. load) w/ U" B2 `6 o& g+ g% a
         tmp_PC <= PCin;3 L2 B* \4 K  Z" d/ ]
     else                        -- upcount3 ]  c9 v: p6 ?& E
         tmp_PC <= tmp_PC + 1;( F0 k! F* o0 L4 Y* p* l
     end if;8 W4 C7 n, R( c2 U, P
end if;
+ F' ^/ ^4 G" z3 E- I. g" Kend process;

評分

參與人數 2Chipcoin +5 +5 收起 理由
tommywgt + 5 多謝補充!
day766 + 5 非常感謝!我去試試看!不過,這兩者的 ...

查看全部評分

4#
 樓主| 發表於 2007-8-10 04:47:08 | 只看該作者
試過兩位大大的方式,還是不行。情況是,只要有event字元的出現,Design vision就會出現illegal的訊息。我之前在compile有遇過類似的情況,就是其中有些字元是用ZERO來代表"0000000000000000",可是compile的時候會說不認識這字元,所以我改成"0000000000000000",就沒問題了。現在在synthesis的時候遇到認為event是illegal,所以我想說,是不是有類似替換字元的方式可以使用?因為當我把event刪除時,synthesis就沒問題了。但這樣怕又失掉原來的功能。

評分

參與人數 1Chipcoin +5 收起 理由
tommywgt + 5 有感謝有鼓勱

查看全部評分

5#
發表於 2007-8-10 09:35:53 | 只看該作者
Sorry ! 沒仔細看啦....
2 o- l' Z1 G9 M; Z/ b應是< PCinc'event> PCinc空格'event 才是! ( PCinc 'evnet and PCinc='1' 是 edge trigger , PCinc='1' 是 level trigger (latch ); event illegal 應是缺<空格> 造成的吧!
6#
發表於 2007-8-10 09:48:41 | 只看該作者
您好
; w$ F$ n0 E" v. i
; S6 n3 K, ?' j5 _應該不是event問題  f7 o" B9 j8 I
否則Design vision不就沒辦法合成同步電路了
# I, T9 v& p$ c3 F0 P6 i7 r; J, b
) m, k6 p6 q; k# ?0 ~* c$ M6 ?VHDL的語法event,Design vision應該會有支援才對3 s* h. \7 K* j" v9 f

+ B4 Q/ f% U% M( E6 j0 q* U5 Z個人認為你的CODE寫法有些問題,一般COUNTER只: F# K5 Q+ t( C& E  U7 o% A
會有一個CLOCK去驅動,而你的寫法卻有兩個(PCld'event及PCinc'event)
. Y* W5 Z0 w/ ]1 |建義用一個全域CLOCK去做同步

評分

參與人數 2Chipcoin +5 +5 收起 理由
day766 + 5 非常感謝!
tommywgt + 5 一針見血

查看全部評分

7#
發表於 2007-8-10 12:52:45 | 只看該作者
sorry ! 昨天沒看清問題 ! 問題點 就像 addn 所說的 :
  ]. g6 c% U* I+ K現實中沒有(至少我不知道)雙 clock 驅動的 Register !
7 B( R: J* e, Z9 B因此前一段程式是可以模擬 , 卻無法合成的 !
: y2 g9 A& N7 R
0 O1 a3 d) L& c: B1 i( S# z可改成如下 :5 m9 }2 h: A. a) u6 ?
1 m$ ]5 U) R0 O8 k- Z/ [
process(PCclr, PCclk)
3 S1 @" V$ O" P, L1 U- u( e! pbegin; O+ B" U4 }$ ~6 H
   if PCclr='1' then  tmp_PC <= "0000000000000000";
4 K1 H7 y: `/ |1 F/ Y, j   elsif rising_edge(PCclk) then
$ ]( y& T6 c- Y& }+ t      if (PCld = '1') then
! i. Z! S+ Z3 }' i6 P              tmp_PC <= PCin;: s$ q# F9 b8 M+ ]$ h! ?5 A# G
      elsif (PCinc = '1') then
# U) l, p% B/ w1 w, }              tmp_PC <= tmp_PC + 1;
! S4 A+ t% K; H5 R$ ?. f) [2 ]     end if;& w% c- d, K9 ?$ T7 X
   end if;
( @2 X7 H; O* d1 t' pend process;
9 }; k# Q! v& X8 n5 X8 F" s" s7 e! s
但此處  PCINC 相當於只要 = '1' 就會作用 , 如何改成每次變動作用一次6 i& @/ E4 c) {
! 就讓你試看看了 ! (PCINC 可能不只一個 clock 寬)
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

首頁|手機版|Chip123 科技應用創新平台 |新契機國際商機整合股份有限公司

GMT+8, 2024-6-14 04:11 PM , Processed in 0.121515 second(s), 18 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回復 返回頂部 返回列表