swapping VHDL FPGA [cerrado]

0

Quiero desarrollar una aplicación que pueda obtener y almacenar dos valores de entrada, cambiar de minúsculas a mayúsculas solo la primera Valor y finalmente salir los dos valores almacenados. Por ejemplo: si la entrada la cadena es "john", entonces la cadena de salida debe ser "JoHn". los la aplicación debe obtener "j" de user_w_write_8_data y almacenarla en my_buffer_a , intercambia "j" por "J", luego obtén "o" almacenarlo en my_buffer_b , luego la salida "J", luego la salida "o". Después de que la aplicación debe obtener "h" de user_w_write_8_data , cambia "h" a "H" y guárdalo en my_buffer_a , luego "n" lo almacena en my_buffer_b , luego sale "H", luego la salida "n". Básicamente, la aplicación debe almacenar dos caracteres, intercambia el primero y luego imprime estos dos, almacena otros dos caracteres, intercambie el primero y luego emita estos dos caracteres, etc. El problema de mi aplicación no cambia de caracteres inferiores a superiores que se almacena en my_buffer_a . En lugar de mostrar "JoHn", mi La aplicación da salida a una línea en blanco e ingresa un carácter aleatorio Mi aplicación se basa en este código link pero ¡Abrí un nuevo tema porque esta lógica es muy diferente! Como se sugiere, controlo señales como wr_en , din y full de XillyBus también. Una cosa más, desafortunadamente no puedo ejecutar la simulación, solo generar el archivo de bits y probarlo de inmediato en mi FPGA.

