Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

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

[複製鏈接]
跳轉到指定樓層
1#
發表於 2007-8-8 19:44:39 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
小弟最近要用Deisgn vision來synthesis一些VHDL code,最後目標是能用PrimePower來測出這processor的耗電量。
3 a6 I; O9 s3 o4 o1 y1 r) ]現在卡在一個問題不得其解。
4 t- ]" Z, h- m其中Program Counter元件的code可以用ModelSim的軟體compile,可是在Design Vision卻沒辦法synthesis.....6 I! w* d  L9 Z5 |8 z
其error code為An if statement containing a clock event has an illegal else branch and is not supported for synthesis.; n5 p; [+ ^6 B8 b; m. p. d; ]
後來去查,才發現在synthesis的過程中,元件不能有任何timing 或 clock的描述在其中。
4 M7 l. O* _- j( U2 v, ?
2 c0 U+ B1 d2 k: ^5 _元件的碼如下
4 }' _+ ]: N0 G: O
4 y; ^; ?0 a0 R5 e& g- J& b        process(PCclr, PCinc, PCld, PCin)6 ]; X) T1 {: V) t
        begin
. n8 G$ z% x* P                        if PCclr='1' then
* m6 f/ k2 @1 z& d; M                                tmp_PC <= "0000000000000000";) W  G/ t. j' R- f9 I( T& Q& q3 S4 [
                        elsif (PCld'event and PCld = '1') then, W& J: Z: P3 A
                        --elsif PCld = '1' then        " \" Y. h9 t+ ^- [- F/ ?
                                tmp_PC <= PCin;
8 L4 G/ H  l5 p0 C- }5 M8 n/ f# g                        elsif (PCinc'event and PCinc = '1') then, A/ {4 \4 F5 t8 p6 m, B; k- s2 D, T
                        --elsif PCinc = '1' then1 G7 N+ O0 N& ?1 E0 W! d4 O; n! `
                                tmp_PC <= tmp_PC + 1;- ]6 y4 T1 J( s4 J: j
                        end if;
4 b% v. V' z5 t8 P) B7 d7 n        end process;
' r4 A0 C+ v3 y% @% N
0 a* s* K9 [' d% X也就是說問題出現在event這個敘述。由於剛學VHDL,所以對有些字元描述不是很清楚,請問可以怎麼改寫或替換呢?
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂 踩 分享分享
2#
發表於 2007-8-9 13:13:46 | 只看該作者
-- 使用雙層 if 指令看看 !
  B: q5 T8 D! c, m1 Jprocess(PCclr, PCinc, PCld, PCin)1 ~$ _$ l7 i3 j* }5 g7 _1 _4 E
begin) ~* `& z$ @5 x5 h9 T3 K# S
   if PCclr='1' then  tmp_PC <= "0000000000000000";; B; f9 z- ]$ u( H! m  Y
   elsif (PCld'event) then/ [& m8 I/ G8 q9 a0 L6 e, R
      if (PCld = '1') then7 o! P6 q: n2 O3 C, P
              tmp_PC <= PCin;1 m* ?8 j; y" K8 Q! ~$ l/ B& Q
      elsif (PCinc = '1') then
- B6 }9 ~7 ~/ r" U' b! u              tmp_PC <= tmp_PC + 1;
; v7 Q; S# a5 P* F. b     end if;/ B9 p8 M  t4 ^' s3 q2 f/ J
   end if;
( u8 o( M+ p% wend process;

評分

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

查看全部評分

3#
發表於 2007-8-9 13:39:33 | 只看該作者
您要的是 ASYNC. LOAD/CLEAR ? 如果是建議如下:) b# t7 p& [$ T8 A. z/ e
process(PCclr, PCinc, PCld, PCin)) k! L/ G, [: w: {  t2 @
begin; r8 G7 d+ a. O9 a
if ( PCclr='1' or PCld ='1')then
) \9 N  t& w3 \+ c2 Q     if( PCclr = '1')then -- ASYNC. clear# \; O* H! y  k6 ~. o
         tmp_PC <= "0000000000000000";5 ^; C8 v, G' d. Z+ a4 L8 ~
     else -- ASYNC. load
- `) o* v$ m' L. z  v        tmp_PC  <= PCin;
& e# G0 \: a  d* S) z     end if;5 L! k$ X: L! M( l& E5 E
elsif (PCinc'event and PCinc = '1') then
$ C7 _" k" C# G! I7 _" Z) X+ h5 N     tmp_PC <= tmp_PC + 1;) U: Q: g7 v0 G8 P* `) M9 @
end if;/ ]: B. c, o* N
end process;
, e5 ~/ s. q/ U/ ?如要的是 SYNC. LOAD / ASYNC. CLEAR 建議如下:2 W8 R/ s4 q' N4 S* t
process(PCclr, PCinc, PCld, PCin)4 g" L. D0 B) A$ N8 I8 i' J- h
begin) _1 v) p3 k  u) r3 u# x
if ( PCclr='1')then
% ?! t! r" b/ R; x, K         tmp_PC <= "0000000000000000";5 U9 `' W9 [3 n7 w# u- U
elsif (PCinc'event and PCinc = '1') then
% A! m" I! M4 u1 [0 p) Q     if( PCld = '1') then   -- SYNC. load/ h8 y' `/ o. ~# z: e
         tmp_PC <= PCin;
" z4 W4 v, b8 }     else                        -- upcount
  Z3 h# Z; Q4 e- Y         tmp_PC <= tmp_PC + 1;
1 A+ h, a2 |5 P     end if;/ |- r- l- b* N3 k* d4 A
end if;# w& j: A4 d6 e- t
end 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 ! 沒仔細看啦.... 5 o8 a9 {7 ]7 n* _
應是< 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 | 只看該作者
您好
, V. h) ^! u4 a& b& R' t5 r) U2 Y, W7 Q( O
應該不是event問題  f8 c/ d" _0 ~, I" |
否則Design vision不就沒辦法合成同步電路了& X5 q9 j( t; ^

8 g+ i) V3 R1 s* m5 OVHDL的語法event,Design vision應該會有支援才對9 n; G* b  j9 ~0 h& D

