|
其實在早期我遇到這類的問題也是用這樣子的方法, 近來我不太使用這個方法了, 這個方法一定可行, 但是就如你問題所說的, 會有一大堆timing的問題, 一個沒有注意到就會留下bugs: R. k+ \+ K/ X
# `3 y6 {$ t1 g( P$ N; U0 w
你的思考很周詳, 顧慮也都沒有錯, 繞在一堆timing打轉時, 腦袋一定很吃力.5 r5 s& ?2 }" v0 X7 J
0 b) r' _9 s( n回到我本來的答案, 加以修改還是可以解決你的問題, 在一堆timing打轉時, 一定要非常小心什麼時候會出現什麼信號, 以及這個信號跟別的一大堆信號之間的關係, 只要這些關係都弄清楚的話的, 自然會慢慢的有答案, 在找到不會有問題的答案之前已經不知道跑了多少次的模擬了. 我講的這些你一定很清楚而且感同身受...6 e8 K# P/ M* ]" Y; [) O/ S$ q8 s
( M) V# x" q* F% E8 d
有人說做演算法實現的人比較厲害, 看看這麼多的問題, 幾乎不會出現在演算法實現上, 所以我常常覺得不認同這句話. 一些AE在使用別人設計的IC時常會不保留的直接批評, 殊不知IC designer在這上面花了多少苦心, 深深害怕一個不小心, 多少心血就要再來一次...
2 A( y$ Y1 E& y* L# { T9 g0 S& p
7 {9 h; ~9 r, L4 r. j5 j% u對於你的問題我可以給另一個建議: 很多時候我們常會思考說, 當什麼信號或者狀態出現時, 要做什麼相對的回應, 只是我覺得這個回應不見得必須是即時的. 舉個例子, 在/RD出現時並不是非得把對的資料送出去不可, 在/RD的falling edge到rising edge之間的時間還很長, 資料只要在rising edge加上setup time時間之前送出去就可以確保資料的正確無誤(當然是愈早愈好), 這中間還有好長的時間可以做很多事的. 要啟動一個事件去做一件事也不見得只有一個狀態, 例如在/RD之前, /CS一定會先出現, 這中間一定還有什麼好處可以做什麼事的(這只是個假設, 因為有時會遇到AE把/CS直接接地或者讓/CS跟/RD, /WR一起出現的CASE)2 ^; C- t: E0 a- N' l9 D/ v
3 G* Y. ?( Y- B4 g另外你可能對我講的handshake有點誤解, 很抱歉應該是我沒講清楚造成的* b5 |! v: D9 P5 g+ Z7 f9 Q
在research上有個電路叫asynchronize circuit直接翻譯就變成了非同步電路, 講非同步電路有時會令人誤解, 有時講非同步電路時講的是單純的類似ripper counter那類的電路, 在research上的非同步電路是利用一些handshake的方法來完成, 資料的交換之間並沒有clock, 當然也可以快速且正確的完成工作, 跟16550的時序是沒有任何關係, 就算你整個設計都用asynchronize circuit來完成, 還是可以做到interface timing跟16550完全相容. , c( ?1 L5 z1 A' u" I# o$ {7 s1 Q+ o
至少目前, 我遇到這類問題時都用這樣子的方法來實現, 硬體不見得比較大, 電路也比較穩定.
( z! U/ l5 N3 C( ^2 G+ y! I. C4 O! T& ]. o9 P2 _
講了這麼多似乎沒有直接回答你的問題, 不過討論這類的問題常需要一來一回的, 這樣PO文似乎不太有效率, 所以我先分享一些我的經驗給你看看, 看是否對你會有所幫助. |
|