Transferencia de datos de Latch a PIPO

1

Este programa está en Verilog y simulando en Modelsim. Estoy tratando de transferir datos de 48 bits de 192 bits a Parallel in Parallel Out (Registro) en 4 ranuras.

No estoy obteniendo salida en PIPO. Los datos no se transfieren a la salida de PIPO. En aras de la simplicidad he utilizado para transferir 96 bits. Los datos deben aparecer cada 48 sclk y sclk se cuenta con cnt (contador). El tamaño de PIPO es de 48 bits y el tamaño de Latch es de 192 bits.

/*LATCH FOR 192 BITS */ 

Parameter  N= 192;

  always@(xlat,dcsel,sipo_out_gs,rst)

    begin
   if(rst)
 gs_latch <= gs_latch;
   else
 if(xlat == 1)
   gs_latch <= sipo_out_gs;
 else
   gs_latch <= gs_latch;
end
/* 48 BITS DATA FROM LATCH TO PIPO*/

 always@(posedge sclk,posedge rst,cnt)

     begin

     if(rst)
   pipo_lat <= pipo_lat;
 else
   if(cnt >= 47 & cnt <= 94)
   pipo_lat <= gs_latch[47:0];
 end

 always@(posedge sclk,posedge rst,cnt)
    begin
       if(rst)
         pipo_lat <= pipo_lat;
     else
        if(cnt >= 95 && cnt <=142)
          pipo_lat  <= gs_latch[95:48];
     else
       pipo_lat  <= gs_latch[95:48];

   end

 /* counter for grayscale to count upto 192 bits  */ 

   always@(posedge sclk,posedge rst) 
 begin
if(rst) 
  cnt <= 0;
else
  if(cnt != N)
    cnt <= cnt + 1;
  else
    cnt <= 0;
 end 
    
pregunta Manzer

2 respuestas

1

Cualquier señal (red / registro) para código sintetizable debe asignarse exactamente en un bloque siempre. En el código pipo_lat se define en dos bloques siempre separados. cnt también debe eliminarse de la lista de sensibilidad para lógica síncrona. El reinicio activo debe asignar valores a una constante. Para los bloques de combinación y la lógica de retención, es mejor usar always @* y luego colocar la lista de sensibilidad completa, excepto que se ve obligado a seguir IEEE Std 1364-1995 y nada más nuevo.

module latch_to_pipo #(N=192, M=48, RSTVAL = 1'b0) (
    input wire sclk, rst, xlat,
    input wire [191:0] sipo_out_gs,
    output reg [47:0] pipo_lat );

  reg [7:0]   cnt;
  reg [N-1:0] gs_latch;

  always @* begin // latch
    if(rst)
      gs_latch <= {N{RSTVAL}};
    else if(xlat == 1)
      gs_latch <= sipo_out_gs;
  end

  /* 48 BITS DATA FROM LATCH TO PIPO */
  /* counter for grayscale to count upto 192 bits */
  always @(posedge sclk, posedge rst) begin
    if(rst) begin
      pipo_lat <= {M{RSTVAL}};
      cnt <= 0;
    end
    else begin
      case (cnt)
        8'd47  : pipo_lat <= gs_latch[47:0];
        8'd95  : pipo_lat <= gs_latch[95:48];
        8'd143 : pipo_lat <= gs_latch[143:96];
        8'd191 : pipo_lat <= gs_latch[191:144];
        default: pipo_lat <= pipo_lat;
      endcase
      if(cnt < N-1)
        cnt <= cnt + 1;
      else
        cnt <= 0;
    end
  end
endmodule

Si su herramienta es compatible con SystemVerilog, le recomiendo las palabras clave SV always_comb , always_ff , always_latch , unique , priority , y otros SystemVerilog para palabras clave de diseño donde sea aplicable. Un buen simulador moderno / linter / sintetizador dará errores y advertencias cuando se cometen errores comunes, lo que es especialmente útil para la depuración. Si es necesario, siempre se puede degradar fácilmente a una sintaxis más antigua (y aún limpia) con unos simples reemplazos de texto.

la última SystemVerilog LRM disponible de forma gratuita en IEEE

    
respondido por el Greg
0

Algo como esto? (no probado y no 100% despejado)
Tenga en cuenta que no reinicia su contador al cargar (xlat) la entrada. Esto significa que no sabe en qué momento se enviará parte de los datos. Tenga en cuenta que la herramienta de síntesis deducirá un latch para la variable 'gs_latch_reg'

module cnt
  #(
    parameter N = 192
    )
   (
    input wire rst,
    input wire sclk,
    input wire xlat,
    input wire [191:0] sipo_out_gs,
    output reg [47:0] pipo_lat
    );

   reg [7:0]   cnt;
   reg [191:0] gs_latch;


   always@(xlat,sipo_out_gs,rst, gs_latch)

    begin
       if(rst)
     gs_latch <= gs_latch;
       else
     if(xlat == 1)
       gs_latch <= sipo_out_gs;
     else
       gs_latch <= gs_latch;
    end // always@ (xlat,dcsel,sipo_out_gs,rst)


   /* 48 BITS DATA FROM LATCH TO PIPO*/

   always@(posedge sclk,posedge rst)

     begin

    if(rst)
      pipo_lat <= pipo_lat;
    else
      if(cnt == 47)
        pipo_lat <= gs_latch[47:0];
          else if(cnt == 95)
            pipo_lat  <= gs_latch[95:48];
          else if(cnt == 143)
            pipo_lat  <= gs_latch[143:96];
          else if(cnt == 191)
            pipo_lat  <= gs_latch[191:144];
      else
        pipo_lat  <= pipo_lat;
     end

   /* counter for grayscale to count upto 192 bits  */ 

   always @(posedge sclk,posedge rst) 
     begin
    if(rst) 
       cnt <= 0;
    else
      if(cnt != N)
        cnt <= cnt + 1;
      else
        cnt <= 0;
     end

endmodule
    
respondido por el vermaete

Lea otras preguntas en las etiquetas