mirror of
https://github.com/MPSU/APS.git
synced 2025-09-15 17:20:10 +00:00
ЛР13. Использование req_i в vga-контроллере
This commit is contained in:
@@ -701,43 +701,45 @@ _Рисунок 6. Отрисовка символа `F` в разрешении
|
|||||||
|
|
||||||
```SystemVerilog
|
```SystemVerilog
|
||||||
module vgachargen (
|
module vgachargen (
|
||||||
input logic clk_i, // системный синхроимпульс
|
input logic clk_i, // системный синхроимпульс
|
||||||
input logic clk100m_i, // клок с частотой 100МГц
|
input logic clk100m_i, // клок с частотой 100МГц
|
||||||
input logic rst_i, // сигнал сброса
|
input logic rst_i, // сигнал сброса
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Интерфейс записи выводимого символа
|
Интерфейс записи выводимого символа
|
||||||
*/
|
*/
|
||||||
input logic [ 9:0] char_map_addr_i, // адрес позиции выводимого символа
|
input logic char_map_req_i, // запрос к памяти выводимых символов
|
||||||
input logic char_map_we_i, // сигнал разрешения записи кода
|
input logic [ 9:0] char_map_addr_i, // адрес позиции выводимого символа
|
||||||
input logic [ 3:0] char_map_be_i, // сигнал выбора байтов для записи
|
input logic char_map_we_i, // сигнал разрешения записи кода
|
||||||
input logic [31:0] char_map_wdata_i, // ascii-код выводимого символа
|
input logic [ 3:0] char_map_be_i, // сигнал выбора байтов для записи
|
||||||
output logic [31:0] char_map_rdata_o, // сигнал чтения кода символа
|
input logic [31:0] char_map_wdata_i, // ascii-код выводимого символа
|
||||||
|
output logic [31:0] char_map_rdata_o, // сигнал чтения кода символа
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Интерфейс установки цветовой схемы
|
Интерфейс установки цветовой схемы
|
||||||
*/
|
*/
|
||||||
input logic [ 9:0] col_map_addr_i, // адрес позиции устанавливаемой схемы
|
input logic col_map_req_i, // запрос к памяти цветов символов
|
||||||
input logic col_map_we_i, // сигнал разрешения записи схемы
|
input logic [ 9:0] col_map_addr_i, // адрес позиции устанавливаемой схемы
|
||||||
input logic [ 3:0] col_map_be_i, // сигнал выбора байтов для записи
|
input logic col_map_we_i, // сигнал разрешения записи схемы
|
||||||
input logic [31:0] col_map_wdata_i, // код устанавливаемой цветовой схемы
|
input logic [ 3:0] col_map_be_i, // сигнал выбора байтов для записи
|
||||||
output logic [31:0] col_map_rdata_o, // сигнал чтения кода схемы
|
input logic [31:0] col_map_wdata_i, // код устанавливаемой цветовой схемы
|
||||||
|
output logic [31:0] col_map_rdata_o, // сигнал чтения кода схемы
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Интерфейс установки шрифта
|
Интерфейс установки шрифта.
|
||||||
*/
|
*/
|
||||||
input logic [ 9:0] char_tiff_addr_i, // адрес позиции устанавливаемого шрифта
|
input logic char_tiff_req_i, // запрос к памяти шрифтов символов
|
||||||
input logic char_tiff_we_i, // сигнал разрешения записи шрифта
|
input logic [ 9:0] char_tiff_addr_i, // адрес позиции устанавливаемого шрифта
|
||||||
input logic [ 3:0] char_tiff_be_i, // сигнал выбора байтов для записи
|
input logic char_tiff_we_i, // сигнал разрешения записи шрифта
|
||||||
input logic [31:0] char_tiff_wdata_i,// отображаемые пиксели в текущей позиции шрифта
|
input logic [ 3:0] char_tiff_be_i, // сигнал выбора байтов для записи
|
||||||
output logic [31:0] char_tiff_rdata_o,// сигнал чтения пикселей шрифта
|
input logic [31:0] char_tiff_wdata_i, // отображаемые пиксели в текущей позиции шрифта
|
||||||
|
output logic [31:0] char_tiff_rdata_o, // сигнал чтения пикселей шрифта
|
||||||
|
|
||||||
|
output logic [3:0] vga_r_o, // красный канал vga
|
||||||
output logic [3:0] vga_r_o, // красный канал vga
|
output logic [3:0] vga_g_o, // зеленый канал vga
|
||||||
output logic [3:0] vga_g_o, // зеленый канал vga
|
output logic [3:0] vga_b_o, // синий канал vga
|
||||||
output logic [3:0] vga_b_o, // синий канал vga
|
output logic vga_hs_o, // линия горизонтальной синхронизации vga
|
||||||
output logic vga_hs_o, // линия горизонтальной синхронизации vga
|
output logic vga_vs_o // линия вертикальной синхронизации vga
|
||||||
output logic vga_vs_o // линия вертикальной синхронизации vga
|
|
||||||
);
|
);
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -748,9 +750,10 @@ module vgachargen (
|
|||||||
- firmware/mem_files/lab_13_ps2_vga_instr.mem — этим файлом необходимо проинициализировать память инструкций
|
- firmware/mem_files/lab_13_ps2_vga_instr.mem — этим файлом необходимо проинициализировать память инструкций
|
||||||
- firmware/mem_files/lab_13_ps2ascii_data.mem — этим файлом необходимо проинициализировать память данных
|
- firmware/mem_files/lab_13_ps2ascii_data.mem — этим файлом необходимо проинициализировать память данных
|
||||||
- firmware/mem_files/lab_13_vga_ch_t.mem
|
- firmware/mem_files/lab_13_vga_ch_t.mem
|
||||||
|
- firmware/mem_files/lab_13_vga_ch_map.mem
|
||||||
- firmware/mem_files/lab_13_vga_col_map.mem
|
- firmware/mem_files/lab_13_vga_col_map.mem
|
||||||
|
|
||||||
Вам необходимо добавить в проект все эти файлы. Последние два файла отвечают за инициализацию памятей шрифтов и цветов. Инициализация будет выполнена автоматически. Главное, чтобы файлы были добавлены в проект.
|
Вам необходимо добавить в проект все эти файлы. Последние три файла отвечают за инициализацию памятей шрифтов, символов и цветов. Инициализация будет выполнена автоматически. Главное, чтобы файлы были добавлены в проект.
|
||||||
|
|
||||||
Для управления данным модулем, необходимо написать модуль-контроллер со следующим прототипом:
|
Для управления данным модулем, необходимо написать модуль-контроллер со следующим прототипом:
|
||||||
|
|
||||||
@@ -800,16 +803,25 @@ module vga_sb_ctrl (
|
|||||||
2. `col_map_be_i`,
|
2. `col_map_be_i`,
|
||||||
3. `char_tiff_be_i`.
|
3. `char_tiff_be_i`.
|
||||||
|
|
||||||
Остается только разобраться с сигналами `write_enable_i` и `read_data_o`.
|
Остается только разобраться с сигналами `req_i`, `write_enable_i` и `read_data_o`.
|
||||||
|
|
||||||
Оба эти сигнала мультиплексируются / демультиплексируются с помощью одного и того же управляющего сигнала: `addr_i[13:12]` в соответствии с диапазонами адресов (рис. 4):
|
Все эти сигналы мультиплексируются / демультиплексируются с помощью одного и того же управляющего сигнала: `addr_i[13:12]` в соответствии с диапазонами адресов (рис. 4):
|
||||||
|
|
||||||
- `addr_i[13:12] == 2'b00` — сигнал `write_enable_i` поступает на вход `char_map_we_i`, выход `char_map_rdata_o` подается на выход `read_data_o`;
|
- `addr_i[13:12] == 2'b00`
|
||||||
- `addr_i[13:12] == 2'b01` — сигнал `write_enable_i` поступает на вход `col_map_we_i`, выход `col_map_rdata_o` подается на выход `read_data_o`;
|
- `req_i` подается на вход `char_map_req_i`,
|
||||||
- `addr_i[13:12] == 2'b10` — сигнал `write_enable_i` поступает на вход `char_tiff_we_i`, выход `char_tiff_rdata_o` подается на выход `read_data_o`.
|
- `write_enable_i` поступает на вход `char_map_we_i`,
|
||||||
|
- `char_map_rdata_o` подается на выход `read_data_o`;
|
||||||
|
- `addr_i[13:12] == 2'b01`
|
||||||
|
- `req_i` поступает на вход `col_map_req_i`,
|
||||||
|
- `write_enable_i` поступает на вход `col_map_we_i`,
|
||||||
|
- `col_map_rdata_o` подается на выход `read_data_o`;
|
||||||
|
- `addr_i[13:12] == 2'b10`
|
||||||
|
- `req_i` поступает на вход `char_tiff_req_i`,
|
||||||
|
- `write_enable_i` поступает на вход `char_tiff_we_i`,
|
||||||
|
- `char_tiff_rdata_o` подается на выход `read_data_o`.
|
||||||
|
|
||||||
> [!Important]
|
> [!Important]
|
||||||
> Обратите внимание на то что, контроллер vga является единственным контроллером, для которого не нужно реализовывать регистр перед выходом read_data_o для реализации синхронного чтения. Данная особенность обусловленна тем, что внутри модуля `vgachargen` уже находится блочная память с синхронным портом на чтение. Добавление еще одного регистра приведет к тому, данные будут "опаздывать" на один такт. Таким образом, данные на выход `read_data_o` необходимо подавать с помощью чисто комбинационной логики.
|
> Обратите внимание на то что, контроллер vga является единственным контроллером, для которого не нужно реализовывать регистр перед выходом read_data_o для реализации синхронного чтения. Данная особенность обусловлена тем, что внутри модуля `vgachargen` уже находится блочная память с синхронным портом на чтение. Добавление еще одного регистра приведет к тому, данные будут "опаздывать" на один такт. Таким образом, данные на выход `read_data_o` необходимо подавать с помощью чисто комбинационной логики.
|
||||||
|
|
||||||
## Список использованной литературы
|
## Список использованной литературы
|
||||||
|
|
||||||
|
File diff suppressed because it is too large
Load Diff
@@ -19,42 +19,45 @@ module vgachargen
|
|||||||
parameter COL_MAP_INIT_FILE_NAME = "lab_13_vga_col_map.mem",
|
parameter COL_MAP_INIT_FILE_NAME = "lab_13_vga_col_map.mem",
|
||||||
parameter bit COL_MAP_INIT_FILE_IS_BIN = 1'b0
|
parameter bit COL_MAP_INIT_FILE_IS_BIN = 1'b0
|
||||||
) (
|
) (
|
||||||
input logic clk_i, // системный синхроимпульс
|
input logic clk_i, // системный синхроимпульс
|
||||||
input logic clk100m_i, // клок с частотой 100МГц
|
input logic clk100m_i, // клок с частотой 100МГц
|
||||||
input logic rst_i, // сигнал сброса
|
input logic rst_i, // сигнал сброса
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Интерфейс записи выводимого символа
|
Интерфейс записи выводимого символа
|
||||||
*/
|
*/
|
||||||
input logic [ 9:0] char_map_addr_i, // адрес позиции выводимого символа
|
input logic char_map_req_i, // запрос к памяти выводимых символов
|
||||||
input logic char_map_we_i, // сигнал разрешения записи кода
|
input logic [ 9:0] char_map_addr_i, // адрес позиции выводимого символа
|
||||||
input logic [ 3:0] char_map_be_i, // сигнал выбора байтов для записи
|
input logic char_map_we_i, // сигнал разрешения записи кода
|
||||||
input logic [31:0] char_map_wdata_i, // ascii-код выводимого символа
|
input logic [ 3:0] char_map_be_i, // сигнал выбора байтов для записи
|
||||||
output logic [31:0] char_map_rdata_o, // сигнал чтения кода символа
|
input logic [31:0] char_map_wdata_i, // ascii-код выводимого символа
|
||||||
|
output logic [31:0] char_map_rdata_o, // сигнал чтения кода символа
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Интерфейс установки цветовой схемы
|
Интерфейс установки цветовой схемы
|
||||||
*/
|
*/
|
||||||
input logic [ 9:0] col_map_addr_i, // адрес позиции устанавливаемой схемы
|
input logic col_map_req_i, // запрос к памяти цветов символов
|
||||||
input logic col_map_we_i, // сигнал разрешения записи схемы
|
input logic [ 9:0] col_map_addr_i, // адрес позиции устанавливаемой схемы
|
||||||
input logic [ 3:0] col_map_be_i, // сигнал выбора байтов для записи
|
input logic col_map_we_i, // сигнал разрешения записи схемы
|
||||||
input logic [31:0] col_map_wdata_i, // код устанавливаемой цветовой схемы
|
input logic [ 3:0] col_map_be_i, // сигнал выбора байтов для записи
|
||||||
output logic [31:0] col_map_rdata_o, // сигнал чтения кода схемы
|
input logic [31:0] col_map_wdata_i, // код устанавливаемой цветовой схемы
|
||||||
|
output logic [31:0] col_map_rdata_o, // сигнал чтения кода схемы
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Интерфейс установки шрифта.
|
Интерфейс установки шрифта.
|
||||||
*/
|
*/
|
||||||
input logic [ 9:0] char_tiff_addr_i, // адрес позиции устанавливаемого шрифта
|
input logic char_tiff_req_i, // запрос к памяти шрифтов символов
|
||||||
input logic char_tiff_we_i, // сигнал разрешения записи шрифта
|
input logic [ 9:0] char_tiff_addr_i, // адрес позиции устанавливаемого шрифта
|
||||||
input logic [ 3:0] char_tiff_be_i, // сигнал выбора байтов для записи
|
input logic char_tiff_we_i, // сигнал разрешения записи шрифта
|
||||||
input logic [31:0] char_tiff_wdata_i, // отображаемые пиксели в текущей позиции шрифта
|
input logic [ 3:0] char_tiff_be_i, // сигнал выбора байтов для записи
|
||||||
output logic [31:0] char_tiff_rdata_o, // сигнал чтения пикселей шрифта
|
input logic [31:0] char_tiff_wdata_i, // отображаемые пиксели в текущей позиции шрифта
|
||||||
|
output logic [31:0] char_tiff_rdata_o, // сигнал чтения пикселей шрифта
|
||||||
|
|
||||||
output logic [3:0] vga_r_o, // красный канал vga
|
output logic [3:0] vga_r_o, // красный канал vga
|
||||||
output logic [3:0] vga_g_o, // зеленый канал vga
|
output logic [3:0] vga_g_o, // зеленый канал vga
|
||||||
output logic [3:0] vga_b_o, // синий канал vga
|
output logic [3:0] vga_b_o, // синий канал vga
|
||||||
output logic vga_hs_o, // линия горизонтальной синхронизации vga
|
output logic vga_hs_o, // линия горизонтальной синхронизации vga
|
||||||
output logic vga_vs_o // линия вертикальной синхронизации vga
|
output logic vga_vs_o // линия вертикальной синхронизации vga
|
||||||
);
|
);
|
||||||
logic vga_clk_i;
|
logic vga_clk_i;
|
||||||
assign vga_clk_i = clk100m_i;
|
assign vga_clk_i = clk100m_i;
|
||||||
@@ -62,13 +65,13 @@ module vgachargen
|
|||||||
if (CLK_FACTOR_25M == 0 || CLK_FACTOR_25M > 4) error_unsupported_factor error_unsupported_factor ();
|
if (CLK_FACTOR_25M == 0 || CLK_FACTOR_25M > 4) error_unsupported_factor error_unsupported_factor ();
|
||||||
|
|
||||||
logic [3:0] char_map_be_gated;
|
logic [3:0] char_map_be_gated;
|
||||||
assign char_map_be_gated = char_map_be_i & {4{char_map_we_i}};
|
assign char_map_be_gated = char_map_be_i & {4{char_map_we_i & char_map_req_i}};
|
||||||
|
|
||||||
logic [3:0] col_map_be_gated;
|
logic [3:0] col_map_be_gated;
|
||||||
assign col_map_be_gated = col_map_be_i & {4{col_map_we_i}};
|
assign col_map_be_gated = col_map_be_i & {4{col_map_we_i & col_map_req_i}};
|
||||||
|
|
||||||
logic [3:0] char_tiff_be_gated;
|
logic [3:0] char_tiff_be_gated;
|
||||||
assign char_tiff_be_gated = char_tiff_be_i & {4{char_tiff_we_i}};
|
assign char_tiff_be_gated = char_tiff_be_i & {4{char_tiff_we_i & char_tiff_req_i}};
|
||||||
|
|
||||||
logic arstn_i;
|
logic arstn_i;
|
||||||
assign arstn_i = ~rst_i;
|
assign arstn_i = ~rst_i;
|
||||||
|
Reference in New Issue
Block a user