Chip123 科技應用創新平台

 找回密碼
 申請會員

QQ登錄

只需一步,快速開始

Login

用FB帳號登入

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

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

[複製鏈接]
跳轉到指定樓層
1#
發表於 2007-8-8 19:44:39 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
小弟最近要用Deisgn vision來synthesis一些VHDL code,最後目標是能用PrimePower來測出這processor的耗電量。
# \7 P. x! M3 H. p/ J- A& s; d現在卡在一個問題不得其解。( O% R4 {* U9 ]1 U) X' q
其中Program Counter元件的code可以用ModelSim的軟體compile,可是在Design Vision卻沒辦法synthesis.....- }# i7 b9 p& z- D6 t6 H% _2 p6 u& P
其error code為An if statement containing a clock event has an illegal else branch and is not supported for synthesis.9 B( M5 }( k; w. K4 }
後來去查,才發現在synthesis的過程中,元件不能有任何timing 或 clock的描述在其中。
  N: p1 N5 ^, b. [4 v- f5 N' [$ P9 U
9 ~, U$ E& I" _7 t7 {/ o- C元件的碼如下: w8 X/ m; t8 C3 O8 S5 ?

6 H/ n5 e! S! B5 |0 B3 |4 O, a        process(PCclr, PCinc, PCld, PCin)
; B  u- A4 _# D! N6 @        begin
  L' f3 X9 b/ E2 _3 L: j                        if PCclr='1' then3 G0 }; a6 @4 }4 ~3 V! S
                                tmp_PC <= "0000000000000000";1 p% q4 {8 M8 q8 Z3 W6 C
                        elsif (PCld'event and PCld = '1') then
6 c/ }; F! h5 i& F; g8 M& K6 ]                        --elsif PCld = '1' then        
4 z+ U$ \2 g* v                                tmp_PC <= PCin;( k+ t2 p0 F" r
                        elsif (PCinc'event and PCinc = '1') then
; t8 b0 b, A+ T9 |$ R( W) i                        --elsif PCinc = '1' then
  f* q7 `) o% x' M" m2 }' B                                tmp_PC <= tmp_PC + 1;# C6 H; ^7 o( X. o* ^4 |/ p  [# K
                        end if;  \* c# q+ j, j# k* t, P
        end process;6 d3 c$ e. c( `. J  ^7 D

, q- q$ F) X; a6 r* ^) L' r, V, x也就是說問題出現在event這個敘述。由於剛學VHDL,所以對有些字元描述不是很清楚,請問可以怎麼改寫或替換呢?
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享分享 頂 踩 分享分享
2#
發表於 2007-8-9 13:13:46 | 只看該作者
-- 使用雙層 if 指令看看 !; A- G  r( g( S6 Z3 u
process(PCclr, PCinc, PCld, PCin)4 L1 E4 h$ W. k% T
begin2 B7 Y, a8 p; A
   if PCclr='1' then  tmp_PC <= "0000000000000000";. [$ A8 p' @# c, @, i  |: o
   elsif (PCld'event) then8 A: X) K) B' }- {- }
      if (PCld = '1') then2 W( f( c# n/ T
              tmp_PC <= PCin;
+ D. i+ u( Y3 h: A3 b8 l3 b* x( n      elsif (PCinc = '1') then
7 ]; P% L3 n0 S2 C2 U2 R              tmp_PC <= tmp_PC + 1;
! v2 j2 o7 f1 ~6 J. W' x/ [     end if;
) N4 i7 U+ M: x   end if;
; }- @% g& }# V! O3 }( v2 zend process;

評分

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

查看全部評分

3#
發表於 2007-8-9 13:39:33 | 只看該作者
您要的是 ASYNC. LOAD/CLEAR ? 如果是建議如下:% x( `: C5 j; H- \+ n
process(PCclr, PCinc, PCld, PCin)
: j# p4 X# u7 nbegin
. ^- P9 m1 C& F: o& m9 Y7 J; {if ( PCclr='1' or PCld ='1')then
& k3 ^/ u6 U. M8 G  {3 T+ v$ o/ f     if( PCclr = '1')then -- ASYNC. clear
+ Z+ E! N4 J; E# o         tmp_PC <= "0000000000000000";
  ]- m. K( f" {" Z3 ]% g7 I5 p/ B     else -- ASYNC. load2 T- A4 L- t, i
        tmp_PC  <= PCin;
0 t5 s, U1 N2 D& H8 \     end if;
2 |9 P/ K9 p( S& d$ ~; U8 Xelsif (PCinc'event and PCinc = '1') then
. G9 r; n# j) C' R3 a3 y4 j     tmp_PC <= tmp_PC + 1;& t: e9 V. U/ E7 D9 }
end if;6 }; Y1 J5 ~) p
end process;+ ~$ @# J" W; N7 [7 d3 L
如要的是 SYNC. LOAD / ASYNC. CLEAR 建議如下:4 J( g2 c* b1 n9 n. r* l0 G
process(PCclr, PCinc, PCld, PCin)' E- {; W- o, A# m
begin" E3 r- n( ~' J8 t& f5 A. U$ ^& Z, V
if ( PCclr='1')then' @  P4 @$ k: u
         tmp_PC <= "0000000000000000";
  J# y% M% p% v; M# B) C$ j8 i$ lelsif (PCinc'event and PCinc = '1') then
+ V, z3 h/ `' W% q     if( PCld = '1') then   -- SYNC. load
$ e6 g5 V4 V7 w* S' W         tmp_PC <= PCin;
$ S+ X5 F7 ]5 ?4 a/ p' a     else                        -- upcount
8 ]0 X2 [# K+ x. q4 T8 X; }( b         tmp_PC <= tmp_PC + 1;
3 E1 S7 v; a, m     end if;
/ l# m7 p0 w3 R$ J" [end if;
1 o# W" f9 P5 |8 Iend 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 ! 沒仔細看啦.... " g5 Q) V; t+ e
應是< 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 | 只看該作者
您好
0 Q4 ~: U- G" a- K/ R# R  E
6 c0 o: F  K; C+ v7 x應該不是event問題2 J2 M4 |1 Q% v8 D1 a
否則Design vision不就沒辦法合成同步電路了0 D# I: y7 V- w7 M3 j# R% K: G
! A5 P# b% i+ L8 J, y8 I. E. Z! x
VHDL的語法event,Design vision應該會有支援才對6 {% Y9 F7 [! @
2 V  R! E6 ~$ A3 p
個人認為你的CODE寫法有些問題,一般COUNTER只; L/ C8 c3 h3 C. Z$ H5 [" O. A
會有一個CLOCK去驅動,而你的寫法卻有兩個(PCld'event及PCinc'event)- q# Z- Y$ q4 F1 T. `! n
建義用一個全域CLOCK去做同步

評分

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

查看全部評分

7#
發表於 2007-8-10 12:52:45 | 只看該作者
sorry ! 昨天沒看清問題 ! 問題點 就像 addn 所說的 :
" j* _! [- P" ?6 k1 y3 X; R! m- G現實中沒有(至少我不知道)雙 clock 驅動的 Register !
! y/ U; G$ u. j8 J因此前一段程式是可以模擬 , 卻無法合成的 !
7 h/ x& \  Y5 f% r  ^4 a1 N9 x( B8 x' k/ e4 z# L; a) C4 D8 h
可改成如下 :2 Z- T5 [# u4 r7 |& o% e& A
  g. k7 |( k0 d
process(PCclr, PCclk)5 y1 ]& Y; S: M. u
begin
( V# n' m* I7 Q   if PCclr='1' then  tmp_PC <= "0000000000000000";
$ }2 p. P" |' @. D   elsif rising_edge(PCclk) then
$ @( W" X7 ?2 p      if (PCld = '1') then  }) g2 }- D  X) ^8 Y1 j
              tmp_PC <= PCin;
2 I  D$ N; L- N5 }5 e      elsif (PCinc = '1') then4 I1 Y, |6 o) G) z' d3 |" P# ^  S
              tmp_PC <= tmp_PC + 1;
: o; j8 T  E$ z! P* S6 m     end if;
+ b+ b0 q$ [. c- J6 O1 j   end if;; K/ D' P7 l5 G1 O9 N5 y! `8 w: P+ u0 t/ z
end process;
$ @6 \, [  t9 f( T7 y' Q( P* i7 o" D2 Y4 i" z( B
但此處  PCINC 相當於只要 = '1' 就會作用 , 如何改成每次變動作用一次. Y4 p4 t7 A) x) u( d
! 就讓你試看看了 ! (PCINC 可能不只一個 clock 寬)
您需要登錄後才可以回帖 登錄 | 申請會員

本版積分規則

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

GMT+8, 2024-12-29 09:26 AM , Processed in 0.170010 second(s), 25 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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