1.同步動態掃描 多個數位管的顯示採用的是同步動態掃描方法,同步動態掃描指的是:行信號和列信號同步掃描,是一種並行操作。 2.數位管驅動電路實現思路 如果要求數位管顯示我們想要的數字,首先需要寫一個數據接收模塊,這個模塊接收數據之後需要做什麼樣的處理呢?這時候我們會想到兩個數位管,其中一個顯示十位數 ...
1.同步動態掃描
多個數位管的顯示採用的是同步動態掃描方法,同步動態掃描指的是:行信號和列信號同步掃描,是一種並行操作。
2.數位管驅動電路實現思路
如果要求數位管顯示我們想要的數字,首先需要寫一個數據接收模塊,這個模塊接收數據之後需要做什麼樣的處理呢?這時候我們會想到兩個數位管,其中一個顯示十位數字,另一個顯示各位數字,即把這個數據的十位傳給其中一個數位管,各位數字傳給另一個數位管來顯示。這樣我們就會明確了:數據接收模塊需要將接收的數據進行拆分,分別輸出其十位數據與個位上的數據
程式風格:
1.always塊語句中,總是先寫出複位信號到來時候的情況,即輸出全部置零。
2.always塊語句中的變數都是reg型,因此在寫always塊語句前需要事先定義好,定義好reg型變數的位寬與名字。
3.儘管always塊語句裡面是對輸出量的處理,但reg型的變數名最好不用輸出量的名字,應先用其它的變數名代替,最後通過assign語句傳遞給輸出量。(以後的工作中需要弄清楚為什麼是這種編碼風格)。
註意:
1.給變數賦值時,應帶上數據的位寬與進位,總之,在編碼的過程中,時刻註意變數的位寬與進位。多敲代碼,養成良好的編碼習慣。
2.寫條件語句時,註意裡面的代碼,通常是以begin開頭,end結尾,很重要,即使邏輯正確,少了這些,都無法通過編譯。
當我們獲得輸入數據的十位與個位信號後,我們並不能直接傳輸給數位管,讓其顯示。當然八段數位管的顯示方式並不陌生,因此十位與個位信號需要經過一個翻譯的過程,把這兩個信號翻譯成數位管能識別的代碼,這是一個加碼的過程。
以上為八段數位管的顯示編碼,在程式中以參數的形式給出,方便以後調用。其中,當複位信號到來時,給輸出信號賦值為“8’b1111_1111”此時八段數位管處於熄滅狀態。
註意:似乎有大量參數的程式,都會用到case/endcase程式段,類似一個查表的過程,當case(輸入量),在以下的代碼中找到相匹配的輸入量後,執行對應的語句(對輸出量進行操作,賦值等)。
在我們獲得了數位管的顯示代碼後,為什麼不直接傳給數位管呢,直接顯示應該沒問題呀,但為什麼需要加一個行掃描模塊與列掃描模塊,希望有看到這篇博客的人能告訴為原因。
先說說列掃描,掃描頻率制定為50Hz,即周期為0.02s,即從左至右,把兩個燈掃一遍需要20ms,分配給兩個燈,一個燈亮10ms,即每隔10ms換一個數位管使能。列掃描的工作機制如下:無需額外的輸入,內部需要計數器,產生10ms的時間,然後通過內部邏輯控制數位管的使能。輸出的列掃描信號即為數位管的片選信號,在實際的引腳分配中要註意。
以下為計數器的典型寫法。
寫完計數器之後,就應該寫對輸出語句的操作了。結合兩個always塊語句來看,前一個always塊語句裡面的變數t用在了下一個always塊語句裡面的case裡面。
這其中涉及到一個狀態機的編碼技巧(哈哈,前幾天看視頻才弄明白的)。
分析:
輸出信號有兩種狀態0:rColumn_Scan <= 2’b10; 個位數位管使能
1: rColumn_Scan <= 2’b01;十位數位管使能
前一個always塊語句專門用來控制狀態變數t的跳變,即在什麼條件下由一個狀態跳變到另外一個狀態中呢?繪製如下狀態圖:
狀態機與相應的操作分開寫,會讓程式更加清晰。
最後是行掃描模塊,數位管的十位與個位顯示代碼是傳給行掃描模塊的,最後模塊輸出一個行掃描信號。行掃描模塊的工作機制如下:
因為行掃描與列掃描是同步進行的,因此也需要一個10ms的計數器,假設初始時間是0,過了10ms後,十位的數位管被使能,這時候,行掃描模塊應該把十位上的數據傳給十位數位管,再過10ms,個位的數位管被使能,這時候,行掃描模塊應該把個位上的數據傳給個位數位管。這其中也有一個狀態的跳變過程,需要寫狀態機。
至此,數位管驅動電路各個模塊已經完成,最後只需要通過一個頂層文件用wire將各個模塊連接起來。