mirror of
https://github.com/MPSU/APS.git
synced 2025-09-17 18:10:39 +00:00
Обновление структуры лаб
This commit is contained in:
Before Width: | Height: | Size: 177 KiB After Width: | Height: | Size: 177 KiB |
Before Width: | Height: | Size: 31 KiB After Width: | Height: | Size: 31 KiB |
@@ -1,25 +0,0 @@
|
|||||||
# Лабораторная работа 5 "Блок загрузки и сохранения"
|
|
||||||
|
|
||||||
## Цель
|
|
||||||
|
|
||||||
--
|
|
||||||
|
|
||||||
## Ход работы
|
|
||||||
|
|
||||||
--
|
|
||||||
|
|
||||||
## Теория
|
|
||||||
|
|
||||||
==
|
|
||||||
|
|
||||||
## Практика
|
|
||||||
|
|
||||||
--
|
|
||||||
|
|
||||||
## Задание
|
|
||||||
|
|
||||||
--
|
|
||||||
|
|
||||||
### Порядок выполнения задания
|
|
||||||
|
|
||||||
--
|
|
@@ -1,65 +0,0 @@
|
|||||||
module miriscv_ram
|
|
||||||
#(
|
|
||||||
parameter RAM_SIZE = 256, // bytes
|
|
||||||
parameter RAM_INIT_FILE = ""
|
|
||||||
)
|
|
||||||
(
|
|
||||||
// clock, reset
|
|
||||||
input clk_i,
|
|
||||||
input rst_n_i,
|
|
||||||
|
|
||||||
// instruction memory interface
|
|
||||||
output logic [31:0] instr_rdata_o,
|
|
||||||
input [31:0] instr_addr_i,
|
|
||||||
|
|
||||||
// data memory interface
|
|
||||||
output logic [31:0] data_rdata_o,
|
|
||||||
input data_req_i,
|
|
||||||
input data_we_i,
|
|
||||||
input [3:0] data_be_i,
|
|
||||||
input [31:0] data_addr_i,
|
|
||||||
input [31:0] data_wdata_i
|
|
||||||
);
|
|
||||||
|
|
||||||
reg [31:0] mem [0:RAM_SIZE/4-1];
|
|
||||||
reg [31:0] data_int;
|
|
||||||
|
|
||||||
//Init RAM
|
|
||||||
integer ram_index;
|
|
||||||
|
|
||||||
initial begin
|
|
||||||
if(RAM_INIT_FILE != "")
|
|
||||||
$readmemh(RAM_INIT_FILE, mem);
|
|
||||||
else
|
|
||||||
for (ram_index = 0; ram_index < RAM_SIZE/4-1; ram_index = ram_index + 1)
|
|
||||||
mem[ram_index] = {32{1'b0}};
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
//Instruction port
|
|
||||||
assign instr_rdata_o = mem[(instr_addr_i % RAM_SIZE) / 4];
|
|
||||||
|
|
||||||
always@(posedge clk_i) begin
|
|
||||||
if(!rst_n_i) begin
|
|
||||||
data_rdata_o <= 32'b0;
|
|
||||||
end
|
|
||||||
else if(data_req_i) begin
|
|
||||||
data_rdata_o <= mem[(data_addr_i % RAM_SIZE) / 4];
|
|
||||||
|
|
||||||
if(data_we_i && data_be_i[0])
|
|
||||||
mem [data_addr_i[31:2]] [7:0] <= data_wdata_i[7:0];
|
|
||||||
|
|
||||||
if(data_we_i && data_be_i[1])
|
|
||||||
mem [data_addr_i[31:2]] [15:8] <= data_wdata_i[15:8];
|
|
||||||
|
|
||||||
if(data_we_i && data_be_i[2])
|
|
||||||
mem [data_addr_i[31:2]] [23:16] <= data_wdata_i[23:16];
|
|
||||||
|
|
||||||
if(data_we_i && data_be_i[3])
|
|
||||||
mem [data_addr_i[31:2]] [31:24] <= data_wdata_i[31:24];
|
|
||||||
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
endmodule
|
|
@@ -1,74 +0,0 @@
|
|||||||
module miriscv_top
|
|
||||||
#(
|
|
||||||
parameter RAM_SIZE = 256, // bytes
|
|
||||||
parameter RAM_INIT_FILE = ""
|
|
||||||
)
|
|
||||||
(
|
|
||||||
// clock, reset
|
|
||||||
input clk_i,
|
|
||||||
input rst_n_i
|
|
||||||
);
|
|
||||||
|
|
||||||
logic [31:0] instr_rdata_core;
|
|
||||||
logic [31:0] instr_addr_core;
|
|
||||||
|
|
||||||
logic [31:0] data_rdata_core;
|
|
||||||
logic data_req_core;
|
|
||||||
logic data_we_core;
|
|
||||||
logic [3:0] data_be_core;
|
|
||||||
logic [31:0] data_addr_core;
|
|
||||||
logic [31:0] data_wdata_core;
|
|
||||||
|
|
||||||
logic [31:0] data_rdata_ram;
|
|
||||||
logic data_req_ram;
|
|
||||||
logic data_we_ram;
|
|
||||||
logic [3:0] data_be_ram;
|
|
||||||
logic [31:0] data_addr_ram;
|
|
||||||
logic [31:0] data_wdata_ram;
|
|
||||||
|
|
||||||
logic data_mem_valid;
|
|
||||||
assign data_mem_valid = (data_addr_core >= RAM_SIZE) ? 1'b0 : 1'b1;
|
|
||||||
|
|
||||||
assign data_rdata_core = (data_mem_valid) ? data_rdata_ram : 1'b0;
|
|
||||||
assign data_req_ram = (data_mem_valid) ? data_req_core : 1'b0;
|
|
||||||
assign data_we_ram = data_we_core;
|
|
||||||
assign data_be_ram = data_be_core;
|
|
||||||
assign data_addr_ram = data_addr_core;
|
|
||||||
assign data_wdata_ram = data_wdata_core;
|
|
||||||
|
|
||||||
miriscv_core core (
|
|
||||||
.clk_i ( clk_i ),
|
|
||||||
.arstn_i ( rst_n_i ),
|
|
||||||
|
|
||||||
.instr_rdata_i ( instr_rdata_core ),
|
|
||||||
.instr_addr_o ( instr_addr_core ),
|
|
||||||
|
|
||||||
.data_rdata_i ( data_rdata_core ),
|
|
||||||
.data_req_o ( data_req_core ),
|
|
||||||
.data_we_o ( data_we_core ),
|
|
||||||
.data_be_o ( data_be_core ),
|
|
||||||
.data_addr_o ( data_addr_core ),
|
|
||||||
.data_wdata_o ( data_wdata_core )
|
|
||||||
);
|
|
||||||
|
|
||||||
miriscv_ram
|
|
||||||
#(
|
|
||||||
.RAM_SIZE (RAM_SIZE),
|
|
||||||
.RAM_INIT_FILE (RAM_INIT_FILE)
|
|
||||||
) ram (
|
|
||||||
.clk_i ( clk_i ),
|
|
||||||
.rst_n_i ( rst_n_i ),
|
|
||||||
|
|
||||||
.instr_rdata_o ( instr_rdata_core ),
|
|
||||||
.instr_addr_i ( instr_addr_core ),
|
|
||||||
|
|
||||||
.data_rdata_o ( data_rdata_ram ),
|
|
||||||
.data_req_i ( data_req_ram ),
|
|
||||||
.data_we_i ( data_we_ram ),
|
|
||||||
.data_be_i ( data_be_ram ),
|
|
||||||
.data_addr_i ( data_addr_ram ),
|
|
||||||
.data_wdata_i ( data_wdata_ram )
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
endmodule
|
|
@@ -1,33 +0,0 @@
|
|||||||
`timescale 1ns / 1ps
|
|
||||||
|
|
||||||
module tb_miriscv_top();
|
|
||||||
|
|
||||||
parameter HF_CYCLE = 2.5; // 200 MHz clock
|
|
||||||
parameter RST_WAIT = 10; // 10 ns reset
|
|
||||||
parameter RAM_SIZE = 512; // in 32-bit words
|
|
||||||
|
|
||||||
// clock, reset
|
|
||||||
reg clk;
|
|
||||||
reg rst_n;
|
|
||||||
|
|
||||||
miriscv_top #(
|
|
||||||
.RAM_SIZE ( RAM_SIZE ),
|
|
||||||
.RAM_INIT_FILE ( "program_sort.dat" )
|
|
||||||
) dut (
|
|
||||||
.clk_i ( clk ),
|
|
||||||
.rst_n_i ( rst_n )
|
|
||||||
);
|
|
||||||
|
|
||||||
initial begin
|
|
||||||
clk = 1'b0;
|
|
||||||
rst_n = 1'b0;
|
|
||||||
#RST_WAIT;
|
|
||||||
rst_n = 1'b1;
|
|
||||||
end
|
|
||||||
|
|
||||||
always begin
|
|
||||||
#HF_CYCLE;
|
|
||||||
clk = ~clk;
|
|
||||||
end
|
|
||||||
|
|
||||||
endmodule
|
|
Binary file not shown.
@@ -49,7 +49,7 @@
|
|||||||
|
|
||||||
На рисунке ниже представлен способ подключения процессора к памяти инструкций и данных, а так же 255 периферийным устройствам.
|
На рисунке ниже представлен способ подключения процессора к памяти инструкций и данных, а так же 255 периферийным устройствам.
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
### Активация выбранного устройства
|
### Активация выбранного устройства
|
||||||
|
|
@@ -1,6 +1,7 @@
|
|||||||
# Курс лабораторных работ
|
# Курс лабораторных работ
|
||||||
|
|
||||||
## Содержание
|
## Содержание
|
||||||
|
|
||||||
- [Курс лабораторных работ](#курс-лабораторных-работ)
|
- [Курс лабораторных работ](#курс-лабораторных-работ)
|
||||||
- [Содержание](#содержание)
|
- [Содержание](#содержание)
|
||||||
- [Полезное](#полезное)
|
- [Полезное](#полезное)
|
||||||
@@ -15,18 +16,21 @@
|
|||||||
- [4. Простейшее программируемое устройство (PPD)](#4-простейшее-программируемое-устройство-ppd)
|
- [4. Простейшее программируемое устройство (PPD)](#4-простейшее-программируемое-устройство-ppd)
|
||||||
- [5. Основной дешифратор команд (MD)](#5-основной-дешифратор-команд-md)
|
- [5. Основной дешифратор команд (MD)](#5-основной-дешифратор-команд-md)
|
||||||
- [6. Тракт данных (DP)](#6-тракт-данных-dp)
|
- [6. Тракт данных (DP)](#6-тракт-данных-dp)
|
||||||
- [7. Блог загрузки и сохранения данных (LSU)](#7-блог-загрузки-и-сохранения-данных-lsu)
|
- [7. Внешняя память](#7-внешняя-память)
|
||||||
- [8. Подсистема прерывания (IC)](#8-подсистема-прерывания-ic)
|
- [8. Блог загрузки и сохранения данных (LSU)](#8-блог-загрузки-и-сохранения-данных-lsu)
|
||||||
- [9. Периферийные устройства (PU)](#9-периферийные-устройства-pu)
|
- [9 Интеграция LSU](#9-интеграция-lsu)
|
||||||
- [10. Программирование на языке высокого уровня](#10-программирование-на-языке-высокого-уровня)
|
- [10. Подсистема прерывания (IC)](#10-подсистема-прерывания-ic)
|
||||||
|
- [11. Интеграция подсистемы прерывания](#11-интеграция-подсистемы-прерывания)
|
||||||
|
- [12. Периферийные устройства (PU)](#12-периферийные-устройства-pu)
|
||||||
|
- [13. Программирование на языке высокого уровня](#13-программирование-на-языке-высокого-уровня)
|
||||||
|
|
||||||
## Полезное
|
## Полезное
|
||||||
|
|
||||||
- [Как установить Vivado](../Vivado%20Basics/Install%20Vivado.md)
|
- [Студенческий сервер](../Other/Students%20server.md)
|
||||||
- [Создание базового проекта с прошивкой ПЛИС в Vivado](../Vivado%20Basics/Vivado%20trainer.md)
|
- [Создание базового проекта с прошивкой ПЛИС в Vivado](../Vivado%20Basics/Vivado%20trainer.md)
|
||||||
- [Что такое язык описания аппаратуры HDL](../Introduction/What%20is%20HDL.md)
|
- [Что такое язык описания аппаратуры HDL](../Introduction/What%20is%20HDL.md)
|
||||||
- [Как работает ПЛИС](../Introduction/How%20FPGA%20works.md)
|
- [Как работает ПЛИС](../Introduction/How%20FPGA%20works.md)
|
||||||
- [Синтакс языка Verilog](../Basic%20Verilog%20structures/Verilog%20syntax.md)
|
- [Синтаксис языка Verilog](../Basic%20Verilog%20structures/Verilog%20syntax.md)
|
||||||
- [Базовые конструкции Verilog](../Basic%20Verilog%20structures/)
|
- [Базовые конструкции Verilog](../Basic%20Verilog%20structures/)
|
||||||
- [Тестовое окружение](../Basic%20Verilog%20structures/Testbench.md)
|
- [Тестовое окружение](../Basic%20Verilog%20structures/Testbench.md)
|
||||||
|
|
||||||
@@ -46,28 +50,35 @@
|
|||||||
3. Регистровый файл и внешняя память ([03. Register file and memory](03.%20Register%20file%20and%20memory))
|
3. Регистровый файл и внешняя память ([03. Register file and memory](03.%20Register%20file%20and%20memory))
|
||||||
4. Простейшее программируемое устройство ([04. Primitive programmable device](04.%20Primitive%20programmable%20device))
|
4. Простейшее программируемое устройство ([04. Primitive programmable device](04.%20Primitive%20programmable%20device))
|
||||||
5. Основной дешифратор ([05. Main decoder](05.%20Main%20decoder))
|
5. Основной дешифратор ([05. Main decoder](05.%20Main%20decoder))
|
||||||
6. Тракт данных ([06. Datapath](06.%20Datapath))
|
6.
|
||||||
7. Периферийные устройства ([09. Peripheral units](09.%20Peripheral%20units))
|
1. Тракт данных ([06. Datapath](06.%20Datapath))
|
||||||
8. Программирование ([10. Programming](10.%20Programming))
|
2. Интеграция блока загрузки и сохранения ([09. LSU Integration](09.%20LSU%20Integration))
|
||||||
|
3. Интеграция подсистемы прерываний ([11. Interrupt Integration](11.%20Interrupt%20integration))
|
||||||
|
7. Периферийные устройства ([12. Peripheral units](12.%20Peripheral%20units))
|
||||||
|
8. Программирование ([13. Programming](13.%20Programming))
|
||||||
|
|
||||||
### ИВТ
|
### ИВТ
|
||||||
|
|
||||||
1. АЛУ ([02. Arithmetic-logic unit](02.%20Arithmetic-logic%20unit))
|
1. АЛУ ([02. Arithmetic-logic unit](02.%20Arithmetic-logic%20unit))
|
||||||
2.
|
2.
|
||||||
1. Память ([03. Register file and memory](03.%20Register%20file%20and%20memory)),
|
1. Память ([03. Register file and memory](03.%20Register%20file%20and%20memory)),
|
||||||
2. Простейшее программируемое устройство ([04. Primitive programmable device](04.%20Primitive%20programmable%20device))
|
2. Простейшее программируемое устройство ([04. Primitive programmable device](04.%20Primitive%20programmable%20device))
|
||||||
3. Основной дешифратор ([05. Main decoder](05.%20Main%20decoder))
|
3. Основной дешифратор ([05. Main decoder](05.%20Main%20decoder))
|
||||||
4. Тракт данных ([06. Datapath](06.%20Datapath))
|
4. Тракт данных ([06. Datapath](06.%20Datapath))
|
||||||
5. Модуль загрузки и сохранения (07. Load-store unit)
|
5.
|
||||||
6. Контроллер прерываний ()
|
1. Модуль загрузки и сохранения ([08. Load-store unit](08.%20Load-store%20unit))
|
||||||
7. Периферийные устройства ([09. Peripheral units](09.%20Peripheral%20units))
|
2. Интеграция блока загрузки и сохранения ([09. LSU Integration](09.%20LSU%20Integration))
|
||||||
8. Программирование ([10. Programming](10.%20Programming))
|
6.
|
||||||
|
1. Контроллер прерываний ([10. Interrupt subsystem](10.%20Interrupt%20subsystem))
|
||||||
|
2. Интеграция подсистемы прерываний ([11. Interrupt Integration](11.%20Interrupt%20integration))
|
||||||
|
7. Периферийные устройства ([12. Peripheral units](12.%20Peripheral%20units))
|
||||||
|
8. Программирование ([13. Programming](13.%20Programming))
|
||||||
|
|
||||||
## Обзор лабораторных работ
|
## Обзор лабораторных работ
|
||||||
|
|
||||||

|

|
||||||
|
|
||||||
Курс *Архитектур процессорных систем* включает в себя цикл из 10 лабораторных работ, в течение которых используя язык описания аппаратуры **Verilog HDL** на основе **FPGA** (ПЛИС, программируемая логическая интегральная схема), с нуля, последовательно, создается система, под управлением процессора с архитектурой **RISC-V**, управляющего периферийными устройствами и программируемого на языке высокого уровня **C++**.
|
Курс *Архитектур процессорных систем* включает в себя цикл из 13 лабораторных работ (10 основных + 3 вспомогательных), в течение которых используя язык описания аппаратуры **Verilog HDL** на основе **FPGA** (ПЛИС, программируемая логическая интегральная схема), с нуля, последовательно, создается система, под управлением процессора с архитектурой **RISC-V**, управляющего периферийными устройствами и программируемого на языке высокого уровня **C++**.
|
||||||
|
|
||||||
Создаваемая система на ПЛИС состоит из: процессора, памяти, контроллера прерываний и контроллеров периферийных устройств.
|
Создаваемая система на ПЛИС состоит из: процессора, памяти, контроллера прерываний и контроллеров периферийных устройств.
|
||||||
|
|
||||||
@@ -81,7 +92,7 @@
|
|||||||
|
|
||||||
**FPGA** - программируемая логическая интегральная схема (ПЛИС), изменяя внутреннюю конфигурацию которой можно создать любые цифровые устройства (в рамках предоставляемых ресурсов).
|
**FPGA** - программируемая логическая интегральная схема (ПЛИС), изменяя внутреннюю конфигурацию которой можно создать любые цифровые устройства (в рамках предоставляемых ресурсов).
|
||||||
|
|
||||||
**Vivado** - система автоматизированного проектирования, которая превращает Verilog-код в конфигурацию и прошивает ей ПЛИС на отладочной плате.
|
**Vivado** - система автоматизированного проектирования, которая превращает Verilog-код в конфигурацию и прошивает ей ПЛИС на отладочной плате.
|
||||||
|
|
||||||
**Архитектура RISC-V** - открытая и свободная система команд и процессорная архитектура на основе концепции RISC для микропроцессоров и микроконтроллеров.
|
**Архитектура RISC-V** - открытая и свободная система команд и процессорная архитектура на основе концепции RISC для микропроцессоров и микроконтроллеров.
|
||||||
|
|
||||||
@@ -123,18 +134,40 @@
|
|||||||

|

|
||||||
Разработанные блоки объединяются, образуя тракт данных, управляемый основным дешифратором команд. Результатом шестой лабораторной работы является однотактный процессор, с архитектурой RISC-V, поддерживающий стандартный набор целочисленных инструкций RV32I. В качестве проверки на процессоре запускаются программы, заранее написанные на языке ассемблера RISC-V. Сравнивается результат полученный на симуляторе и на разработанном процессоре.
|
Разработанные блоки объединяются, образуя тракт данных, управляемый основным дешифратором команд. Результатом шестой лабораторной работы является однотактный процессор, с архитектурой RISC-V, поддерживающий стандартный набор целочисленных инструкций RV32I. В качестве проверки на процессоре запускаются программы, заранее написанные на языке ассемблера RISC-V. Сравнивается результат полученный на симуляторе и на разработанном процессоре.
|
||||||
|
|
||||||
## 7. Блог загрузки и сохранения данных (LSU)
|
## 7. Внешняя память
|
||||||
|
|
||||||
|
Недостатком реализации процессора из предыдущей лабораторной работы была его неспособность выполнять операции `LB`, `LBU`, `SB`, `LH`, `LHU`, `SH`. Отчасти это связано с ограничением реализованной ранее памяти (в этой памяти не было возможности обновить отдельный байт в ячейке памяти).
|
||||||
|
|
||||||
|
Данная вспомогательная лабораторная работа позволяет реализовать память без этого ограничения.
|
||||||
|
|
||||||
|
## 8. Блог загрузки и сохранения данных (LSU)
|
||||||
|
|
||||||

|

|
||||||
В современных компьютерах память является отдельным от процессора устройством. В пятой работе память программ и память данных выносится за пределы процессора, объединяются в одну общую память и подключается через общую шину. В процессоре для этого появляется блок Load/Store Unit.
|
|
||||||
|
|
||||||
## 8. Подсистема прерывания (IC)
|
Для корректного исполнения инструкций `LB`, `LBU`, `SB`, `LH`, `LHU`, `SH` мало использовать память с побайтовой записью. Необходимо также уметь управлять этой памятью, определенным образом подготавливать данные как для записи в память данный, так и для записи в регистровый файл, а также следить за тем, чтобы за время работы с памятью, программа процессора не начала исполняться дальше. Все эти задачи возлагаются на специальный модуль, который называется **Блок загрузки и сохранения** (**Load and Store Unit**, **LSU**)
|
||||||
|
|
||||||
|
## 9 Интеграция LSU
|
||||||
|
|
||||||
|
Вспомогательная лабораторная работа по интеграции реализованного ранее блока загрузки и сохранения, а также новой памяти данных в модуль `riscv_unit`.
|
||||||
|
|
||||||
|
## 10. Подсистема прерывания (IC)
|
||||||
|
|
||||||

|

|
||||||
Одной из основных функций процессоров является возможность реагировать на внешние события (дернуть мышку, нажать кнопку и т.п.), автоматически запуская, при их возникновении, соответствующие программы. В шестой работе создается и подключается подсистема прерывания, к которой относятся контроллер прерываний с циклическим опросом и блок регистров статуса и управления.
|
|
||||||
|
|
||||||
## 9. Периферийные устройства (PU)
|
Одной из основных функций процессоров является возможность реагировать на внешние события (дернуть мышку, нажать кнопку и т.п.), автоматически запуская, при их возникновении, соответствующие программы. В данной лабораторной создается и подсистема прерывания, к которой относятся контроллер прерываний с циклическим опросом и блок регистров статуса и управления.
|
||||||
|
|
||||||
|
## 11. Интеграция подсистемы прерывания
|
||||||
|
|
||||||
|
Вспомогательная лабораторная работа по интеграции реализованной ранее подсистемы прерывания.
|
||||||
|
|
||||||
|
## 12. Периферийные устройства (PU)
|
||||||
|
|
||||||

|

|
||||||
На седьмой работе создаются и подключаются к общей шине и подсистеме прерывания контроллеры периферийных устройств, такие как контроллер клавиатуры и VGA-контроллер.
|
|
||||||
|
|
||||||
## 10. Программирование на языке высокого уровня
|
В данной лабораторной создаются и подключаются к общей шине и подсистеме прерывания контроллеры периферийных устройств: переключатели, светодиоды, клавиатура, семисегментные дисплеи а так же контроллер uart.
|
||||||
|
|
||||||
|
## 13. Программирование на языке высокого уровня
|
||||||
|
|
||||||

|

|
||||||
В рамках восьмой работы настраивается компилятор GCC для RISC-V и для разработанной системы пишется программное обеспечение на языке программирования C++.
|
|
||||||
|
В рамках данной лабораторной настраивается компилятор GCC для RISC-V и для разработанной системы пишется программное обеспечение на языке программирования C++.
|
||||||
|
Reference in New Issue
Block a user