diff --git a/Labs/13. Peripheral units/README.md b/Labs/13. Peripheral units/README.md index 3921c19..7fe97f6 100644 --- a/Labs/13. Peripheral units/README.md +++ b/Labs/13. Peripheral units/README.md @@ -473,7 +473,7 @@ endmodule Для того, чтобы передача данных была успешно осуществлена, приемник и передатчик на обоих концах одного провода должны договориться о параметрах передачи: * её скорости (бодрейт); -* контроля целостности данных (использование бита четности/нечетности/отсутствие контроля); +* контроля целостности данных (использовать или нет [бит четности](https://en.wikipedia.org/wiki/Parity_bit)); * длины стопового бита. Вам будут предоставлены модули, осуществляющие прием и передачу данных по этому интерфейсу, от вас лишь требуется написать модули, осуществляющие управление предоставленными модулями. @@ -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 // Сигнал о том, что прием данных завершен @@ -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 // Сигнал о старте передачи данных ); @@ -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; @@ -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 @@ -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` данного модуля закомментирован ради простоты системы). ### Видеоадаптер diff --git a/Labs/13. Peripheral units/peripheral modules/uart_rx.sv b/Labs/13. Peripheral units/peripheral modules/uart_rx.sv index c6529e0..78e85ba 100644 --- a/Labs/13. Peripheral units/peripheral modules/uart_rx.sv +++ b/Labs/13. Peripheral units/peripheral modules/uart_rx.sv @@ -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, diff --git a/Labs/13. Peripheral units/peripheral modules/uart_tx.sv b/Labs/13. Peripheral units/peripheral modules/uart_tx.sv index 11bbf34..f08b92f 100644 --- a/Labs/13. Peripheral units/peripheral modules/uart_tx.sv +++ b/Labs/13. Peripheral units/peripheral modules/uart_tx.sv @@ -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, @@ -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;