vhdl中的uart发送字符串

问题描述 投票:0回答:1

我正在学习 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;

vhdl fpga uart
1个回答
0
投票

在我看来,您似乎并没有等待每个字符都被发送出去。您只是在每个时钟周期更新 uartData,而不检查 uartRdy 信号。

所以我认为您注释掉的 TX_SEND_WAIT 状态实际上就是您所需要的。在该状态(或创建第二个状态)下,您只需检查是否位于字符串末尾或是否有更多字符要发送。

© www.soinside.com 2019 - 2024. All rights reserved.