alta impedancia en rtl verilog

1

Estoy diseñando un registro de desplazamiento. Tiene una señal de control llamada RD que es asíncrona (por lo que no puedo usarla dentro del bloque de procedimiento), el punto completo es mi registro de desplazamiento de n-1 bit es el valor de la entrada si RD == 1 o bien tiene una impedancia alta; No estoy seguro de cómo escribir la asignación del valor de alta impedancia porque mi n bit es un parámetro, así que no puedo definir el no de bits.

inout [n-1: 0] Data; entrada RD;

registro reg [n-1: 0]; // mi registro

Ejemplo: Datos = (RD == 1'b1)? [n-1: 0] registro: 'z;

me está dando un error. ¿Cómo puedo definir que si RD es 1, entonces necesito ver qué hay dentro del registro y si es 0, debería ser de alta impedancia? ¿Alguien puede ayudar?

    
pregunta Digital_Treasure

2 respuestas

1

A menos que esté utilizando SystemVerilog, no puede declarar una constante como esa.

En su lugar, utilice el operador de replicación. {(WIDTH){1'bz}} es una constante binaria de WIDTH de todos los z 's. Simplemente reemplace el ancho por el ancho que necesite (puede ser un parámetro).

Además, debería ser register[n-1:0] no [n-1:0]register .

Lo siguiente debería funcionar:

assign Data = (RD == 1'b1) ? register : {(n){1'bz}};
    
respondido por el Tom Carpenter
0

Gracias por las sugerencias y orientación. Pude codificar en el patrón correcto y obtener los resultados esperados.

encuentra mi código RTL a continuación

modificador de módulo # (parámetro Longitud = 1) (

clk de entrada,   primera entrada,   entrada EN,   entrada WR,   entrada RD,   entrada SI,   salida reg SO   inout [Length-1: 0] Data
  );

reg [Length-1: 0] register;

siempre @ (mensaje de posición o primero)   empezar     if (rst == 1'b1)        empezar         registro < = 0;        fin     else
     empezar          if (WR == 1'b1 & & EN == 1'b0)         empezar           registro < = datos;         fin

 else if(WR == 1'b0 && EN == 1'b1)
         begin
     register <= {SI, register[Length-1:1]};           
         SO <= register [0];
     end     


  else if(WR == 1'b1 && EN == 1'b1)
       begin
       $display ("Illegal state");         
       end 

 else
     begin
     register <= register;
     end             

  end  
   end

asignar datos = (RD == 1'b1)? registro [Length-1: 0]: {(Length) {1'bz}};

endmodule

    
respondido por el Digital_Treasure

Lea otras preguntas en las etiquetas