Skip to content

Commit

Permalink
ЛР13. Изменение спецификации на контроллеры uart
Browse files Browse the repository at this point in the history
  • Loading branch information
HepoH3 committed Jul 4, 2024
1 parent 1f5c1bc commit ffc6a56
Show file tree
Hide file tree
Showing 3 changed files with 31 additions and 27 deletions.
52 changes: 28 additions & 24 deletions Labs/13. Peripheral units/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -473,7 +473,7 @@ endmodule
Для того, чтобы передача данных была успешно осуществлена, приемник и передатчик на обоих концах одного провода должны договориться о параметрах передачи:

* её скорости (бодрейт);
* контроля целостности данных (использование бита четности/нечетности/отсутствие контроля);
* контроля целостности данных (использовать или нет [бит четности](https://en.wikipedia.org/wiki/Parity_bit));
* длины стопового бита.

Вам будут предоставлены модули, осуществляющие прием и передачу данных по этому интерфейсу, от вас лишь требуется написать модули, осуществляющие управление предоставленными модулями.
Expand All @@ -487,7 +487,7 @@ module uart_rx (
output logic busy_o, // Сигнал о том, что модуль занят приемом данных
input logic [16:0] baudrate_i, // Настройка скорости передачи данных
input logic parity_en_i,// Настройка контроля целостности через бит четности
input logic stopbit_i, // Настройка длины стопового бита
input logic [1:0] stopbit_i, // Настройка длины стопового бита
output logic [7:0] rx_data_o, // Принятые данные
output logic rx_valid_o // Сигнал о том, что прием данных завершен
Expand All @@ -504,7 +504,7 @@ module uart_tx (
output logic busy_o, // Сигнал о том, что модуль занят передачей данных
input logic [16:0] baudrate_i, // Настройка скорости передачи данных
input logic parity_en_i,// Настройка контроля целостности через бит четности
input logic stopbit_i, // Настройка длины стопового бита
input logic [1:0] stopbit_i, // Настройка длины стопового бита
input logic [7:0] tx_data_i, // Отправляемые данные
input logic tx_valid_i // Сигнал о старте передачи данных
);
Expand Down Expand Up @@ -544,7 +544,7 @@ module uart_rx_sb_ctrl(
logic busy;
logic [16:0] baudrate;
logic parity_en;
logic stopbit;
logic [1:0] stopbit;
logic [7:0] data;
logic valid;
Expand Down Expand Up @@ -574,7 +574,7 @@ module uart_tx_sb_ctrl(
logic busy;
logic [16:0] baudrate;
logic parity_en;
logic stopbit;
logic [1:0] stopbit;
logic [7:0] data;
endmodule
Expand All @@ -596,34 +596,38 @@ endmodule

В регистр `valid` модуля `uart_rx_sb_ctrl` записывается единица по положительному фронту clk_i, когда выход `rx_valid_o` равен единице. Данный регистр сбрасывается в ноль при выполнении **запроса на чтение** по адресу `0x00`, а также при получении сигнала `interrupt_return_i`. Сам регистр доступен для чтения по адресу `0x04`. Регистр `valid` подключается к выходу `interrupt_request_o`. Что позволяет узнать о пришедших данных и посредством прерывания.

На вход `tx_data_i` модуля `uart_tx` подаются данные из регистра `data` модуля `uart_tx_sb_ctrl`. Доступ на запись в этот регистр происходит по адресу `0x00` в моменты положительного фронта `clk_i`, когда сигнал `busy_o` равен нулю. Доступ на чтение этого регистра может осуществляться в любой момент времени.
Доступ на запись в регистр `data` модуля `uart_tx_sb_ctrl` происходит по адресу `0x00` в моменты положительного фронта `clk_i`, когда сигнал `busy_o` равен нулю. Доступ на чтение этого регистра может осуществляться в любой момент времени.

На вход `tx_data_i` модуля `uart_tx` непрерывно подается младший байт входа `write_data_i`.

На вход `tx_valid_i` модуля `uart_tx` подается единица в момент выполнения **запроса на запись** по адресу `0x00` (при сигнале `busy` равном нулю). В остальное время на вход этого сигнала подается `0`.

В случае **запроса на запись** значения `1` по адресу `0x24` (адресу сброса), все регистры модуля-контроллера должны сброситься. При этом регистр `baudrate` должен принять значение `9600`, регистр `parity` должен принять значение `1`, регистр, `stopbit` должен принять значение `1`. Остальные регистры должны принять значение `0`.
В случае **запроса на запись** значения `1` по адресу `0x24` (адресу сброса), все регистры модуля-контроллера должны сброситься. При этом регистр `baudrate` должен принять значение `9600`, регистр, `stopbit` должен принять значение `1`. Остальные регистры должны принять значение `0`.

Адресное пространство контроллера `uart_rx_sb_ctrl`:

|Адрес|Режим доступа|Допустимые значения| Функциональное назначение |
|-----|-------------|-------------------|---------------------------------------------------------------------------------------------------------|
|0x00 | R | [0:255] | Чтение из регистра `data`, хранящего значение принятых данных |
|0x04 | R | [0:1] | Чтение из регистра `valid`, сообщающего о том, что есть непрочитанные данные в регистре `data` |
|0x08 | R | [0:1] | Чтение из регистра `busy`, сообщающего о том, что модуль находится в процессе приема данных |
|0x0C | RW | [0:131072] | Чтение/запись регистра `baudrate`, отвечающего за скорость передачи данных |
|0x10 | RW | [0:1] | Чтение/запись регистра `parity`, отвечающего за включение отключение проверки данных через бит четности |
|0x14 | RW | [0:1] | Чтение/запись регистра `stopbit`, отвечающего за длину стопового бита |
|0x24 | W | 1 | Запись сигнала сброса |
|Адрес|Режим доступа|Допустимые значения| Функциональное назначение |
|-----|-------------|-------------------|------------------------------------------------------------------------------------------------------------|
|0x00 | R | [0:255] | Чтение из регистра `data`, хранящего значение принятых данных |
|0x04 | R | [0:1] | Чтение из регистра `valid`, сообщающего о том, что есть непрочитанные данные в регистре `data` |
|0x08 | R | [0:1] | Чтение из регистра `busy`, сообщающего о том, что модуль находится в процессе приема данных |
|0x0C | RW | [0:131072] | Чтение/запись регистра `baudrate`, отвечающего за скорость передачи данных |
|0x10 | RW | [0:1] | Чтение/запись регистра `parity_en`, отвечающего за включение отключение проверки данных через бит четности |
|0x14 | RW | [1:2] | Чтение/запись регистра `stopbit`, хранящего длину стопового бита |
|0x24 | W | 1 | Запись сигнала сброса |

Адресное пространство контроллера `uart_tx_sb_ctrl`:

|Адрес|Режим доступа|Допустимые значения| Функциональное назначение |
|-----|-------------|-------------------|---------------------------------------------------------------------------------------------------------|
|0x00 | RW | [0:255] | Чтение и запись регистра `data`, хранящего значение отправляемых данных |
|0x08 | R | [0:1] | Чтение из регистра `busy`, сообщающего о том, что модуль находится в процессе передачи данных |
|0x0C | RW | [0:131072] | Чтение/запись регистра `baudrate`, отвечающего за скорость передачи данных |
|0x10 | RW | [0:1] | Чтение/запись регистра `parity`, отвечающего за включение отключение проверки данных через бит четности |
|0x14 | RW | [0:1] | Чтение/запись регистра `stopbit`, отвечающего за длину стопового бита |
|0x24 | W | 1 | Запись сигнала сброса |
|Адрес|Режим доступа|Допустимые значения| Функциональное назначение |
|-----|-------------|-------------------|------------------------------------------------------------------------------------------------------------|
|0x00 | RW | [0:255] | Чтение и запись регистра `data`, хранящего значение отправляемых данных |
|0x08 | R | [0:1] | Чтение из регистра `busy`, сообщающего о том, что модуль находится в процессе передачи данных |
|0x0C | RW | [0:131072] | Чтение/запись регистра `baudrate`, отвечающего за скорость передачи данных |
|0x10 | RW | [0:1] | Чтение/запись регистра `parity_en`, отвечающего за включение отключение проверки данных через бит четности |
|0x14 | RW | [1:2] | Чтение/запись регистра `stopbit`, хранящего длину стопового бита |
|0x24 | W | 1 | Запись сигнала сброса |

В случае установки регистра `parity_en` в значение `1`, модуль uart_tx будет дополнять посылку битом четности (который вычисляется как исключающее ИЛИ по всем битам передаваемого байта). Модуль `uart_rx` же будет выполнять проверку этого бита с тем, что он рассчитает самостоятельно. Однако в случае появления ошибки, внешне его поведение никак не изменится (поскольку выход `err_o` данного модуля закомментирован ради простоты системы).

### Видеоадаптер

Expand Down
2 changes: 1 addition & 1 deletion Labs/13. Peripheral units/peripheral modules/uart_rx.sv
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ module uart_rx (
output logic busy_o,
input logic [16:0] baudrate_i,
input logic parity_en_i,
input logic stopbit_i,
input logic [1:0] stopbit_i,
output logic [7:0] rx_data_o,
output logic rx_valid_o
//, input logic cfg_en_i,
Expand Down
4 changes: 2 additions & 2 deletions Labs/13. Peripheral units/peripheral modules/uart_tx.sv
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ module uart_tx (
output logic busy_o,
input logic [16:0] baudrate_i,
input logic parity_en_i,
input logic stopbit_i,
input logic [1:0] stopbit_i,
input logic [7:0] tx_data_i,
input logic tx_valid_i
//, input logic cfg_en_i,
Expand Down Expand Up @@ -161,7 +161,7 @@ module uart_tx (
baudgen_en = 1'b1;
if (bit_done)
begin
if (stopbit_i)
if (stopbit_i[1])
NS = STOP_BIT_LAST;
else
NS = IDLE;
Expand Down

0 comments on commit ffc6a56

Please sign in to comment.