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?