|
回復 #7 greatsky 的帖子
你要先分清楚在這個Verilog code中,哪些東西是會被合成電路的,哪些不會被合成電路。`ifdef 與verilog 的if是不一樣層級的東西。討論Verilog的時候最好不要用『執行』這樣的字眼。所以,把你的例子用比較正確的字眼來說,應該是這樣7 s0 o. c5 ?1 p4 ~
& f. p# ^8 A$ L6 f* |若有定義ASYNC_RESET則合成器會使用always@(posedge clk or negedge rst)這一行來進行電路合成。反之,則使用always@(posedge clk)這一行來合成。我們可以看一下,如果有定義ASYNC_RESET的話,會被合成的verilog如下:7 N" e/ z) `) @, c
always @(posedge clk or negedge rst)6 e9 _1 F; _- a# T* \ x
if(!rst) ! I. h- q+ ]( z3 e; z/ W9 i* y
state <= POR;, V3 C2 T8 w# A/ T7 e
else + Q- [. V# E3 Y4 {2 y0 \
if(vbus) 9 [ [/ }( {, r3 J. z
state <= POR;1 \' @( g" ]( C! y- _, X
else
( r6 _- q6 `: }0 Y5 B; G2 L state <= next_state;
5 [- x6 c! l/ v+ s6 [
" q" f2 P0 j/ j這很明顯的就是一個非同步reset的電路。反之,如果沒有定義ASYNC_RESET,會被合成到的verilog code如下:
. t* F* F! U) _( k. w# j+ o- Q+ `/ W$ D6 n% }; _
always @(posedge clk)
, m- H, ?, o/ d- h' o: m% uif(!rst) . d3 P- {* s, }: z2 J" o' m
state <= POR;
; F2 ?7 Q5 V. lelse * ]! U7 c& S! @' ]2 G: [
if(vbus) # C* d( X3 w8 g' q
state <= POR;
* S1 I |$ @& `) `9 g b" z0 I else
5 t4 s# o! H. }0 J' [2 u state <= next_state;1 U: k7 Z8 A0 z4 ]- _
4 i! o% Z; E% e& t8 M( U這就是一個明顯的同步RESET電路。' p1 A* W4 `- T' a' w. ^) f
! x/ n' K+ M t( L! T$ q透過不同的條件定義,就可以在不更動verilog code的前提下,合成出不同行為的電路。這是Verilog的一個很好用的功能。這個功能如果換到軟體程式語言,就是C語言裡面的前置處理器(preprocessor)的功用。
# B+ Q! k; P: R$ M3 O( D# ~( g
你會找不到ASYNC_RESET定義在哪裡是正常的。因為這類的東西通常就是由工具的命令列直接給定的。如果你的project目錄內有Makefile,通常也可以在那裡面找到是否有定義ASYNC_RESET。7 f9 J" K# x- }, ~
6 o8 A5 t6 r( k7 B* M& O2 Z: L
最後你衍生出來的問題,其實才是重點,何時要用非同步reset,何時要用同步reset。下面這篇文章應該可以給你一個滿意的答案。: g+ X/ A' Z' G7 @1 k, A
http://www.sunburst-design.com/p ... UG2002SJ_Resets.pdf |
評分
-
查看全部評分
|