СОВРЕМЕННАЯ ЭЛЕКТРОНИКА 2011-4
ти до 1 Мбит/с и также имеет буфер памяти 576 байт для приёмника и 640 байт для передатчика. Более под робно структура UART 16550 и моста CP2103 описаны в [1] и [2] соответ ственно. Контрольные регистры задают такие параметры, как разрешение или за прещение прерываний, причины пре рываний, порог срабатывания преры вания для буфера приёмника и некото рые другие. Все регистры адресуются при помощи трёх адресных линий. Рассмотрим более подробно работу отдельных блоков UART. П РЕОБРАЗОВАТЕЛЬ ЧАСТОТЫ Блок генератора, исходный код ко торого находится в файле baud_gene rator.v , служит для преобразования основной тактовой частоты UART в частоту приёма и передачи данных. 16 битный регистр divisor_reg может быть установлен в любое значение, отличное от нуля. Для конфигурации этого регистра сначала необходимо установить бит 7 контрольного регис тра line_control в единичное значение (в файле uart_top.v ); затем записать по адресу 3’b000 младший байт регистра и по адресу 3’b001 – старший байт. Для расчёта частоты передачи данных необходимо поделить основную так товую частоту на 2 и затем ещё раз – на коэффициент деления. На плате SP605 для тактирования UART исполь зовался сигнал с частотой 27 МГц. При первоначальном включении регистр divisor_reg устанавливается в значе ние 16’h0058 (88 в десятичной систе ме), т.е. получаем выходную частоту baudout 27 000 000/(2*88) = 153 409 Гц. Частота передачи данных при этом будет равна baudout /16 = 9588 Гц. Отклонение от стандартной частоты передачи данных 9600 Гц составляет 0,1%, что вполне допустимо. Б ЛОК ПЕРЕДАЧИ ДАННЫХ Исходный код блока передачи дан ных находится в файле tx_cntr.v . Заме тим, что для передачи и приёма ис пользуется одна и та же модель памяти FIFO, расположенная в файле fifo.v . В файле верхнего уровня uart_top.v эти два буфера включены под названиями tx_fifo_top и rx_fifo_top – для передатчи ка и приёмника соответственно. Основой блока передачи данных яв ляется конечный автомат, который может находиться в двух состояниях: режим ожидания ( TX_IDLE ) и режим передачи данных ( TX_DATA ). Конеч ный автомат отслеживает состояние памяти FIFO при помощи сигнала ftempty_i . До тех пор, пока этот сигнал находится в лог. 1, память передатчика пуста. При записи одного или более байт данных в эту память сигнал ftempty_i переходит в лог. 0. При этом конечный автомат переходит в состо яние TX_DATA и генерирует строб чте ния слова rd_o , т.е. считывает один байт из буферной памяти и начинает передачу данных. После передачи одного байта данных автомат возвра щается в состояние ожидания и, если в памяти ещё остались данные для пере дачи, сразу же переходит в состояние TX_DATA . Этот циклический процесс продолжается до тех пор, пока в бу ферной памяти передатчика остаётся хотя бы один байт. Фрагмент симуля ции процесса передачи изображён на рисунке 3. Как упоминалось выше, для переда чи данных используется частота baud out , поделённая на 16. Этот сигнал на зывается baud_16 . Для подсчёта пере данных битов данных служит счётчик bus_counter , который равен нулю при нахождении конечного автомата в со стоянии ожидания и увеличивает своё значение на единицу при каждом по ложительномфронте сигнала baud_16 , если конечный автомат находится в состоянии передачи данных. Счётчик также обнуляется при достижении зна чения 9, что необходимо для избега ния дополнительных тактов ожидания при непрерывной передаче несколь ких байтов. Логика работы счётчика на языке Verilog выглядит следующим образом: if ((tx_state == `TX_IDLE) || (bus_counter == 4'h9)) bus_counter <= 4'h0; else bus_counter <= bus_counter + 1'b1; Как видно из рисунка 3, при перехо де конечного автомата из состояния TX_IDLE в TX_DATA генерируется строб чтения памяти FIFO rd_o . После этого прочитанный байт загружается в сдви говый регистр tx_shiftreg . Этот регистр относится к типу с параллельным вхо дом и последовательным выходом. Однако до начала сдвига в регистре, т.е. передачи полезных данных, необ ходимо передать старт бит. Это проис ходит на отрицательном фронте сиг нала baud_16 при значении счётчика bus_counter = 4'h1. В течение последу ющих восьми отрицательных фрон тов сигнала сдвиговый регистр сдви гается на один бит за каждый цикл, таким образом, формируется по следовательная цепочка на выходе sout_o , как это видно из фрагмента программы: case (bus_counter) 4'h2,4'h3,4'h4,4'h5,4'h6,4'h7,4'h 8,4'h9: begin sout_o <= tx_shiftreg[0]; tx_shiftreg <= (tx_shiftreg >> 1'b1); end ПРОГРАММИРОВАНИЕ 72 WWW.SOEL.RU СОВРЕМЕННАЯ ЭЛЕКТРОНИКА ◆ № 4 2011 Рис. 4. Работа памяти FIFO Рис. 3. Фрагмент симуляции процесса передачи © СТА-ПРЕСС
Made with FlippingBook
RkJQdWJsaXNoZXIy MTQ4NjUy