Я разработал два компонента: передатчик 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>
Пожалуйста, кто-нибудь может мне помочь? Заранее спасибо :)
введите описание изображения здесь