diff --git a/.pic/Labs/lab_09_periph/fig_01.drawio.png b/.pic/Labs/lab_12_periph/fig_01.drawio.png similarity index 100% rename from .pic/Labs/lab_09_periph/fig_01.drawio.png rename to .pic/Labs/lab_12_periph/fig_01.drawio.png diff --git a/.pic/Labs/lab_09_periph/fig_02.drawio.png b/.pic/Labs/lab_12_periph/fig_02.drawio.png similarity index 100% rename from .pic/Labs/lab_09_periph/fig_02.drawio.png rename to .pic/Labs/lab_12_periph/fig_02.drawio.png diff --git a/Labs/07. Load-store unit/README.md b/Labs/07. Load-store unit/README.md deleted file mode 100644 index 124a35e..0000000 --- a/Labs/07. Load-store unit/README.md +++ /dev/null @@ -1,25 +0,0 @@ -# Лабораторная работа 5 "Блок загрузки и сохранения" - -## Цель - --- - -## Ход работы - --- - -## Теория - -== - -## Практика - --- - -## Задание - --- - -### Порядок выполнения задания - --- \ No newline at end of file diff --git a/Labs/07. Load-store unit/miriscv_ram.sv b/Labs/07. Load-store unit/miriscv_ram.sv deleted file mode 100644 index edcf9a8..0000000 --- a/Labs/07. Load-store unit/miriscv_ram.sv +++ /dev/null @@ -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 diff --git a/Labs/07. Load-store unit/miriscv_top.sv b/Labs/07. Load-store unit/miriscv_top.sv deleted file mode 100644 index 5b9aa01..0000000 --- a/Labs/07. Load-store unit/miriscv_top.sv +++ /dev/null @@ -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 diff --git a/Labs/07. Load-store unit/tb_miriscv_top.v b/Labs/07. Load-store unit/tb_miriscv_top.v deleted file mode 100644 index 810ec09..0000000 --- a/Labs/07. Load-store unit/tb_miriscv_top.v +++ /dev/null @@ -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 diff --git a/Labs/07. Load-store unit/ЛР5. Блок загрузки-сохранения.pdf b/Labs/07. Load-store unit/ЛР5. Блок загрузки-сохранения.pdf deleted file mode 100644 index 7ba33e2..0000000 Binary files a/Labs/07. Load-store unit/ЛР5. Блок загрузки-сохранения.pdf and /dev/null differ diff --git a/Labs/08. Interrupt subsystem/README.md b/Labs/10. Interrupt subsystem/README.md similarity index 100% rename from Labs/08. Interrupt subsystem/README.md rename to Labs/10. Interrupt subsystem/README.md diff --git a/Labs/08. Interrupt subsystem/ЛР6. Подсистема прерывания.pdf b/Labs/10. Interrupt subsystem/ЛР6. Подсистема прерывания.pdf similarity index 100% rename from Labs/08. Interrupt subsystem/ЛР6. Подсистема прерывания.pdf rename to Labs/10. Interrupt subsystem/ЛР6. Подсистема прерывания.pdf diff --git a/Labs/09. Peripheral units/PS2Receiver.v b/Labs/12. Peripheral units/PS2Receiver.v similarity index 100% rename from Labs/09. Peripheral units/PS2Receiver.v rename to Labs/12. Peripheral units/PS2Receiver.v diff --git a/Labs/09. Peripheral units/README.md b/Labs/12. Peripheral units/README.md similarity index 99% rename from Labs/09. Peripheral units/README.md rename to Labs/12. Peripheral units/README.md index 68f98e3..7078611 100644 --- a/Labs/09. Peripheral units/README.md +++ b/Labs/12. Peripheral units/README.md @@ -49,7 +49,7 @@ На рисунке ниже представлен способ подключения процессора к памяти инструкций и данных, а так же 255 периферийным устройствам. -![../../.pic/Labs/lab_09_periph/fig_01.drawio.png](../../.pic/Labs/lab_09_periph/fig_01.drawio.png) +![../../.pic/Labs/lab_12_periph/fig_01.drawio.png](../../.pic/Labs/lab_12_periph/fig_01.drawio.png) ### Активация выбранного устройства diff --git a/Labs/09. Peripheral units/hex_digits.v b/Labs/12. Peripheral units/hex_digits.v similarity index 100% rename from Labs/09. Peripheral units/hex_digits.v rename to Labs/12. Peripheral units/hex_digits.v diff --git a/Labs/09. Peripheral units/nexys_a7_100t.xdc b/Labs/12. Peripheral units/nexys_a7_100t.xdc similarity index 100% rename from Labs/09. Peripheral units/nexys_a7_100t.xdc rename to Labs/12. Peripheral units/nexys_a7_100t.xdc diff --git a/Labs/09. Peripheral units/ps2_hex.txt b/Labs/12. Peripheral units/ps2_hex.txt similarity index 100% rename from Labs/09. Peripheral units/ps2_hex.txt rename to Labs/12. Peripheral units/ps2_hex.txt diff --git a/Labs/09. Peripheral units/sw_led.txt b/Labs/12. Peripheral units/sw_led.txt similarity index 100% rename from Labs/09. Peripheral units/sw_led.txt rename to Labs/12. Peripheral units/sw_led.txt diff --git a/Labs/09. Peripheral units/sys_clk_rst_gen.v b/Labs/12. Peripheral units/sys_clk_rst_gen.v similarity index 100% rename from Labs/09. Peripheral units/sys_clk_rst_gen.v rename to Labs/12. Peripheral units/sys_clk_rst_gen.v diff --git a/Labs/09. Peripheral units/testbench.sv b/Labs/12. Peripheral units/testbench.sv similarity index 100% rename from Labs/09. Peripheral units/testbench.sv rename to Labs/12. Peripheral units/testbench.sv diff --git a/Labs/10. Programming/README.md b/Labs/13. Programming/README.md similarity index 100% rename from Labs/10. Programming/README.md rename to Labs/13. Programming/README.md diff --git a/Labs/10. Programming/linker_script.ld b/Labs/13. Programming/linker_script.ld similarity index 100% rename from Labs/10. Programming/linker_script.ld rename to Labs/13. Programming/linker_script.ld diff --git a/Labs/10. Programming/startup.S b/Labs/13. Programming/startup.S similarity index 100% rename from Labs/10. Programming/startup.S rename to Labs/13. Programming/startup.S diff --git a/Labs/README.md b/Labs/README.md index 6973e34..9585f62 100644 --- a/Labs/README.md +++ b/Labs/README.md @@ -1,6 +1,7 @@ # Курс лабораторных работ ## Содержание + - [Курс лабораторных работ](#курс-лабораторных-работ) - [Содержание](#содержание) - [Полезное](#полезное) @@ -15,18 +16,21 @@ - [4. Простейшее программируемое устройство (PPD)](#4-простейшее-программируемое-устройство-ppd) - [5. Основной дешифратор команд (MD)](#5-основной-дешифратор-команд-md) - [6. Тракт данных (DP)](#6-тракт-данных-dp) - - [7. Блог загрузки и сохранения данных (LSU)](#7-блог-загрузки-и-сохранения-данных-lsu) - - [8. Подсистема прерывания (IC)](#8-подсистема-прерывания-ic) - - [9. Периферийные устройства (PU)](#9-периферийные-устройства-pu) - - [10. Программирование на языке высокого уровня](#10-программирование-на-языке-высокого-уровня) + - [7. Внешняя память](#7-внешняя-память) + - [8. Блог загрузки и сохранения данных (LSU)](#8-блог-загрузки-и-сохранения-данных-lsu) + - [9 Интеграция LSU](#9-интеграция-lsu) + - [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) - [Что такое язык описания аппаратуры HDL](../Introduction/What%20is%20HDL.md) - [Как работает ПЛИС](../Introduction/How%20FPGA%20works.md) -- [Синтакс языка Verilog](../Basic%20Verilog%20structures/Verilog%20syntax.md) +- [Синтаксис языка Verilog](../Basic%20Verilog%20structures/Verilog%20syntax.md) - [Базовые конструкции Verilog](../Basic%20Verilog%20structures/) - [Тестовое окружение](../Basic%20Verilog%20structures/Testbench.md) @@ -46,28 +50,35 @@ 3. Регистровый файл и внешняя память ([03. Register file and memory](03.%20Register%20file%20and%20memory)) 4. Простейшее программируемое устройство ([04. Primitive programmable device](04.%20Primitive%20programmable%20device)) 5. Основной дешифратор ([05. Main decoder](05.%20Main%20decoder)) -6. Тракт данных ([06. Datapath](06.%20Datapath)) -7. Периферийные устройства ([09. Peripheral units](09.%20Peripheral%20units)) -8. Программирование ([10. Programming](10.%20Programming)) +6. + 1. Тракт данных ([06. Datapath](06.%20Datapath)) + 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)) -2. +2. 1. Память ([03. Register file and memory](03.%20Register%20file%20and%20memory)), 2. Простейшее программируемое устройство ([04. Primitive programmable device](04.%20Primitive%20programmable%20device)) 3. Основной дешифратор ([05. Main decoder](05.%20Main%20decoder)) 4. Тракт данных ([06. Datapath](06.%20Datapath)) -5. Модуль загрузки и сохранения (07. Load-store unit) -6. Контроллер прерываний () -7. Периферийные устройства ([09. Peripheral units](09.%20Peripheral%20units)) -8. Программирование ([10. Programming](10.%20Programming)) +5. + 1. Модуль загрузки и сохранения ([08. Load-store unit](08.%20Load-store%20unit)) + 2. Интеграция блока загрузки и сохранения ([09. LSU Integration](09.%20LSU%20Integration)) +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)) ## Обзор лабораторных работ ![../.pic/Labs/labs.png](../.pic/Labs/labs.png) -Курс *Архитектур процессорных систем* включает в себя цикл из 10 лабораторных работ, в течение которых используя язык описания аппаратуры **Verilog HDL** на основе **FPGA** (ПЛИС, программируемая логическая интегральная схема), с нуля, последовательно, создается система, под управлением процессора с архитектурой **RISC-V**, управляющего периферийными устройствами и программируемого на языке высокого уровня **C++**. +Курс *Архитектур процессорных систем* включает в себя цикл из 13 лабораторных работ (10 основных + 3 вспомогательных), в течение которых используя язык описания аппаратуры **Verilog HDL** на основе **FPGA** (ПЛИС, программируемая логическая интегральная схема), с нуля, последовательно, создается система, под управлением процессора с архитектурой **RISC-V**, управляющего периферийными устройствами и программируемого на языке высокого уровня **C++**. Создаваемая система на ПЛИС состоит из: процессора, памяти, контроллера прерываний и контроллеров периферийных устройств. @@ -81,7 +92,7 @@ **FPGA** - программируемая логическая интегральная схема (ПЛИС), изменяя внутреннюю конфигурацию которой можно создать любые цифровые устройства (в рамках предоставляемых ресурсов). -**Vivado** - система автоматизированного проектирования, которая превращает Verilog-код в конфигурацию и прошивает ей ПЛИС на отладочной плате. +**Vivado** - система автоматизированного проектирования, которая превращает Verilog-код в конфигурацию и прошивает ей ПЛИС на отладочной плате. **Архитектура RISC-V** - открытая и свободная система команд и процессорная архитектура на основе концепции RISC для микропроцессоров и микроконтроллеров. @@ -123,18 +134,40 @@ ![../.pic/Labs/l6.png](../.pic/Labs/l6.png) Разработанные блоки объединяются, образуя тракт данных, управляемый основным дешифратором команд. Результатом шестой лабораторной работы является однотактный процессор, с архитектурой RISC-V, поддерживающий стандартный набор целочисленных инструкций RV32I. В качестве проверки на процессоре запускаются программы, заранее написанные на языке ассемблера RISC-V. Сравнивается результат полученный на симуляторе и на разработанном процессоре. -## 7. Блог загрузки и сохранения данных (LSU) +## 7. Внешняя память + +Недостатком реализации процессора из предыдущей лабораторной работы была его неспособность выполнять операции `LB`, `LBU`, `SB`, `LH`, `LHU`, `SH`. Отчасти это связано с ограничением реализованной ранее памяти (в этой памяти не было возможности обновить отдельный байт в ячейке памяти). + +Данная вспомогательная лабораторная работа позволяет реализовать память без этого ограничения. + +## 8. Блог загрузки и сохранения данных (LSU) + ![../.pic/Labs/l7.png](../.pic/Labs/l7.png) -В современных компьютерах память является отдельным от процессора устройством. В пятой работе память программ и память данных выносится за пределы процессора, объединяются в одну общую память и подключается через общую шину. В процессоре для этого появляется блок Load/Store Unit. -## 8. Подсистема прерывания (IC) +Для корректного исполнения инструкций `LB`, `LBU`, `SB`, `LH`, `LHU`, `SH` мало использовать память с побайтовой записью. Необходимо также уметь управлять этой памятью, определенным образом подготавливать данные как для записи в память данный, так и для записи в регистровый файл, а также следить за тем, чтобы за время работы с памятью, программа процессора не начала исполняться дальше. Все эти задачи возлагаются на специальный модуль, который называется **Блок загрузки и сохранения** (**Load and Store Unit**, **LSU**) + +## 9 Интеграция LSU + +Вспомогательная лабораторная работа по интеграции реализованного ранее блока загрузки и сохранения, а также новой памяти данных в модуль `riscv_unit`. + +## 10. Подсистема прерывания (IC) + ![../.pic/Labs/l8.png](../.pic/Labs/l8.png) -Одной из основных функций процессоров является возможность реагировать на внешние события (дернуть мышку, нажать кнопку и т.п.), автоматически запуская, при их возникновении, соответствующие программы. В шестой работе создается и подключается подсистема прерывания, к которой относятся контроллер прерываний с циклическим опросом и блок регистров статуса и управления. -## 9. Периферийные устройства (PU) +Одной из основных функций процессоров является возможность реагировать на внешние события (дернуть мышку, нажать кнопку и т.п.), автоматически запуская, при их возникновении, соответствующие программы. В данной лабораторной создается и подсистема прерывания, к которой относятся контроллер прерываний с циклическим опросом и блок регистров статуса и управления. + +## 11. Интеграция подсистемы прерывания + +Вспомогательная лабораторная работа по интеграции реализованной ранее подсистемы прерывания. + +## 12. Периферийные устройства (PU) + ![../.pic/Labs/l9.png](../.pic/Labs/l9.png) -На седьмой работе создаются и подключаются к общей шине и подсистеме прерывания контроллеры периферийных устройств, такие как контроллер клавиатуры и VGA-контроллер. -## 10. Программирование на языке высокого уровня +В данной лабораторной создаются и подключаются к общей шине и подсистеме прерывания контроллеры периферийных устройств: переключатели, светодиоды, клавиатура, семисегментные дисплеи а так же контроллер uart. + +## 13. Программирование на языке высокого уровня + ![../.pic/Labs/l10.png](../.pic/Labs/l10.png) -В рамках восьмой работы настраивается компилятор GCC для RISC-V и для разработанной системы пишется программное обеспечение на языке программирования C++. + +В рамках данной лабораторной настраивается компилятор GCC для RISC-V и для разработанной системы пишется программное обеспечение на языке программирования C++.