2011年5月18日 星期三

數位IC設計的基本元件(一) -- Gray Code

最近在整理一下過去的Design
想一想可以把一些基本設計的元件
整理一下給大家當個參考

如果大家想看更多基本元件的設計
可以參考網站 verilog example
基本上網站上有的我大概就不寫了
如果有寫就會寫上我在設計上遇到的做法
及特殊技法吧

先講一下gray code

這是用在讓Addr 的變化
在每一個cycle只變化一個bit
基本上這種設計會用在記憶體的讀寫
這樣做的好處在於省電
因為將address 轉成 gray 模式
所以一次只動到一個位址
這樣記憶體的位址變化最少
而可以稍稍省電一下

以下的例子是從網路上轉過來
在稍稍修改成比較好的例子
因為懶得重寫
從以前的設計抽出又太麻煩
改人家現成的例子較快

我將設計改成只變化最後四個最常變化的位址
有時設計不會全部位址都用gray去轉變
只對最常變化的位址作gray code

然後再將Gray的做法改成較簡單易懂的方法
此設計方法是可合成的(synthesizable)
而且面積也很小
需要的人可以參考看看

module binary2gray();
reg clk;
reg rstn;
reg [5:0] counter_binary, counter_binary_reg, counter_gray, counter_gray_reg;
integer count, file_wr;

/* Initial block to generate clock and reset */
initial begin
clk = 0; rstn = 0; #100 rstn = 1;
forever begin
#10 clk = !clk;
end end

initial begin
#800;
$finish;
end

/* Synchronous Logic for registering the data and incrementing the counter for binary data */
always @ (posedge clk or negedge rstn)
begin
if (!rstn) begin
counter_binary_reg <= 'b0;
counter_gray_reg <= 'b0; end
else begin
counter_binary_reg <= counter_binary + 1;
counter_gray_reg <= counter_gray;
$display("binary number= 6'b%b : gray en-coded binary number = 6'b%b", counter_binary_reg, counter_gray_reg);
end
end

/* Logic is to get Gray code from Binary code */
function[5:0] binary2gray ;
input[5:0] value;
integer i;
begin
binary2gray[5] = value[5];
binary2gray[4] = value[4];
for (i=0; i<=3; i=i+1)
binary2gray[i] = value[i] ^ value[i+1];
end
endfunction

/* Get gray encoded output */
always @(*)
begin
counter_gray = counter_gray_reg;
counter_binary = counter_binary_reg;
counter_gray = binary2gray(counter_binary_reg); end
endmodule

沒有留言: