en caso de declaraciones

-5

Estoy tratando de entender cómo funcionan las instrucciones y el reloj. Mi aplicación acepta caracteres como input (), y para cada char la aplicación debe ir a la sentencia if else. Aquí el código:

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

entity xillydemo is
  port (
     PCIE_PERST_B_LS : IN std_logic;
 PCIE_REFCLK_N : IN std_logic;
 PCIE_REFCLK_P : IN std_logic;
 PCIE_RX_N : IN std_logic_vector(3 DOWNTO 0);
 PCIE_RX_P : IN std_logic_vector(3 DOWNTO 0);
 GPIO_LED : OUT std_logic_vector(3 DOWNTO 0);
 PCIE_TX_N : OUT std_logic_vector(3 DOWNTO 0);
 PCIE_TX_P : OUT std_logic_vector(3 DOWNTO 0));
end xillydemo;

architecture sample_arch of xillydemo is

  component xillybus
    port (
      PCIE_PERST_B_LS : IN std_logic;
      PCIE_REFCLK_N : IN std_logic;
      PCIE_REFCLK_P : IN std_logic;
      PCIE_RX_N : IN std_logic_vector(3 DOWNTO 0);
      PCIE_RX_P : IN std_logic_vector(3 DOWNTO 0);
      GPIO_LED : OUT std_logic_vector(3 DOWNTO 0);
      PCIE_TX_N : OUT std_logic_vector(3 DOWNTO 0);
      PCIE_TX_P : OUT std_logic_vector(3 DOWNTO 0);
      bus_clk : OUT std_logic;
      quiesce : OUT std_logic;

      user_r_read_8_rden : OUT std_logic;
      user_r_read_8_empty : IN std_logic;
      user_r_read_8_data : IN std_logic_vector(7 DOWNTO 0);
      user_r_read_8_eof : IN std_logic;
      user_r_read_8_open : OUT std_logic;
      user_w_write_8_wren : OUT std_logic;
      user_w_write_8_full : IN std_logic;
      user_w_write_8_data : OUT std_logic_vector(7 DOWNTO 0);
      user_w_write_8_open : OUT std_logic);
  end component;

  component fifo_8x2048
    port (
      clk: IN std_logic;
      srst: IN std_logic;
      din: IN std_logic_VECTOR(7 downto 0);
      wr_en: IN std_logic;
      rd_en: IN std_logic;
      dout: OUT std_logic_VECTOR(7 downto 0);
      full: OUT std_logic;
      empty: OUT std_logic);
  end component;


