/
lizz_kuzz
/
cpu
Обзор
Документация
Войти
/
lizz_kuzz
/
cpu
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
src/cpu.sv
124 строки
4 KB
lizz_kuzz
fix cmp
14 май 2026, 23:07
14 май 2026, 23:07
da44936
Код
Авторство
О чём код?
module cpu import cpu_pkg::*; import control_unit_pkg::*; ( input logic start_i, input logic clk_i, input logic rstn_i, // if input logic [PROG_W-1:0] wdata_if_0, input logic wr_if_0, input logic [PROG_ADDR_W-1:0] addr_if_0, output logic [PROG_W-1:0] rdata_if_0, // input logic [DATA_W-1:0] wdata_if_1, input logic wr_if_1, input logic [DATA_ADDR_W-1:0] addr_if_1, output logic [DATA_W-1:0] rdata_if_1, // output logic done_o ); logic [PROG_ADDR_W - 1:0] cu_pc_o; logic [DATA_ADDR_W - 1:0] data_addr; logic cu_program_mem_o; logic program_wr_o; logic cu_program_wr_o; logic [2:0] cu_curr_addr_o; logic cu_curr_data_o; logic cu_rdata_o; logic arg_1_valid; logic arg_2_valid; code_t cu_opcode_i; code_t cu_opcode_o; flags_t flags; logic [PROG_W-1:0] read_comand; logic [DATA_W-1:0] rdata; logic [DATA_W-1:0] arg_1; logic [DATA_W-1:0] arg_2; logic [DATA_W-1:0] alu_res; logic [DATA_ADDR_W-1:0] loopback; assign rdata_if_0 = read_comand; assign rdata_if_1 = rdata; assign cu_opcode_i = code_t'(read_comand[20:16]); control_unit cu ( .start_i(start_i), .opcode_i(cu_opcode_i), .flags_i(flags), .addr_1_i(read_comand[15:8]), .clk_i(clk_i), .rstn_i(rstn_i), .pc_o(cu_pc_o), .cu_program_mem_o(cu_program_mem_o), .program_wr_o(program_wr_o), .cu_program_wr_o(cu_program_wr_o), .cu_curr_addr_o(cu_curr_addr_o), .cu_curr_data_o(cu_curr_data_o), .arg_1_valid_o(arg_1_valid), .arg_2_valid_o(arg_2_valid), .cu_rdata_o(cu_rdata_o), .opcode_o(cu_opcode_o), .done_o(done_o) ); alu alu( .arg_1_i(arg_1), .arg_2_i(arg_2), .code_i(cu_opcode_o), .res_o(alu_res) ); prog_mem prog_mem( .rstn_i(rstn_i), .clk_i(clk_i), .wdata_if_0_i(wdata_if_0), .wr_if_0_i(wr_if_0), .addr_if_0_i(cu_program_mem_o ? cu_pc_o : addr_if_0), .rdata_if_0_o(read_comand) ); data_mem data_mem( .rstn_i(rstn_i), .clk_i(clk_i), .wdata_if_1_i(cu_curr_data_o ? alu_res : wdata_if_1), .wr_if_1_i(cu_program_wr_o ? program_wr_o : wr_if_1), .addr_if_1_i(data_addr), .rdata_if_1_o(rdata), .loopback_o(loopback), .flags_o(flags) ); always_ff @(posedge clk_i) begin if (arg_1_valid) begin arg_1 <= rdata; end else if (arg_2_valid) begin arg_2 <=rdata; end end always_comb begin if (cu_curr_addr_o == 0) begin data_addr = addr_if_1; end else begin if (cu_opcode_o == CMP && cu_program_wr_o == 1) begin data_addr = 0; end else begin if (cu_curr_addr_o == 3) begin data_addr = loopback; end else begin data_addr = (cu_curr_addr_o == 1) ? read_comand[15:8] : read_comand[7:0]; end end end end endmodule