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
begin
0 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') then
0 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% U
begin
: _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. clear
9 `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 Z
if ( 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. load
1 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 F
end if;
) @0 Q- H9 M q
end 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. A
4 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
begin
1 \# }, 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') then
0 d2 d0 q6 c$ l: r0 W
tmp_PC <= PCin;
. Y) Y% X: s* N5 x: {0 R
elsif (PCinc = '1') then
1 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