Múltiples entradas al núcleo de IP en verilog

0

Estoy tratando de hacer un sistema de comunicación, con serialización-deserialización y codificación 8b-10b, decodificación. Actualmente estoy usando el núcleo disponible para la codificación 8b / 10b, que tiene un requisito de entrada de 8 bits. Quiero aceptar una entrada de 32 bits del usuario como un paquete. Y luego alimente el codificador 8b / 10b con estos 32 bits divididos en patrones de 4, 8 bits, serialícelo y envíelo. ¿Cómo debo tomar el patrón de 32 bits y dividirlo en patrones de 4, 8 bits, cuando la entrada del núcleo IP solo exige 8 bits?

    
pregunta Ameya

1 respuesta

2

Hay muchos detalles que deberá resolver, pero la forma básica de hacerlo es tener una máquina de estados con 5 estados: inactivo, transmitir primero, transmitir segundo, transmitir tercero y transmitir cuarto. Cuando ingresa una palabra de 32 bits, pasa de Inactivo a través de los estados de transmisión, escribe un byte por ciclo de reloj, luego regresa al estado inactivo o tal vez comienza a transmitir el primer byte de la siguiente palabra si está disponible.

Las cosas adicionales que deberá averiguar son si necesita control de flujo en el bus de entrada de 32 bits, cómo el receptor determinará el inicio y el final del mensaje, si un mensaje de 32 bits es un paquete completo o si necesita para transmitir paquetes más largos generados 32 bits a la vez.

8b10 hace que la mayoría de estas opciones sea bastante fácil, ya que determina automáticamente el marco de bytes y proporciona palabras de código de control que se pueden usar para el marco de mensajes, pero debe asegurarse de que funcione para su aplicación.

El código se vería así:

reg [31:0] data_in;
reg [7:0] data_out;

always @(*) begin
    case (state) 
      Idle: data_out = 8'b0;
      Send1: data_out = data_in[31:24];
      Send2: data_out = data_in[23:16];
      Send3: data_out = data_in[15:8];
      Send4: data_out = data_in[7:0];
    endcase
end

Luego, debe asegurarse de que la máquina de estados se repita en los estados Enviar1 ... Enviar4 en el momento adecuado. También es posible que deba bloquear el registro data_in para que no cambie en el medio del envío, e implementar un indicador de ocupado para evitar que el remitente intente enviar un nuevo mensaje mientras el primero está en progreso.

    
respondido por el Evan

Lea otras preguntas en las etiquetas