Немного про UART
May. 20th, 2019 10:47 pmВ целях практики в Verilog изобрел для МЭСМ-6 велосипед UART.
Код тут: gist
Со стороны МЭСМ программируется через два регистра - управляющий/статусный и регистр буфера FIFO.
Управляющий регистр при записи имеет вид:

Запись в управляющий регистр устанавливает делитель частоты, включает цепи приема/передачи и режим самотестирования(loopback).
Разрядность делителя 9 бит (+4 бита для постоянного множителя х16).UART работает на частоте процессора 50МГц поэтому 9 битного делителя хватает на диапазон скоростей от 9600 до 115200.
Во время чтения регистра поля имеют вид:

где rx/tx empty сообщает о том что соотв. FIFO пустое.
tx_finish - устанавливается когда все байты из tx FIFO переданы и выдвинуты все биты последнего байта.
Запись байта в буфер FIFO укладывает его в очередь, если очередь переполнена, то затирается последний уложенный байт.
При чтении из буфера FIFO, вместе с 8-мью битами данных читается бит состояния очереди, который равен 0 если биты данных имеют смысл и 1 если очередь была пуста.

Короткая программка реализующая "эхо" полученных символов:
Нужны ли для МЭСМ режимы передачи отличные от 8n1, т.е. с битом четности, доп. стопом и произвольной длиной байта?
Забавно получилось. Когда пришел за резисторами в местный Чип и Дип, спросил есть ли у них логический пробник, молодые люди сделали вопросительные удивленные лица. Видимо сейчас даже у самого начинающего радиолюбителя есть осциллограф для таких целей 😂
Код тут: gist
Со стороны МЭСМ программируется через два регистра - управляющий/статусный и регистр буфера FIFO.
Управляющий регистр при записи имеет вид:

Запись в управляющий регистр устанавливает делитель частоты, включает цепи приема/передачи и режим самотестирования(loopback).
Разрядность делителя 9 бит (+4 бита для постоянного множителя х16).UART работает на частоте процессора 50МГц поэтому 9 битного делителя хватает на диапазон скоростей от 9600 до 115200.
Во время чтения регистра поля имеют вид:

где rx/tx empty сообщает о том что соотв. FIFO пустое.
tx_finish - устанавливается когда все байты из tx FIFO переданы и выдвинуты все биты последнего байта.
Запись байта в буфер FIFO укладывает его в очередь, если очередь переполнена, то затирается последний уложенный байт.
При чтении из буфера FIFO, вместе с 8-мью битами данных читается бит состояния очереди, который равен 0 если биты данных имеют смысл и 1 если очередь была пуста.

Короткая программка реализующая "эхо" полученных символов:
*
* UART echo-test.
*
start start '1'
* UART registers
U0_DT equ '77740' , data fifo
U0_CT equ '77747' , control and status reg
U0_CTS equ '77746' , set bits
U0_CTC equ '77745' , clear bits
ntr 3
* reset uart
xta '0'
atx U0_CT
* set divider
xta =b'033' , 115200
atx U0_CTS
xta =b'1000' , enable rx tx
atx U0_CTS
l4 xta U0_DT
ati 4
aax =b'400' , wait for data
u1a l4
ita 4
atx U0_DT , push data to tx fifo
* wait for send complete
loop xta U0_CT
aax =b'10000' , tx_finish bit
uza loop
uj l4
*-------------------------
align адрес start+'1777' , данные с адреса 2000
fin
Нужны ли для МЭСМ режимы передачи отличные от 8n1, т.е. с битом четности, доп. стопом и произвольной длиной байта?
Забавно получилось. Когда пришел за резисторами в местный Чип и Дип, спросил есть ли у них логический пробник, молодые люди сделали вопросительные удивленные лица. Видимо сейчас даже у самого начинающего радиолюбителя есть осциллограф для таких целей 😂