¿Cómo comparar cada elemento con otro elemento de dos matrices multidimensionales en verilog?

1

Quiero comparar dos matrices multidimensionales con cada elemento de una matriz con la otra matriz. ¿Cuál es el procedimiento para hacerlo posible?

timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date:    09:21:01 01/08/2015 
// Design Name: 
// Module Name:    FACTORISING_INTEGER 
// Project Name: 
// Target Devices: 
// Tool versions: 
// Description: 
//
// Dependencies: 
//
// Revision: 
// Revision 0.01 - File Created
// Additional Comments: 
//
module FACTORISING_INTEGER(
    input [15:0] f,g,
    //output reg [15:0] b,c,
     output reg [15:0]mem,
     //output reg [15:0]memc[15:0],
    input clk
    );
reg [15:0]memb[15:0];
reg [15:0]memc[15:0];
reg [15:0] b,c ;
integer address;     
integer i,j;
always@(posedge clk)
  begin

   for(i=1;i<=f;i=i+1)
     begin
        if(f % i == 0)
         begin
          $display("%b is the factor of f ",i);
          #100;

           b<=i;
            memb[i]<=b;
            end
       end 
   for(j=1;j<=g;j=j+1)
     begin  
     if(g % j == 0)
         begin
          $display("%b is the factor of g ",j);
          #100;

           c<=j;
            memc[j]<=c;
            end
      end
    end 

always@(posedge clk)
   begin
    for(address=0;address<16;address=address+1)
     begin
      if(memc[address]==(memb[address]))
#100      
         mem[address]<=memb[address];
        else if(memb[address]>(memc[address]))
        #100
           mem[address]<=memb[address];
        else if(memc[address]>(memb[address])) 
        #100
             mem[address]<=memc[address];

         end

      end


endmodule
    
pregunta Mahesh reddy

1 respuesta

1

Antes de responder a la pregunta, es necesario señalar algunos errores importantes:

  • Nunca use retrasos de bloqueo en código sintetizable. Eliminar el #100 . Si decide qué demorar entre las operaciones, cree un FSM.

  • Un bucle for sintetizable debe desenrollarse estáticamente. Esto significa que el número de bucles debe ser constante. f es una entrada, por lo que for(i=1;i<=f;i=i+1) debería ser

    for(i=1;i<16;i=i+1) begin // <-- static loop
      if (i <= f) begin // dynamic condition
        // ... your code here
      end
    end
    
  • Las asignaciones no bloqueantes ( <= ) actualizarán el valor en una etapa posterior en el programador Verilog (esto se usa para proteger las violaciones de tiempo de espera de los agentes). Con el código b<=i; memb[i]<=b; , a memb[i] se le asignará el valor antiguo de b , no el valor que se acaba de asignar. A menudo, en un borde sensible, siempre se bloquean todas las asignaciones sin bloqueo, sin embargo, esta práctica solo es necesaria para las señales que se sintetizarán en flops (es decir, D-flip-flips y latches). Hay tres formas de resolver esto:

    • b = i; memb[i]<=b; Asignaciones inmediatas a b . Esto asume b solo en una señal intermedia. Esto no es una práctica común, pero es legal y sintetizable.
    • memb[i]<=i; asigna i a memb[i]
    • memb[i]<=i[15:0]; Me gusta arriba pero no hay advertencia de rango Mejor

Ahora a la pregunta real: (cómo comparar)

La clave principal para hacer cualquier comparación (como encontrar un valor máximo) es usar es usar lógica conbinacional.

// Find max
always @* begin
  mem = 16'h0; // initial default value
  for(address=0; address<16; address=address+1) begin
    if (mem[address] <= memb[address]) mem[address] = memb[address];
    if (mem[address] <= memc[address]) mem[address] = memc[address];
  end
end

Si desea cambiar el valor (buena idea si el resultado es una salida), sugeriría cambiar el nombre de mem a next_mem o mem_next (o cualquier otro nombre completo de significado), entonces agregar una asignación de reloj secuencial:

always @(posedge clk)
  mem <= next_mem;
    
respondido por el Greg

Lea otras preguntas en las etiquetas