Здравствуйте, коллеги.
В "Первом примере для платы Марсоход2" есть интересный момент - замкнуты контакты FTDI_BD0 и FTDI_BD1, вследствие чего принятые данные отправляются назад. Это очень хорошее решение, но для реальных проектов нужно немного больше.
Я взял из проекта Altor32 for Marsohod2 вот этот файл
altor32\trunk\rtl\peripheral\uart.v и попробовал сделать loopback, чтобы все принятые данные отправлялись назад. Сделано это было следующим образом:
http://img-fotki.yandex.ru/get/9155/28696123.3/0_91481_f6a21667_orig
Однако, ожидаемого результата не получил - данные даже не принимаются.
Вот пример кода
`define SERIAL_PORT
module test_wires(
input wire i_clk,
input wire reset,
input wire key1,
// Output led control
output wire led0,
output wire led1,
output wire led2,
output wire led3,
// Data lines
input wire serial_rx,
output wire serial_tx
);
wire ready;
wire busy;
wire send;
wire [7:0] rx_byte, tx_byte;
assign led3 = !(reset & key1);
`ifdef SERIAL_PORT
// ==============================================
// Делитель частоты с 100 мГц до 5 мГц
// ==============================================
wire serial_clk;
clock u_clock(
.inclk0(i_clk),
.c0(serial_clk)
);
// ==============================================
// Установка последовательного порта
// ==============================================
uart u_serial(
.clk_i(serial_clk),
.rst_i(reset),
// Status
.tx_busy_o(busy),
.rx_ready_o(ready),
// Data
.data_i(rx_byte),
.wr_i(ready),
.data_o(tx_byte),
.rd_i(1),
// UART pins
.rxd_i(serial_rx),
.txd_o(serial_tx)
);
assign tx_byte = rx_byte;
assign led0 = rx_byte[0];
assign led1 = rx_byte[1];
assign led2 = rx_byte[2];
`else
assign serial_tx = serial_rx;
assign led2 = led2 ^ serial_rx;
`endif
endmodule
Параметры делителя частоты:
Небольшое исправление в uart.v
parameter [31:0] UART_DIVISOR = 128;
Исходил из того, что тактовая частота на входе PIN_25 равна 100мГц. По идее, после деления частоты на 20, на вход clk_i модуля uart податся 5 мГц.
Константу UART_DIVISOR подсмотрел в другом проекте, опубликованном на форуме Марсохода. Вот что сказано в коментарии тому к коду:
//скорость приема и передачи определяется этой константой
//она рассчитана из исх. тактовой частоты 5Mhz и желаемой скорости 38400
//как 5000000/38400 = 130
parameter RCONST = 128;
К сожалению, ни одного байта не было принято, хотя, если соединить FTDI_BD0 и FTDI_BD1 (без использования UART), то данные передаются.
Пожалуйста, помогите разобраться и решить проблему.