Pregunta sobre el código fuente de verificación de paridad UART verilog

0

¿Por qué parity_value es igual al valor de 1?

check_parity verilog código fuente

module check_parity(clk, serial_in, received_data, data_is_valid, is_parity_stage, rx_error); // even parity checker

input clk, serial_in, data_is_valid, is_parity_stage;
input [7:0] received_data;
output reg rx_error = 0; 

reg parity_value; // this is being computed from the received 8-bit data
reg parity_bit;  // this bit is received directly through UART

always @(posedge clk)
begin
    parity_value <= ^(received_data);
end

always @(posedge clk)
begin
    if (is_parity_stage)
        parity_bit <= serial_in;
end

always @(posedge clk)
begin
    if ((data_is_valid) && (parity_bit != parity_value))
        rx_error <= 1;
end

endmodule
    
pregunta kevin

1 respuesta

0

No veo ningún problema en particular con su código como se ilustra. Supongo que cualquiera de los dos:

  • Recibido_data tiene una falla de 0 a un valor distinto de cero en el borde del reloj. Si sabe cómo habilitar los ciclos delta en su simulador, puede investigar eso. Tienes eventos disparando. ¿Alguno de ellos afecta a datos recibidos?
  • Si su simulador se comporta como el de Martin y trata a ^ (exp) como! (exp), entonces su simulador tiene errores.

Si ejecuta este código, las tres primeras columnas deberían ser iguales

module top;

reg [3:0] a;

initial begin
   for (int i = 0; i < 16; i++) begin
      a = i;
      $display("%0d %0d %0d %0d", a[3] ^ a[2] ^ a[1] ^ a[0], ^a, ^(a), !a);
   end
end

endmodule
    
respondido por el Brian Magnuson

Lea otras preguntas en las etiquetas