|
回復 #7 greatsky 的帖子
你要先分清楚在這個Verilog code中,哪些東西是會被合成電路的,哪些不會被合成電路。`ifdef 與verilog 的if是不一樣層級的東西。討論Verilog的時候最好不要用『執行』這樣的字眼。所以,把你的例子用比較正確的字眼來說,應該是這樣
; H) w! x, C9 b8 a% h% a* U/ G1 Z9 q) u8 ~1 s. l, E: W0 T
若有定義ASYNC_RESET則合成器會使用always@(posedge clk or negedge rst)這一行來進行電路合成。反之,則使用always@(posedge clk)這一行來合成。我們可以看一下,如果有定義ASYNC_RESET的話,會被合成的verilog如下:, H K5 t1 m' l# z' S7 B E: q
always @(posedge clk or negedge rst), p2 ^. ~& w8 ~ R
if(!rst)
" T. @ Q" N, p state <= POR;* W( _, U2 }+ i8 u4 Q& ^- B
else 4 v o0 V7 \0 T6 s. p
if(vbus)
9 g% ?1 `: q! T" t4 I7 r8 p state <= POR;) P: H6 {9 Q- F r
else 5 w( T, O& N# H) Z1 |8 ^; i, W
state <= next_state;
4 G9 @& v2 ?7 M+ |+ X$ l7 k
2 \' N! C# |, W$ j這很明顯的就是一個非同步reset的電路。反之,如果沒有定義ASYNC_RESET,會被合成到的verilog code如下:# f, G4 t3 x) r- y
7 ^. N3 ^5 K1 y- halways @(posedge clk)
2 e- h3 ]0 C W( Rif(!rst)
- e' c1 Y# {6 l state <= POR;1 m6 ^) h" F" _4 v; M: a/ ^8 C0 X F
else ( {6 F4 o/ P6 b
if(vbus)
. A* q& @5 j7 B+ T& _" m/ O state <= POR;. o& B# u0 N$ H: D' @5 m |
else
6 Y# ^5 A" ]% e state <= next_state;
+ f: ?! `; X8 j& H& o- K; F
* v1 b7 c" Y3 M這就是一個明顯的同步RESET電路。
8 K- ?" g0 @* U8 q& D8 p5 C4 g8 d! @! T- h
透過不同的條件定義,就可以在不更動verilog code的前提下,合成出不同行為的電路。這是Verilog的一個很好用的功能。這個功能如果換到軟體程式語言,就是C語言裡面的前置處理器(preprocessor)的功用。5 P7 R/ n i0 h# a; T% T' |8 {( g
1 C! ?* ~3 s1 g! b你會找不到ASYNC_RESET定義在哪裡是正常的。因為這類的東西通常就是由工具的命令列直接給定的。如果你的project目錄內有Makefile,通常也可以在那裡面找到是否有定義ASYNC_RESET。 I( K& g3 V, ~; a( V. w
4 |7 `4 [; M+ @5 R5 c' `# G最後你衍生出來的問題,其實才是重點,何時要用非同步reset,何時要用同步reset。下面這篇文章應該可以給你一個滿意的答案。
& }& g5 k/ |6 ?' v) ^) S, rhttp://www.sunburst-design.com/p ... UG2002SJ_Resets.pdf |
評分
-
查看全部評分
|