比较输入信号和数组值

时间:2015-05-04 18:51:03

标签: arrays verilog

正如我在上一篇文章Synthesizable array of XY values中写的那样 我想在Verilog中创建一个数组来存储给定函数的xy值。

现在我想将输入与此数组的x值进行比较。如果值在特定区域内,我想保存该区域的索引,并使用相同的索引执行y的添加。结果转到输出。代码编译得很好,但它没有合成任何电路。之后的想法是使用此数组执行线性插值,并确定y的值,使其不在数组内的x。代码如下。我为每个索引保存了xy的保存值。

 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

1 个答案:

答案 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,并在每个时钟周期检查一个或两个条目。只是要记住前进的事情。