Gracias.

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_mem_8_rden : OUT std_logic;
  user_r_mem_8_empty : IN std_logic;
  user_r_mem_8_data : IN std_logic_vector(7 DOWNTO 0);
  user_r_mem_8_eof : IN std_logic;
  user_r_mem_8_open : OUT std_logic;
  user_w_mem_8_wren : OUT std_logic;
  user_w_mem_8_full : IN std_logic;
  user_w_mem_8_data : OUT std_logic_vector(7 DOWNTO 0);
  user_w_mem_8_open : OUT std_logic;
  user_mem_8_addr : OUT std_logic_vector(4 DOWNTO 0);
  user_mem_8_addr_update : OUT std_logic;
  user_r_read_32_rden : OUT std_logic;
  user_r_read_32_empty : IN std_logic;
  user_r_read_32_data : IN std_logic_vector(31 DOWNTO 0);
  user_r_read_32_eof : IN std_logic;
  user_r_read_32_open : 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_32_wren : OUT std_logic;
  user_w_write_32_full : IN std_logic;
  user_w_write_32_data : OUT std_logic_vector(31 DOWNTO 0);
  user_w_write_32_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;

  component fifo_32x512
    port (
  clk: IN std_logic;
  srst: IN std_logic;
  din: IN std_logic_VECTOR(31 downto 0);
  wr_en: IN std_logic;
  rd_en: IN std_logic;
  dout: OUT std_logic_VECTOR(31 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_32x512: component is true;
  attribute syn_black_box of fifo_8x2048: component is true;

  type demo_mem is array(0 TO 31) of std_logic_vector(7 DOWNTO 0);
  signal demoarray : demo_mem;

  signal bus_clk :  std_logic;
  signal quiesce : std_logic;

  signal reset_8 : std_logic;
  signal reset_32 : std_logic;

  signal ram_addr : integer range 0 to 31;

  signal user_r_mem_8_rden :  std_logic;
  signal user_r_mem_8_empty :  std_logic;
  signal user_r_mem_8_data :  std_logic_vector(7 DOWNTO 0);
  signal user_r_mem_8_eof :  std_logic;
  signal user_r_mem_8_open :  std_logic;
  signal user_w_mem_8_wren :  std_logic;
  signal user_w_mem_8_full :  std_logic;
  signal user_w_mem_8_data :  std_logic_vector(7 DOWNTO 0);
  signal user_w_mem_8_open :  std_logic;
  signal user_mem_8_addr :  std_logic_vector(4 DOWNTO 0);
  signal user_mem_8_addr_update :  std_logic;
  signal user_r_read_32_rden :  std_logic;
  signal user_r_read_32_empty :  std_logic;
  signal user_r_read_32_data :  std_logic_vector(31 DOWNTO 0);
  signal user_r_read_32_eof :  std_logic;
  signal user_r_read_32_open :  std_logic;
  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_32_wren :  std_logic;
  signal user_w_write_32_full :  std_logic;
  signal user_w_write_32_data :  std_logic_vector(31 DOWNTO 0);
  signal user_w_write_32_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 rd_en               :  std_logic := '0';
  signal full                :  std_logic := '0';
  signal empty               :  std_logic := '0';

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



begin
  xillybus_ins : xillybus
port map (
  -- Ports related to /dev/xillybus_mem_8
  -- FPGA to CPU signals:
  user_r_mem_8_rden => user_r_mem_8_rden,
  user_r_mem_8_empty => user_r_mem_8_empty,
  user_r_mem_8_data => user_r_mem_8_data,
  user_r_mem_8_eof => user_r_mem_8_eof,
  user_r_mem_8_open => user_r_mem_8_open,
  -- CPU to FPGA signals:
  user_w_mem_8_wren => user_w_mem_8_wren,
  user_w_mem_8_full => user_w_mem_8_full,
  user_w_mem_8_data => user_w_mem_8_data,
  user_w_mem_8_open => user_w_mem_8_open,
  -- Address signals:
  user_mem_8_addr => user_mem_8_addr,
  user_mem_8_addr_update => user_mem_8_addr_update,

  -- Ports related to /dev/xillybus_read_32
  -- FPGA to CPU signals:
  user_r_read_32_rden => user_r_read_32_rden,
  user_r_read_32_empty => user_r_read_32_empty,
  user_r_read_32_data => user_r_read_32_data,
  user_r_read_32_eof => user_r_read_32_eof,
  user_r_read_32_open => user_r_read_32_open,

  -- 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_32
  -- CPU to FPGA signals:
  user_w_write_32_wren => user_w_write_32_wren,
  user_w_write_32_full => user_w_write_32_full,
  user_w_write_32_data => user_w_write_32_data,
  user_w_write_32_open => user_w_write_32_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
  );

--  A simple inferred RAM

  ram_addr <= conv_integer(user_mem_8_addr);

  process (bus_clk)

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

                wr_en <= user_w_write_8_wren;
                full <= user_w_write_8_full;                    
                if (user_w_write_8_wren='1' and counter = 0) then
                    my_buffer_a <= user_w_write_8_data;
                    counter <= 1;
                elsif (user_w_write_8_wren='1' and counter = 1) then
                    my_buffer_b <= user_w_write_8_data;
                    counter <= 2;
                elsif (counter = 2) then
                    full <= '1';
                    din <= my_buffer_a;
                    counter <= 3;
                elsif (counter = 3) then
                    full <= '1';
                    din <= my_buffer_b;
                    counter <= 0;
                end if;
            end if;

     end process;

  user_r_mem_8_empty <= '0';
  user_r_mem_8_eof <= '0';
  user_w_mem_8_full <= '0';

--  32-bit loopback

  fifo_32 : fifo_32x512
port map(
  clk        => bus_clk,
  srst       => reset_32,
  din        => user_w_write_32_data,
  wr_en      => user_w_write_32_wren,
  rd_en      => user_r_read_32_rden,
  dout       => user_r_read_32_data,
  full       => user_w_write_32_full,
  empty      => user_r_read_32_empty
  );

  reset_32 <= not (user_w_write_32_open or user_r_read_32_open);

  user_r_read_32_eof <= '0';

--  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       => full,
  empty      => user_r_read_8_empty
  );

reset_8 <= not (user_w_write_8_open or user_r_read_8_open);

user_r_read_8_eof <= '0';

end sample_arch;

EDITAR: Ahora, el contador y los búferes son señales en lugar de variables, así que estoy seguro de que se muestrearán en el siguiente ciclo de reloj. Aquí, me gustaría poner algunos comentarios sobre mi lógica porque no entiendo por qué no funciona.

begin 
if (bus_clk'event and bus_clk = '1') then 
   wr_en <= user_w_write_8_wren; --initialize wr_en
   full <= user_w_write_8_full;  --initialize full                  
   if (user_w_write_8_wren='1' and counter = 0) then --there data on write device file
       my_buffer_a <= user_w_write_8_data; --move the input data on buffer_a
       counter <= 1;
   elsif (user_w_write_8_wren='1' and counter = 1) then --there data on write device file
       my_buffer_b <= user_w_write_8_data; --move the input data on buffer_b
       counter <= 2;
   elsif (counter = 2) then
       full <= '1'; --do not accept more data
       din <= my_buffer_a; --take data stored in buffer_a and move it into read_device_file
       counter <= 3;
   elsif (counter = 3) then
       full <= '1'; --do not accept more data
       din <= my_buffer_b; --take data stored in buffer_b and move it into read_device_file
       counter <= 0;
   end if;
end if;
end process;

1-¿Por qué debo inicializar rd_en y empty ? Bueno, no entiendo dónde tengo que usarlos en mi lógica. Creo que no necesito información sobre read_device_file, ya que no se pueden leer más datos o hay datos válidos en read_device_file.

2-¿Por qué wr_en contiene el valor antiguo de user_w_write_8_wren ? Ya que wr_en <= user_w_write_8_wren; , wr_en debería contener el valor real de user_w_write_8_wren , ¿no?

    
pregunta Junior hpc

1 respuesta

1
  

1-¿Por qué debo inicializar rd_en y vaciar?

Usted tiene no para "inicializar" estas señales. Solo conéctelos correctamente al XillyBus.

La salida empty de FIFO indica si los datos están disponibles en FIFO. Si es bajo, entonces se pueden leer más datos del FIFO. Esta salida debe estar conectada a la señal user_r_read_8_empty que está conectada a la entrada del mismo nombre del XillyBus.

La entrada rd_en de FIFO debe conectarse a la señal user_r_read_8_rden que está conectada a la salida del mismo nombre del XillyBus. Esta señal es impulsada alto por el XillyBus, si quiere leer datos del FIFO.

Para su diseño previsto, debe reemplazar el FIFO como se describe al final de esta respuesta.

  

2-¿Por qué wr_en contiene el valor antiguo de user_w_write_8_wren?

Debido a que las asigencias de señal en un proceso (con el operador <= ) se retrasan hasta la siguiente declaración wait . Solo los efectos variables (con el operador := ) tienen un efecto inmediato.

Su process(bus_clk) no tiene una declaración explícita wait . Pero tiene uno implícito, porque un proceso con una lista de sensibilidad (el (bus_clock) ) es igual a un proceso sin una lista de sensibilidad con una instrucción wait on al final. Por lo tanto, su código es igual a:

process
begin 
    if (bus_clk'event and bus_clk = '1') then 
        wr_en <= user_w_write_8_wren;
        full <= user_w_write_8_full;                    
        if (user_w_write_8_wren='1' and counter = 0) then
        ...
        end if;
    end if;
    wait on bus_clock;
end process;

Las asignaciones de señal a wr_en y full (así como a todas las otras asigencias de señal en este proceso) se aplican al final del proceso. Por lo tanto, si verificara el valor de wr_en en las condiciones if , siempre se usará el valor antiguo aún válido.

Por ejemplo, en el hardware, la señal wr_en se implementaría con un flip-flop D que se activa por el flanco ascendente de bus_clk aquí. La señal wr_en sería la salida del flip-flop D y la expresión en el lado derecho de la asignación de señal ( user_w_write_8_wren ) la entrada de este D flip-flop. Por lo tanto, wr_en es user_w_write_8_wren retrasado por un ciclo de reloj en este ejemplo.

Cómo debe proceder:

Recomiendo reiniciar desde la demostración de loopback de XillyBus (xillydemo). Luego debe encapsular su propia lógica en una entidad separada que reemplaza el FIFO fifo_8 . Más sobre este tema, he escrito en una respuesta a la otra pregunta .

    
respondido por el Martin Zabel

Lea otras preguntas en las etiquetas