正如我在上一篇文章Synthesizable array of XY values中写的那样
我想在Verilog中创建一个数组来存储给定函数的x
,y
值。
现在我想将输入与此数组的x
值进行比较。如果值在特定区域内,我想保存该区域的索引,并使用相同的索引执行y
的添加。结果转到输出。代码编译得很好,但它没有合成任何电路。之后的想法是使用此数组执行线性插值,并确定y
的值,使其不在数组内的x
。代码如下。我为每个索引保存了x
和y
的保存值。
module memc (inp,outp,clk,reset);
input[2:0] inp;
input clk, reset;
output[2:0] outp;
reg[2:0] outp;
wire [2:0] test;
reg [5:0] mem[2:0];
always @(posedge clk)
if (reset == 1'b1) begin
mem[0] <= {3'b000, 3'b000};//y0,x0
mem[1] <= {3'b001, 3'b001};//y1,x1
mem[2] <= {3'b010, 3'b010};//y2,x2
end
assign test ={inp<mem[0][2:0],inp<mem[1][2:0],inp<mem[2][2:0]}; //create a test vector by comparing inp with xo,x1,x2
always @(test)
case (test)
3'b1xx: outp=mem[0][2:0]+mem[0][5:3];//if 0<inp<x1
3'b0xx: outp=mem[1][2:0]+mem[1][5:3];//if x1<inp<x2
3'b00x: outp=mem[2][2:0]+mem[2][5:3];//if x2<inp<x3
default: outp=3'b00;
endcase
endmodule
答案 0 :(得分:0)
首先,您的所有三个if
条件都相同(inp > mem[0][2:0]
)。我假设你想要
always @(*)
begin
if (inp > mem[0][2:0] ) //index 0
begin
index = 0;
end
else if (inp > mem[1][2:0] ) // index 1
begin
index = 1;
end
else if(inp > mem[2][2:0] ) // index 2
begin
index = 2;
end
end
其次,如果您使用的是大型阵列(很难确切地说是大小),那么来自inp的延迟 - > outp会变得很长,你可能会受到时间违规的影响,具体取决于你的时钟速度。在这种情况下,您最好构建一个非常简单的FSM,并在每个时钟周期检查一个或两个条目。只是要记住前进的事情。