Files
APS/Labs/Made-up modules/lab_03.instr_mem.sv
Andrei Solodovnikov 9739429d6e Синхронизация с правками публикуемого издания (#101)
* СП. Обновление предисловия

* СП. Обновление введения

* СП. Обновление лаб

* СП. Обновление доп материалов

* СП. Введение

* СП. Введение

* СП. ЛР№4, 15

* СП. Базовые конструкции Verilog

* Update Implementation steps.md

* СП. ЛР 4,5,7,8,14

* СП. ЛР№8

* Синхронизация правок

* СП. Финал

* Исправление ссылки на рисунок

* Обновление схемы

* Синхронизация правок

* Добавление белого фона .drawio-изображениям

* ЛР2. Исправление нумерации рисунка
2025-02-12 17:53:52 +03:00

38 lines
2.1 KiB
Systemverilog
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/* -----------------------------------------------------------------------------
* Project Name : Architectures of Processor Systems (APS) lab work
* Organization : National Research University of Electronic Technology (MIET)
* Department : Institute of Microdevices and Control Systems
* Author(s) : Andrei Solodovnikov
* Email(s) : hepoh@org.miet.ru
See https://github.com/MPSU/APS/blob/master/LICENSE file for licensing details.
* ------------------------------------------------------------------------------
*/
module instr_mem
import memory_pkg::INSTR_MEM_SIZE_BYTES;
import memory_pkg::INSTR_MEM_SIZE_WORDS;
(
input logic [31:0] read_addr_i,
output logic [31:0] read_data_o
);
logic [31:0] ROM [INSTR_MEM_SIZE_WORDS]; // создать память с
// <INSTR_MEM_SIZE_WORDS>
// 32-битных ячеек
initial begin
$readmemh("program.mem", ROM); // поместить в память ROM содержимое
end // файла program.mem
// Реализация асинхронного порта на чтение, где на выход идет ячейка памяти
// инструкций, расположенная по адресу read_addr_i, в котором отброшены два
// младших бита, а также биты, двоичный вес которых превышает размер памяти
// данных в байтах.
// Два младших бита отброшены, чтобы обеспечить выровненный доступ к памяти,
// в то время как старшие биты отброшены, чтобы не дать обращаться в память
// по адресам несуществующих ячеек (вместо этого будут выданы данные ячеек,
// расположенных по младшим адресам).
assign read_data_o = ROM[read_addr_i[$clog2(INSTR_MEM_SIZE_BYTES)-1:2]];
endmodule