-- Synplicity black box declaration
  attribute syn_black_box : boolean;
  attribute syn_black_box of fifo_8x2048: component is true;

  signal bus_clk :  std_logic;
  signal quiesce : std_logic;

  signal reset_8 : std_logic;

  signal ram_addr : integer range 0 to 31;

  signal user_r_read_8_rden  :  std_logic;
  signal user_r_read_8_empty :  std_logic;
  signal user_r_read_8_data  :  std_logic_vector(7 DOWNTO 0);
  signal user_r_read_8_eof   :  std_logic;
  signal user_r_read_8_open  :  std_logic;
  signal user_w_write_8_wren :  std_logic;
  signal user_w_write_8_full :  std_logic;
  signal user_w_write_8_data :  std_logic_vector(7 DOWNTO 0);
  signal user_w_write_8_open :  std_logic;
  signal wr_en               :  std_logic := '0';
  signal din                 :  std_logic_vector(user_w_write_8_data'range) := (others => '0');


begin
  xillybus_ins : xillybus
    port map (
      -- Ports related to /dev/xillybus_read_8
      -- FPGA to CPU signals:
      user_r_read_8_rden => user_r_read_8_rden,
      user_r_read_8_empty => user_r_read_8_empty,
      user_r_read_8_data => user_r_read_8_data,
      user_r_read_8_eof => user_r_read_8_eof,
      user_r_read_8_open => user_r_read_8_open,

      -- Ports related to /dev/xillybus_write_8
      -- CPU to FPGA signals:
      user_w_write_8_wren => user_w_write_8_wren,
      user_w_write_8_full => user_w_write_8_full,
      user_w_write_8_data => user_w_write_8_data,
      user_w_write_8_open => user_w_write_8_open,

      -- General signals
      PCIE_PERST_B_LS => PCIE_PERST_B_LS,
      PCIE_REFCLK_N => PCIE_REFCLK_N,
      PCIE_REFCLK_P => PCIE_REFCLK_P,
      PCIE_RX_N => PCIE_RX_N,
      PCIE_RX_P => PCIE_RX_P,
      GPIO_LED => GPIO_LED,
      PCIE_TX_N => PCIE_TX_N,
      PCIE_TX_P => PCIE_TX_P,
      bus_clk => bus_clk,
      quiesce => quiesce
   );

  process (bus_clk)

    variable counter : integer := 0;
    variable my_buffer_a :  std_logic_vector(7 downto 0) := (others => '0');
    variable my_buffer_b :  std_logic_vector(7 downto 0) := (others => '0');

    begin 

          user_r_read_8_eof <= user_r_read_8_empty and not(user_w_write_8_open);
          wr_en <= user_w_write_8_wren;

          if (bus_clk'event and bus_clk = '1') then    
              if (counter = 0) then
                  my_buffer_a := "00110010";--2 --user_w_write_8_data;
                  counter := 1;
              elsif (counter = 1) then
                  my_buffer_b := "00110011"; --3--user_w_write_8_data;
                  counter := 2;
              elsif (counter = 2) then
                  din <= "00110100";--4 -- my_buffer_a;
                  counter := 3;
              elsif (counter = 3) then
                  din <= "00110101"; --5 -- my_buffer_b;
                  counter := 0;
              end if;
          end if;
    end process;

--  8-bit loopback

  fifo_8 : fifo_8x2048
    port map(
      clk        => bus_clk,
      srst       => reset_8,
      din        => din,
      wr_en      => wr_en,
      rd_en      => user_r_read_8_rden,
      dout       => user_r_read_8_data,
      full       => user_w_write_8_full,
      empty      => user_r_read_8_empty
  );

reset_8 <= not (user_w_write_8_open or user_r_read_8_open);


end sample_arch; 

El problema es que, dado como entrada "John", la aplicación genera 55455. Esto significa que mi aplicación nunca entra en if (counter = 0) y elsif (counter = 1). ¿Alguna razón por la que?

    
pregunta Message Passing

2 respuestas

1

Sugeriría usar una instrucción de cambio para las instrucciones incrustadas if ... elseif. No es obvio para mí qué idioma estás usando. Las instrucciones de conmutación tienen muchos casos diferentes, por ejemplo, el contador de pruebas es igual a 1 y las instrucciones de ejecución, si lo son. Después de las declaraciones, hay una "interrupción" que evita que se ejecuten las comprobaciones subsiguientes de las declaraciones "contrarias a". En el idioma que está utilizando busque "switch" o "case" y creo que lo encontrará. Si no me avisa qué idioma está usando y lo buscaré.

Encontré este que es un buen ejemplo de lo que creo que están tratando de hacer Tomé sus declaraciones y las reformateé en una declaración de caso VHDL usando el ejemplo como guía:

case counter is
when 0 =>
  my_buffer_a := "00110010";--2 --user_w_write_8_data;
  counter := 1;
when 1 =>
  my_buffer_b := "00110011"; --3--user_w_write_8_data;
  counter := 2;
when 2 =>
  din <= "00110100";--4 -- my_buffer_a;
  counter := 3;
when 3 =>
  din <= "00110101"; --5 -- my_buffer_b;
  counter := 0;
when others =>
  null;
end case;

Esto debería reemplazar tus declaraciones if entre

if (bus_clk'event and bus_clk = '1') then

y sus asociados

end if;

Tenga en cuenta que el último elemento de la declaración del caso, "cuando otros", es una "válvula de seguridad" para cuando se prueba un valor que no había anticipado para el contador.

    
respondido por el user34299
0

las sentencias elseif son solo una serie de sentencias if. Me parece que cuando su código verifica el contador = 0 satisface la primera instrucción if, ejecutando el código subsiguiente. Sin embargo, luego configura el contador en 1 e inmediatamente se encuentra con la siguiente declaración si la comprueba que el contador es 1, que ahora es el contador. Repite este proceso. En última instancia, su código llega al final y el contador se establece en 0, pero el código se ha ejecutado para el contador = 3.

Sugiero que una vez que se haya ejecutado el código de una sentencia if o elseif, se elimine para que no se ejecuten las siguientes sentencias elseif.

    
respondido por el user34299

Lea otras preguntas en las etiquetas