buscando en la memoria en verilog

0

Necesito crear un módulo que sea responsable de buscar en la memoria general para encontrar un valor específico y devolver la ubicación de la dirección, pero tengo el siguiente error después de hacer Synthesize en Xilinx.

Loop count limit exceeded. Condition is never false.

el módulo de búsqueda: responsable de tomar el valor ingresado y hacer una búsqueda en la memoria RAM y la dirección de retorno.

module Search(
    clk,
    rst,
    SearchData,
    FindAddress,
     StopSearch
);
input           clk;
input           rst;
input[7:0]      SearchData;
output reg [1:0]   FindAddress;
output reg StopSearch;
integer i;

wire read_rq;
reg [1:0] nxt_address;

initial
begin nxt_address=0;i=0; end

wire[7:0] read_data_inx;

D0_RAM1 D0(
    .clk(clk),
    .rst(rst),
    .read_rq(read_rq),
    .write_rq(0),
    .rw_address(nxt_address),
    .write_data(0),
    .read_data(read_data_inx)
);
always @(posedge clk )
begin
    while (nxt_address <4) begin
        if (read_data_inx == SearchData)  begin //master i has priority
            FindAddress <= nxt_address;
            StopSearch=1;
      end
        else begin
          StopSearch=0;
        end

        nxt_address <= nxt_address+1; 
    end
end 
endmodule

y el módulo de memoria RAM:

module D0_RAM1(
    clk,
    rst,
    read_rq,
    write_rq,
    rw_address,
    write_data,
    read_data
);
input           clk;
input           rst;
input           read_rq;
input           write_rq;
input[1:0]      rw_address; //2 bit 
input[7:0]      write_data;
output[7:0]     read_data;

reg[7:0]     read_data;

integer out, i;

// Declare memory 2^2 x8 bits
// 2^2 = 4
reg [7:0] memory_ram_d [3:0];
reg [7:0] memory_ram_q [3:0];

// Use positive edge of clock to read the memory
// Implement cyclic shift right
always @(posedge clk or
    negedge rst)
begin
    if (!rst)
    begin
        for (i=0;i<3; i=i+1)
            memory_ram_q[i] <= 0;
    end
    else
    begin
        for (i=0;i<3; i=i+1)
             memory_ram_q[i] <= memory_ram_d[i];
    end
end
//q=d

always @(*)
begin
    for (i=0;i<3; i=i+1)
        memory_ram_d[i] = memory_ram_q[i];
    if (write_rq && !read_rq)
        memory_ram_d[rw_address] = write_data;
    if (!write_rq && read_rq)
        read_data = memory_ram_q[rw_address];
end

endmodule

la sentencia while que causó el error anterior.

    
pregunta H.H

1 respuesta

1
reg [1:0] nxt_address;
...
while (nxt_address <4) begin

nxt_address es un valor de 2 bits. Puede contener los números 0, 1, 2 y 3. Por lo tanto, siempre será menor que 4.

Que es exactamente lo que dice el error.

    
respondido por el Majenko

Lea otras preguntas en las etiquetas