在Verilog中處理固定精度的最簡單方法是引入一個比例因子並分配足夠大的寄存器來保存最大值。例如,如果您知道數字的最大值將是40,並且小數點右側的精度的三位數字是正確的,則可以將16位的寄存器使用1000的縮放因子。 Verilog處理無符號數字,所以如果值可能是負數,就必須在聲明中加上「簽名」。 Verilog的可能是:
`define NUMBER_ROWS 100
`define NUMBER_COLS 50
`define MAX_ROW (`NUMBER_ROWS-1)
`define MAX_COL (`NUMBER_COLS-1)
module moveMemory();
reg clk;
reg [15:0] y2shape [`MAX_ROW:0][`MAX_COL:0];
reg [15:0] yfftshift [`NUMBER_ROWS * `NUMBER_COLS:0];
integer rowNumber, colNumber;
always @(posedge clk)
begin
for (rowNumber = 0; rowNumber < `NUMBER_ROWS; rowNumber = rowNumber + 1)
for (colNumber = 0; colNumber < `NUMBER_COLS; colNumber = colNumber + 1)
y2shape[rowNumber][colNumber] <= yfftshift[rowNumber * `NUMBER_COLS + colNumber];
end
endmodule
這對FPGA或仿真項目確定,但對於全定製工作,一個SRAM宏將被用來避免16000個寄存器相關聯的裸片面積。對於FPGA實現,您可能已經支付了16K寄存器,或者您可以做一些額外的工作,讓合成器將寄存器映射到片內SRAM。
試驗檯:
//測試代碼 整數loadCount,rowShowNumber,colShowNumber; 初始 開始 //初始化陣列與一些數據 爲(loadCount = 0; loadCount <(NUMBER_ROWS *
NUMBER_COLS); loadCount = loadCount + 1) yfftshift [loadCount] < = loadCount; clk < = 0;
// Clock the block
#1
clk <= 1;
// Display the results
#1
$display("Y2SHAPE has these values at time ", $time);
for (rowShowNumber = 0; rowShowNumber < `NUMBER_ROWS; rowShowNumber = rowShowNumber + 1)
for (colShowNumber = 0; colShowNumber < `NUMBER_COLS; colShowNumber = colShowNumber + 1)
$display("y2shape[%0d][%0d] is %d ", rowShowNumber, colShowNumber, y2shape[rowShowNumber][colShowNumber]);
end
仿真結果爲一個number_rows = 10,NUMBER_COLS = 5
Y2SHAPE has these values at time 2
y2shape[0][0] is 0
y2shape[0][1] is 1
y2shape[0][2] is 2
y2shape[0][3] is 3
y2shape[0][4] is 4
.
.
.
y2shape[9][2] is 47
y2shape[9][3] is 48
y2shape[9][4] is 49
檢查[此](http://www.asic-world.com/verilog/memory_fsm1.html)教程找到基本知識。 – Qiu
我經歷了那個教程,但我無法在這裏使用這個概念。 – jagadish
@jagadish,請分享您迄今爲止撰寫的Verilog。 – Greg