generador de paridad

-2

Necesito diseñar un generador de paridad que tenga una línea serie bidireccional. Esta línea acepta la entrada de 1 bit a la vez y da paridad para 8 bits en el 9º ciclo de reloj en la misma línea. Parece que no puedo entender esto bien. ¿Podría alguien guiarme como debería ser mi código? Aquí está mi código hasta ahora, solo necesito poner paridad en la línea bidireccional.

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

entity parity_gen is
 port (
     Data: inout std_logic;
     clk : in std_logic;
     rst : in std_logic
    );
end parity_gen;

architecture arc of parity_gen is
signal count : integer := 0;
signal temp : std_logic_vector(7 downto 0):="00000000"; 
signal parity : std_logic:='0';
begin
proc :process(clk) is

begin


 if clk'event and clk='1' then
  parity <= '0';

  temp(7 downto 0) <= Data & temp(7 downto 1);
  count <= count + 1;

   if count = 8 then
    parity <= temp(7) xor temp(6) xor temp(5) xor temp(4) xor temp(3) xor temp(2) xor     temp(1) xor temp(0);
    count <= 0;

  end if;



 end if;
 end process proc;

 -- data <= '1' when count = 9 else 'Z';

end arc;  

EDITAR

Probé su código pero no obtuve los resultados esperados. Así que modifiqué mi propio código, pero aún tengo un problema que estoy resaltando.

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

entity parity_gen is
port (
Data: inout std_logic;
clk : in std_logic;
rst : in std_logic
);
end parity_gen;

architecture arc of parity_gen is
 signal count : integer;
 signal parity : std_logic;
 signal temp : std_logic_vector(7 downto 0):="00000000";
begin

proc: process (clk) is
begin
if rst = '1' then
  parity <= '0';
  count <= 0;
  temp <= (others => '0');
  --data <= 'Z';
elsif clk'event and clk = '1' then
  if count = 9 then
    count <= 1;
  else
    count <= count + 1;
    temp(7) <= data;
    temp(6 downto 0) <= temp(7 downto 1);
    parity <= parity xor data;
  end if;
 end if;
 end process proc; 
data <= parity when count = 9 else 'Z';

Como se puede ver en la imagen, la paridad de los 8 bits recibidos se da en el noveno ciclo de reloj. También en el noveno ciclo del reloj la temperatura toma datos. No quiero que se muestreen datos en el registro de temperatura en el noveno ciclo de reloj. Quiero mantener la misma temperatura que el octavo ciclo. En el diagrama, vemos que no está sucediendo en el noveno ciclo, sino que sucede después.

    
pregunta user22348

1 respuesta

2

Estás complicando demasiado las cosas. El cálculo de la paridad en los datos en serie solo requiere una compuerta XOR y un flip-flop, más un contador para contar los bits en cada palabra. En lugar de criticar su diseño existente, permítame mostrarle una implementación diferente. Te lo dejaré para que averigües cómo funciona: intenta dibujar un diagrama de tiempo que muestre todas las señales. Déjame saber si tienes problemas para entender esto.

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

entity parity_gen is
  port (
    Data: inout std_logic;
    clk : in std_logic;
    rst : in std_logic
  );
end parity_gen;

architecture arc of parity_gen is
  signal count : integer;
  signal parity : std_logic;
begin

  proc: process (clk) is
  begin
    if clk'event and clk='1' then
      if rst = '1' or count = 8 then
        count <= 0;
        parity <= Data;
      else
        count <= count + 1;
        parity <= parity xor Data;
      end if;
    end if;
  end process proc;

  Data <= parity when count = 8 else 'Z';

end arc;
    
respondido por el Dave Tweed

Lea otras preguntas en las etiquetas