Передатчик и приемник UART на шине AXI - PullRequest
0 голосов
/ 10 июля 2020

Я разработал два компонента: передатчик UART и приемник UART (отправляет / принимает 8 бит данных). И Tx, и Rx работают нормально, но я не могу обернуть их в компонент интерфейса шины AXI.

Мой передатчик UART определяется как:

entity Uart_Transmitter is
port(
        start : in std_logic;
        inputData : in std_logic_vector(7 downto 0);
        txClock : in std_logic;
        txReset : in std_logic;
        bit_transmitted : out std_logic;
        stop : out std_logic;
);  

Используя VIVADO, я создал 2 AXI IP-адреса шины отображают порты в памяти, чтобы я мог управлять ими с помощью программного обеспечения (Vitis). О передатчике Я сопоставил сигналы в памяти следующим образом:

status_reg0: bit 0: uart_tx_stop bit (1, когда tx заканчивается)

ctrl_reg1: bit 0: используется для запуска tx (назначен на uart_tx_start сопоставлен с портом запуска передатчика)

data_reg2: 7 вниз до 0: байт для передачи

Это процесс, который я использую для записи данных, обращающихся к памяти. По сути, я использую BASE_ADDR + 1 как ctrl_reg1 и BASE_ADDR + 2 как data_reg2.

when b"01" =>
for byte_index in 0 to (C_S_AXI_DATA_WIDTH/8-1) loop
    if ( S_AXI_WSTRB(byte_index) = '1' ) then
    -- Respective byte enables are asserted as per write strobes                   
    -- slave registor 1
    ctrl_reg1(byte_index*8+7 downto byte_index*8) <=  S_AXI_WDATA(byte_index*8+7 downto byte_index*8);
    end if;
end loop;
when b"10" =>
for byte_index in 0 to (C_S_AXI_DATA_WIDTH/8-1) loop
    if ( S_AXI_WSTRB(byte_index) = '1' ) then
    -- Respective byte enables are asserted as per write strobes                   
    -- slave registor 2
    data_reg2(byte_index*8+7 downto byte_index*8) <= S_AXI_WDATA(byte_index*8+7 downto byte_index*8);
    end if;
end loop;

И я читаю данные следующим образом:

process (status_reg0, ctrl_reg1, data_reg2, slv_reg3, axi_araddr, S_AXI_ARESETN, slv_reg_rden)
variable loc_addr :std_logic_vector(OPT_MEM_ADDR_BITS downto 0);
begin
    -- Address decoding for reading registers
    loc_addr := axi_araddr(ADDR_LSB + OPT_MEM_ADDR_BITS downto ADDR_LSB);
    case loc_addr is
        when b"00" =>
        reg_data_out <= status_reg0;
        when b"01" =>
        reg_data_out <= ctrl_reg1;
        when b"10" =>
        reg_data_out <= data_reg2;
        when b"11" =>
        reg_data_out <= (others => '0');
        when others =>
        reg_data_out  <= (others => '0');
    end case;
end process; 


signal uart_tx_start : std_logic;
signal uart_tx_stop : std_logic;
signal reset : std_logic;
signal uart_tx_input_data : std_logic_vector(7 downto 0);

[...]

status_reg0(0) <= uart_tx_stop;
uart_tx_start <= ctrl_reg1(0);
uart_tx_input_data <= data_reg2(7 downto 0);
    
uart_tx: Uart_Transmitter
port map(
        start => uart_tx_start,
        inputData => uart_tx_input_data,
        txClock => clk,
        txReset => reset,
        bit_transmitted => bit_tx,
        stop => uart_tx_stop,
);

Странный дело в том, что даже если я записываю данные в память:

int * tx = (int*) TX_BASE_ADDR;
tx[2] = 0b010101;
tx[1] = 0x1;

Передача не начинается или, по крайней мере, доступ к tx [0] дает мне 0 (должно быть 1, потому что status_reg0 (0) <= uart_tx_stop ). Я протестировал следующее на тестовом стенде (без AXI), и все вроде нормально. Я совершенно уверен, что «я что-то испортил с интерфейсом шины AXI, возможно, процесс записи нарушен (или чтение), или, возможно, сигналы неправильно отображаются на передатчик UART. </p>

Пожалуйста, кто-нибудь может мне помочь? Заранее спасибо :)

введите описание изображения здесь

...