Verilog中的數據格式
1、基本概念
verilog中寫一個數據的通用格式是 n'b000_000_···_000,表示一個n位的二進制數。基於這個通用式,可以將其分為三個部分:位數、加權數和實際數。改變位數自然可以改變該數的存儲寬度。改變加權數則是改變數制。如使用b(二進制),d(十進制),h(十六進制)。八進制的表示沒有注意過,用的也比較少,感興趣可以去了解一下。改變實際數則是改變了數值的大小。這里可以推出申明常數的流程。先在內存確認空間。注意這里的長度都是基於二進制的。也好理解,畢竟存儲在寄存器中的數據都是二進制的。而后確定描述形式。這個形式配合后面的實際數構成了這個數據的值。下面是幾個例子:
1'b1; 2'd10; 3'hf; 4'b0001; 5'd32; 6'h3f;
在上面的幾個數中,第一個是正確的。表示一位二進制1,第二個超出內存限制,實際值為2’d3。但是現在的編輯器會報錯。編輯器可以將高位補0,但是不會承認溢出數據。其他幾個也是采取同樣的方法閱讀。
接下來是幾種簡寫的方式:
'b0001; 'd1000; 'hffee; 1; 2; 6;
前面三個數據省略內存申明,由具體的編譯器補充。后面的則是默認32位十進制的數據。如果超出編譯器則會拓展。
當然一般來說,只有十進制數一般不用於verilog中的數據賦值,而是用於判斷語句或者位寬等值的使用。這樣可以有效地分辨賦值數據的所在。至於第二種的縮寫則是對於一些數據變化較大不好確認空間的數據。為什么會有常數數據變化呢?
這里常見的就是手動修改對應的數據大小。還有參數傳遞過程中也是有數據大小的變化的。
2、實際應用
在實際的運用中,有許多為了適應電路特性的編碼方式。比較有名的是ASCII編碼,BCD編碼等方式。
其中ASCII碼是8位寬的編碼,也就是一個字節。在verilog可以直接使用" M "的方式表示M的ASCII碼。
而BCD碼則是一種無權碼。其中常見的就是8421BCD碼,就是使用四位表示0~9這10個十進制的數中的一個,然后拼接。簡單理解,BCD,就是將一個十進制的每個權上的數取下來,由四位二進制表示,然后直接按照順序拼接。感覺像將一列火車拆成一節一節,放在不同的軌道運行。
這也體現了BCD的優勢所在,由於數字電路是支持位操作的,所以可以通過操作BCD碼直接得到十進制數的高位的加減。這樣可以避開不需要處理的低位數據。而缺點就是不能和十進制數據直接轉化,需要經過二進制。具體舉個例子:
8'd10+8'd20=8'd30; {4'd1 , 4'd0} + {4'd2 , 4'd0 }={4'd3,4'd0}
上面的是十進制的加法,下面是BCD加法的示意圖。對於我們來說,判斷邏輯是一樣的,就是從低到高開始加,依次判斷本位值和進位值。這是全加器的思路。而對於BCD碼而言,可以直接對應到需要操作的位數。比如這里是十位直接相加,個位保持不變。這就將8位全加器的工作轉化為4位全加器。當然,BCD碼並不是用於計算的,從這里也可以看到計算結果並不能直接使用,計算反而麻煩。這個例子只是說明BCD碼的模型。
那BCD的優勢在具體應用中的有何體現呢。
BCD的主要特點是無權。所以在設計中可以直接拼接,所以對於那些只需要表示而不需要大量計算的十進制轉化為BCD可以有效地提高電路處理速度。
3、總結
了解BCD是比較重要的,可以提高設計的效率和可讀性。