/ k4 }7 h8 y: d$ d9 y6 s/ b個人認為你的CODE寫法有些問題,一般COUNTER只  f5 N5 J2 D/ Y$ _/ b
會有一個CLOCK去驅動,而你的寫法卻有兩個(PCld'event及PCinc'event)" C1 o! D, u7 H. `' V+ k$ h9 [( F& @
建義用一個全域CLOCK去做同步

評分

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

查看全部評分

7#
發表於 2007-8-10 12:52:45 | 只看該作者
sorry ! 昨天沒看清問題 ! 問題點 就像 addn 所說的 :
$ _( I- X" u% q& n$ x現實中沒有(至少我不知道)雙 clock 驅動的 Register !
$ Z) |1 \" O* p7 c因此前一段程式是可以模擬 , 卻無法合成的 !
2 O1 P, |* s+ {6 u" J0 V, f
. n1 `/ J! Q2 d& h$ M可改成如下 :
1 L2 [, F- I( h2 g( j: H0 w- c* |  z% y  Z. H
process(PCclr, PCclk)1 Z2 h7 E2 K, g! {1 ^0 k
begin; r3 a3 i+ H0 _( {
   if PCclr='1' then  tmp_PC <= "0000000000000000";
# C; z+ w. }5 g' _% `& ^   elsif rising_edge(PCclk) then3 e: v% w6 \" y. x8 ^
      if (PCld = '1') then
# d% Y: y; q) `- [& `( c; V* o              tmp_PC <= PCin;/ Q! m2 B1 U. s
      elsif (PCinc = '1') then
% z% E- L: J% L; u              tmp_PC <= tmp_PC + 1;
! ?5 u9 p: H* |- N% _+ g     end if;  q& Y' ^& y$ ~; A! g
   end if;
7 c5 l! I7 S) O# L9 B  O& Cend process;
9 _7 G* ~) h; i7 b$ j
6 @* j9 d. }& a" T) _2 N但此處  PCINC 相當於只要 = '1' 就會作用 , 如何改成每次變動作用一次0 E( e+ a; h* A
! 就讓你試看看了 ! (PCINC 可能不只一個 clock 寬)
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-11-18 12:49 AM , Processed in 0.160010 second(s), 18 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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