СОВРЕМЕННАЯ ЭЛЕКТРОНИКА 2011-4

ПРОГРАММИРОВАНИЕ Б ЛОК ПРИЁМА ДАННЫХ Исходный код блока приёма дан ных находится в файле rx_cntr.v . Ос новой блока приёма также является конечный автомат с двумя состояния ми – режим ожидания ( RX_IDLE ) и ре жим передачи данных ( RX_DATA ). Приём данных начинается после фик сирования старт бита при условии, что память FIFO приёмника не пол ностью заполнена. Если необходимо принять байт, но в буферной памяти нет места, приёмник выдаёт сигнал о переполнении ( rx_overrun ) и остаётся в режиме ожидания. Фрагмент про граммы перехода автомата из состо яния ожидания в состояние приё ма данных выглядит следующим об разом: case (rx_state) `RX_IDLE: begin if (start_rx && ~ffull_i) rx_next_state = `RX_DATA; else if (start_rx && ffull_i) rx_overrun = 1'b1; end Для приёма данных используется частота baudout , которая синтезирует ся генератором частоты, без деления на 16. В состоянии ожидания линия sin_i находится в лог. 1. При фиксиро вании лог. 0 на линии sin_i приёмник начинает считать до восьми на частоте baudout (в модуле rx_cntr.v эта частота называется baud_clk_i ). Если восьмой отсчёт равен нулю, сигнал start_rx ста новится активным, и конечный авто мат переходит в состояние приёма данных. Ещё через восемь отсчётов фиксируется начало первого бита, и затем запоминается каждый средний отсчёт, т.е. восьмой из шестнадцати. Последовательные отсчёты сдвигают ся в регистр rx_shiftreg , который являет ся сдвиговым регистром с последова тельным входом и параллельным вы ходом: if ((rx_state == `RX_DATA) && (baud_counter == 4'h8)) rx_shiftreg[7:0] <= {sin_i,rx_shiftreg[7:1]}; После приёма восьми полезных би тов сигнала и проверки стоп бита по лученный байт записывается в память. При отсутствии стоп бита регистриру ется ошибка приёма байта сигналом frame_err_o . Б УФЕР ПАМЯТИ Приёмник и передатчик использу ют одинаковый модуль памяти, исход ный код которого содержится в файле fifo.v . Это память типа FIFO объёмом 512 байт. После инициализации па мять пуста, адрес для записи adrw ра вен адресу для чтения adrr и равен ну лю. Счётчик байтов в памяти fifo_count также равен нулю. В рабочем состоя нии сигнал we_i записывает данные в память, увеличивая счётчик байтов и адрес для записи, а сигнал rd_i – счи тывает данные, уменьшая счётчик байтов и увеличивая адрес чтения. Ес ли при чтении адрес adrr становится равным адресу adrw , значит, память пуста: else if (rd_i) begin data_o <= fifo[adrr]; adrr <= adrr + 1'b1; if ((adrr + 1'b1 === adrw)) fifo_empty <= 1'b1; end Аналогично, если при записи ад рес записи adrw становится равным адресу чтения adrr , значит, память полностью заполнена. Фрагмент цикла чтения/записи в память пе редатчика изображён на рисун ке 4; показана запись 4 байт, при за писи третьего байта одновремен но происходит чтение, поэтому в этот момент счётчик числа байтов в памяти не увеличивает своё зна чение. З АКЛЮЧЕНИЕ Рассмотренный в статье приёмо передатчик был успешно испытан на отладочной плате SP605 для ПЛИС Xilinx семейства Spartan 6. Со сторо ны компьютера использовалась стан дартная программа связи HyperTer minal. Описанная модель UART является учебным материалом, демонстрирую щим принципы действия устройства. Архив uart.zip с упомянутыми в статье файлами программ находится в элек тронном приложении к статье на сай те журнала. Л ИТЕРАТУРА 1. PC16550D Universal Acynchronous Re ceiver/Transmitter with FIFOs. National Semiconductor. 2. CP2103 Single chip USB to UART Bridge. Si licon Laboratories. 73 WWW.SOEL.RU СОВРЕМЕННАЯ ЭЛЕКТРОНИКА ◆ № 4 2011 Реклама © СТА-ПРЕСС

RkJQdWJsaXNoZXIy MTQ4NjUy