Cómo cablear buses de salida juntos

4

Diga que crea una instancia de un número de instancias parametrizadas en una matriz y cada una de estas instancias produce un valor de salida de 8 bits si se selecciona. ¿Cuál sería la mejor manera de conectar estas salidas?

Actualmente utilizo búferes de tres estados como en el siguiente ejemplo:

module foo(output wire [7:0] out);
parameter N = 4;
bar bars[0:N-1] (.out(out));
endmodule

module bar(output wire [7:0] out);
wire selected = ...;
wire [7:0] value = ...;
assign out = selected ? value : 8'bz;
endmodule

Aquí la lógica garantiza que la señal selected será 1 para una y solo una instancia.

Todo esto funciona bien en el simulador, así como en un FPGA. Sin embargo, dado que recibo advertencias sobre esta construcción al sintetizar y, según tengo entendido, Xilinx eliminó los búferes tri-estatales internos en los FPGA más nuevos, me preguntaba cuál sería la mejor forma de conectar estos buses de salida.

Estaba pensando en cambiar la asignación de salida a

assign out = selected ? value : 8'b0;

y luego OR-ing las salidas juntas. Sin embargo, no estoy seguro de cómo hacerlo, ya que el tamaño de la compuerta OR depende de un parámetro.

    
pregunta Job

2 respuestas

2

Respondiendo puramente cómo crear un ancho parametrizado cero. Esperemos que otra respuesta pueda cubrir la mejor práctica para varios controladores.

localparam DATA_W = 8;
i = {8{'1b0}} ;

o

i = 'b0 ; //RHS width is matched to LHS, early version limited to 32bits

o

i = '0;  //Introduced in 2012 SystemVerilog simplest way to x every bit : 'x
    
respondido por el pre_randomize
1

No mencionas las herramientas de síntesis que estás utilizando, estoy basando esto en Quartus II.

Cuando utiliza buses de estado triple interno para el diseño, se eliminan para adaptarse a la lógica biestatal disponible. Las herramientas empujan a lo largo del bit de habilitación de salida y agregan las versiones rx y tx de la señal si es necesario, luego insertan los muxes en los puntos de interconexión apropiados. Probablemente reciba advertencias si es posible que ocurran varios controladores, ya que la resolución de prioridad en ese caso es indeterminada.

Consideraría que es un mal diseño confiar en este comportamiento para las conexiones lógicas internas. Lamentablemente, para reemplazar esto no tiene más remedio que agregar explícitamente la señal hi-z / driving a la interfaz entre foo y bar y hacer la muxing por sí mismo.

Cuando utiliza la lógica de tres estados sobre el pin del dispositivo, las señales oe / rd / wr se enrutan hacia el diseño a los bancos de IO donde hay disponibles verdaderos controladores tri-state.

    
respondido por el shuckc

Lea otras preguntas en las etiquetas