2015-05-04 10 views
0

我想在Verilog中創建一個數組,它將包含給定函數的值x,y。因此,陣列的每個內容將包含值x和值y。因此,可以說,我有(x,y)可合成的XY值陣列

(3,2) 
(5,10) 
(1,5) 

最後陣列下面的值會是這個樣子:

Table[i][x][y] 

Table[0][3][2] 
Table[1][5][10] 
Table[2][1][5] 

是否有可能使這個陣列中的Verilog和可合成可?如果是這樣,我怎樣才能訪問這個數組上的每個點?

回答

2

我想你想得到的是一個元素可以容納兩個數字的數組。他們表現出來的方式很奇怪。你用你的示例代碼說的是,你有一個三維數組,其中一些元素的值爲i,xy,將會有一個值,但是你沒有指定什麼值。

你在文中說的是你想要一個i元素表,其中每個元素將有兩個值:一個表示x,另一個表示y。這是我們可以解決的問題,但不能與您提供的實現(三維數組)一起使用。

也就是說,您必須首先考慮您要在表格中存儲的x,y值的性質。 Verilog最適合整數,所以我會假設這一點。您還需要知道您的整數將使用多少位。假設他們將使用8位,所以有效的x,y值在[-128,+127]範圍內被認爲是符號。

現在您必須知道要在表格中存儲多少個xy對。假設它的值爲N,其中N是模塊的某種參數。

然後,該表將被實例是這樣的:

reg [15:0] Table[0..N-1]; 

所以,Table[i][7:0]可以容納一個8位的值,例如,y,並且Table[i][15:8]可容納另一個8位值,說x

初始化該表,在綜合的方式,最常用的方法是復位信號添加到您的模塊,並使用它來初始化表的內容,如:

reg [15:0] Table[0..N-1]; 
integer i; 
always @(posedge clk) begin 
    if (reset == 1'b1) begin 
    Table[0] <= {8'd3, 8'd2}; 
    Table[1] <= {8'd5, 8'd10}; 
    Table[2] <= {8'd1, 8'd5}; 
    for (i=3;i<N;i=i+1) // initialize the rest of Table to 0,0 
     Table[i] <= {8'd0, 8'd0}; 
    end 
    else ...... 
end 

要在訪問點位置i,只需使用:

Table[i][15:8] for X value 
Table[i][7:0] for Y value 

如果靶向Xilinx的設備,還可以初始化一個寄存器的內容,無論是在分佈式RAM或塊RAM,使用initial

reg [15:0] Table[0..N-1]; 
integer i; 
initial begin 
    Table[0] = {8'd3, 8'd2}; 
    Table[1] = {8'd5, 8'd10}; 
    Table[2] = {8'd1, 8'd5}; 
    for (i=3;i<N;i=i+1) // initialize the rest of Table to 0,0 
    Table[i] = {8'd0, 8'd0}; 
end 
+0

然後,你可以標記這個答案爲正確的:) –

+0

好吧,這似乎工作。你能用上面的代碼來幫助我嗎?它編譯,但它不合成任何東西。我想比較一個輸入與這個數組的x值。如果該值大於特定的x,我想保存這個x的索引,並使用具有相同索引的y執行加法。結果進入輸出。 – ctzof

+0

模塊memc(inp,outp); input [2:0] inp; 輸出[2:0]輸出; wire [2:0] index2; reg [2:0] index; reg [5:0] mem [2:0]; 初始開始 mem [0] = 6'b000000; mem [1] = 6'b001001; mem [2] = 6'b010010; 端 總是@(*) 開始 如果(INP> MEM [0] [2:0]) 索引= 0; else if(inp> mem [0] [2:0]) index = 1; else if(inp> mem [0] [2:0]) index = 2; else index = 0; end assign outp = mem [index] [2:0] + mem [index] [5:3]; endmodule – ctzof