我正在学习 vhdl 和 fpga,我有一个数字板 Nexys 4。我正在尝试通过 UART 发送一个字符串。每次点击板上的按钮时,我都成功发送了一个字符。
现在我想在每次单击按钮后发送整个字符串,但我没有从终端得到任何输出(我使用腻子)。我做错了什么?
这是最上面的模块,我相信问题可能就在这里,但我不是100%确定。
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity UART_tx_top is
port(btnC : in std_logic;
clk : in std_logic;
RsTx : out std_logic);
end UART_tx_top;
architecture behavioral of UART_tx_top is
signal string_to_send : string := "Hello World!";
constant string_length : integer := 12;
signal tx_index : integer := 0;
type state_type is (TX_WAIT_BTN, TX_SEND_CHAR, TX_SEND_WAIT);
signal state : state_type := TX_WAIT_BTN;
signal uartRdy : std_logic;
signal uartSend: std_logic;
signal uartData: std_logic_vector (7 downto 0);
signal initStr : std_logic_vector (7 downto 0) := x"41";
signal btnCclr : std_logic;
signal btnC_prev : std_logic;
component UART_tx_ctrl
generic(baud : integer);
port(send : in std_logic;
clk : in std_logic;
data : in std_logic_vector (7 downto 0);
ready : out std_logic;
uart_tx : out std_logic);
end component;
component debounce is
port(clk : in std_logic;
btn : in std_logic;
btn_clr : out std_logic);
end component;
begin
process(clk)
begin
if rising_edge(clk) then
btnC_prev <= btnCclr;
case state is
when TX_WAIT_BTN =>
if btnC_prev = '0' and btnCclr = '1' then
state <= TX_SEND_CHAR;
end if;
when TX_SEND_CHAR =>
if tx_index < string_length then
uartData <= std_logic_vector(to_unsigned(character'pos(string_to_send(tx_index + 1)), 8));
--initStr <= std_logic_vector(unsigned(initStr) + 1);
tx_index <= tx_index + 1;
--state <= TX_SEND_WAIT;
else
uartData <= (others => '0');
tx_index <=0;
state <= TX_WAIT_BTN;
end if;
when TX_SEND_WAIT =>
if uartRdy = '1' then state <= TX_WAIT_BTN;
end if;
end case;
end if;
end process;
uartSend <= '1' when (state = TX_SEND_CHAR) else '0';
SX : UART_tx_ctrl generic map(baud => 19200)
port map(send => uartSend, data => uartData, clk => clk, ready => uartRdy, uart_tx => RsTx);
dbc : debounce port map(clk => clk, btn => btnC, btn_clr => btnCclr);
end behavioral;
在我看来,您似乎并没有等待每个字符都被发送出去。您只是在每个时钟周期更新 uartData,而不检查 uartRdy 信号。
所以我认为您注释掉的 TX_SEND_WAIT 状态实际上就是您所需要的。在该状态(或创建第二个状态)下,您只需检查是否位于字符串末尾或是否有更多字符要发送。