Verilog bit direction

2

Estoy almacenando en búfer en datos de un ADC. Los datos vienen en MSB-primera. Naturalmente, tengo un registro de 16 bits para almacenar en los datos:

reg [0:15] sample_in;

El índice MSB es 0, ya que aparece primero. Esto tiene más sentido cuando su indexador es un contador simple. Estoy usando un módulo de conversión de punto flotante que tiene este aspecto:

module int16_to_float(input [15:0] a, output [31:0] b);

Como puede ver, la entrada tiene una dirección de bit diferente de mi registro original.

Mi pregunta es la siguiente: si configuro la entrada a en mi registro sample_in , ¿es el sintetizador lo suficientemente inteligente como para conectarlos entre MSB y MSB, o simplemente los une? En mi caso, sample_in LSB estaría conectado a a MSB, y viceversa.

Además, me doy cuenta de que es fácil cambiar la dirección de sample_in bit, haciendo que todo coincida. Esta es más una pregunta teórica que práctica.

    
pregunta crocboy

1 respuesta

1

Mi sugerencia sería mantener siempre las direcciones de bits iguales en su diseño. Que yo sepa, algunos compiladores de Verilog no admiten la conexión automática de buses con direcciones opuestas. Sé que he tenido problemas con Quartus, por ejemplo, la conexión de buses donde los bits están en sentido opuesto.

Si su compilador no es lo suficientemente inteligente como para hacerlo automáticamente, hay dos opciones dado que su ADC tiene bits en direcciones opuestas (*).

Opción 1

Puede escribir ambos registros en el mismo orden (recomendado), y luego usar la siguiente función para invertir los bits. El bucle en esta función solo infiere los bits en el cable que se intercambia, no hay lógica agregada en absoluto.

//Function for reversing the number of bits in a parallel bus.
function [16-1:0] bitOrder (
    input [16-1:0] data
);
integer i;
begin
    for (i=0; i < 16; i=i+1) begin : reverse
        bitOrder[16-1-i] = data[i]; //Note how the vectors get swapped around here by the index. For i=0, i_out=15, and vice versa.
    end
end
endfunction

//Example usage
reg [15:0] sample_in; //your sample in
wire [15:0] sample_rev; //bit order reversed, but note the direction of the declared vector is the same.
assign sample_rev = bitOrder(sample_in); //swap the bits.

Opción 2

Si quiere que sus bits estén en el orden opuesto, debería ser posible hacer lo mismo que arriba como abajo. Pero recomendaría la opción 1 si es posible, lo mejor es mantener todos los vectores en el mismo orden de bits para una mejor compatibilidad.

//Function for connecting bits in two parallel buses with opposite directions.
function [16-1:0] bitOrder (
    input [0:16-1] data
);
integer i;
begin
    for (i=0; i < bitOrder_WIDTH; i=i+1) begin : reverse
        bitOrder[i] = data[i]; //Index is the same as this is just to help synthesiser correctly assign bits.
    end
end
endfunction

//Example usage
reg [0:15] sample_in; //your sample in
wire [15:0] sample_rev; //direction reversed
assign sample_rev = bitOrder(sample_in); //swap the bits.

Nota (*): Pero quién debe decir qué "dirección" significa qué en su firmware, usted es libre de elegir. Dependiendo de cómo maneje los datos [15: 0] podría significar LSB 'primero' o MSB 'primero'.

    
respondido por el Tom Carpenter

Lea otras preguntas en las etiquetas