2011年12月30日 星期五

2011/10/31 "#"之信號延遲

今天上課的內容以"display"為主。

除了字串的印出之外,
其餘變數數值印出皆和C語言相同,
唯一不同的是verilog可以直接印出變數的數值。
Verilog本身是個和時間控制息息相關的程式語言,
程式中必須要有"initial"讓程式知道哪邊是程式的起點,
否則編譯後會顯示有錯誤。
如下圖,即使有信號延遲,但編譯器並不知道起點到底是什麼時候。
(正確範例請參照之前的文章)















而且每使用一次display就要用一個initial告知開始時間,
否則會一直有階段的編譯錯誤信息。
但這麼麻煩的話早就沒有人要用了,
這裡Verilog採用和MATLAB相似的用法,
那就是"begin"和"end"來當作昔日C語言的大括號,
而且適當的搭配initial和#的信號延遲,
就可以產生出奇特的輸出順序,
以下先來個錯誤範例:
















#後面的數字代表延遲的時間,
但顯示結果明顯的和期望的不同,
這是因為程式執行只要碰到#就會停下來,
等到延遲的時間到了為止,
應此第二行句子變成延遲了7個系統時脈後才印出,
而非延遲短的先印出。
要改善這樣的問題,
當然就是要有兩個時間起點,
也就是兩組initial:
















如此一來輸出的結果就符合文法和文意了。

最後再次強調,
display本身並不是個電路上的IC功能,
但在設計電路時,
適當的信號輸出可以幫助偵錯進展的速度。

另外稍微提到的是$wirte函數,
其實C語言的printf和wirte比較相似,
只要沒有要求(\n)就不會有換行的指令,
反觀display則是和C語言的put系列函數類似,
他們本身就含有\n的指令。

沒有留言:

張貼留言