Рубрика «LMC»

CPU Design: Эзотерический язык LMCode - 1
Часть I
Часть II
Часть III
Часть IV

Эта статья посвящена созданию интерпретатора некого эзотерического языка LMCode, в основе которого лежит архитектура Little Man Computer. О Little Man Computer можно прочитать в предыдущих статьях.

  • Пусть команде INP соответствует ,
  • команде OUT соответствует .
  • команде ADD соответствует +
  • команде SUB соответствует
  • команде STA соответствует ~
  • команде LDA соответствует ^

Напишем программу, которая загружает число из устройства ввода в аккумулятор, сохраняет число в памяти, прибавляет число из памяти к аккумулятору (удваивает число), и выводит удвоенное число в устройство вывода.

На ассемблере LMC эта программа будет выглядеть так (начальной ячейкой пусть будет 20)

 INP
 STA 20
 ADD 20 
 OUT

Читать полностью »

Проектирование процессора (CPU Design) LMC - 1
Часть I
Часть II
Часть III

Это полная версия предыдущей статьи.

Спроектируем Little Man Computer на языке Verilog.

Статья про LMC была на Хабре.

Online симулятор этого компьютера здесь.

Напишем модуль оперативной памяти (ОЗУ), состоящий из четырех (ADDR_WIDTH=2) четырёхбитных (DATA_WIDTH=4) слов. Данные загружаются в ОЗУ из data_in по адресу adr при поступлении тактового сигнала clk.

module R0 #(parameter ADDR_WIDTH = 2, DATA_WIDTH = 4)
(
    input clk, //тактовый сигнал
    input [ADDR_WIDTH-1:0] adr, //адрес
    input [DATA_WIDTH-1:0] data_in, //порт ввода данных
    output [DATA_WIDTH-1:0] RAM_out //порт вывода данных
);
    reg [DATA_WIDTH-1:0] mem [2**ADDR_WIDTH-1:0]; //объявляем массив mem
 
    always @(posedge clk) //при поступлении тактового сигнала clk 
        mem [adr] <= data_in; //загружаем данные в ОЗУ из data_in 
    
    assign RAM_out = mem[adr]; //назначаем RAM_out портом вывода данных
endmodule

Читать полностью »

Спроектируем Little Man Computer на языке Verilog.

Статья про LMC была на Хабре.

Online симулятор этого компьютера здесь.

Напишем модуль ОЗУ на языке Verilog.

Данные загружаются в ОЗУ из data_in по тактовому сигналу clk.

module R0 #(parameter N = 2, M = 4)
(
input clk,
input [N-1:0] adr,
input [M-1:0] data_in,
output [M-1:0] RAM_out
);
reg [M-1:0] mem [2**N-1:0];
always @(posedge clk)
mem [adr] <= data_in;
assign RAM_out = mem[adr];
endmodule

Подключим счётчик к адресному входу ОЗУ

module R1 #(parameter N = 2, M = 4)
(
input Counter_clk, RAM_clk,
//input [N-1:0] adr,
input [M-1:0] data_in,
output [M-1:0] RAM_out
);
reg [1:0]counter;
always @(posedge Counter_clk)
 counter <= counter + 1; 
 wire [N-1:0] adr;
 assign adr = counter; 
reg [M-1:0] mem [2**N-1:0];
always @(posedge RAM_clk)
 mem [adr] <= data_in;
assign RAM_out = mem[adr];
endmodule

Вот так выглядит схема в RTL Viewer

Little Man Computer на языке Verilog - 1
Читать полностью »

Спроектируем Little Man Computer на языке Verilog.

Статья про LMC была на Хабре.
Online симулятор этого компьютера здесь.

Сперва создадим устройство, позволяющее производить загрузку данных в ОЗУ.
Проектирование процессора на языке Verilog - 1
Читать полностью »

Часть I
Часть II
Часть III
Спроектируем схему из предыдущей части на языке Verilog.
Заменим RAM с одним портом чтения/записи на RAM с раздельными портами чтения/записи.
Управление производится командами:
1. загрузка адреса в счётчик Counter,
2. загрузка данных в память RAM,
3. загрузка (из устройства ввода) данных в аккумулятор Acc,
4. переключение мультиплексора MUX.

Проектирование процессора (CPU Design) Часть III - 1
Подключим счетчик на адресный вход ОЗУ.
При подаче тактового сигнала значение счетчика увеличивается на 1, т.о. можно переходить от ячейки к ячейке, от младшего адреса к старшему.
Проектирование процессора (CPU Design) Часть III - 2
Читать полностью »


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js