为以下代码写注释 riscv top module file modification allowed for debugging purposesmodule riscv_top# parameter SIM = 0 whether in simulation input wire EXCLK input wire btnC output wire Tx input w
// riscv顶层模块文件 // 允许为调试目的进行修改
module riscv_top #( parameter SIM = 0 // 是否在仿真中 ) ( input wire EXCLK, // 外部时钟信号输入 input wire btnC, // 按钮C信号输入 output wire Tx, // 串行传输输出 input wire Rx, // 串行传输输入 output wire led // LED指示灯输出 );
localparam SYS_CLK_FREQ = 100000000; // 系统时钟频率 localparam UART_BAUD_RATE = 115200; // 串行通信波特率 localparam RAM_ADDR_WIDTH = 17; // 128KiB RAM,不应更改
reg rst; // 复位信号寄存器 reg rst_delay;
wire clk; // 时钟信号
// 将EXCLK(或您自己的时钟模块)分配给时钟信号clk assign clk = EXCLK;
always @(posedge clk or posedge btnC) // 每当时钟上升沿或按钮C上升沿时 begin if (btnC) // 如果按钮C被按下 begin rst <= 1'b1; // 复位信号为1 rst_delay <= 1'b1; // 复位延迟信号为1 end else begin rst_delay <= 1'b0; // 复位延迟信号为0 rst <= rst_delay; // 复位信号等于复位延迟信号 end end
// // 系统存储器总线 // wire [ 7:0] cpumc_din; // CPU存储器控制器数据输入 wire [31:0] cpumc_a; // CPU存储器控制器地址输入 wire cpumc_wr; // CPU存储器控制器写使能信号
// // RAM:内部RAM // wire ram_en; // RAM使能信号 wire [RAM_ADDR_WIDTH-1:0] ram_a; // RAM地址信号 wire [ 7:0] ram_dout; // RAM数据输出信号
ram #(.ADDR_WIDTH(RAM_ADDR_WIDTH))ram0( // 实例化RAM模块 .clk_in(clk), .en_in(ram_en), .r_nw_in(~cpumc_wr), .a_in(ram_a), .d_in(cpumc_din), .d_out(ram_dout) );
assign ram_en = (cpumc_a[RAM_ADDR_WIDTH:RAM_ADDR_WIDTH-1] == 2'b11) ? 1'b0 : 1'b1; // 如果地址是0x3XXXX,则RAM禁用 assign ram_a = cpumc_a[RAM_ADDR_WIDTH-1:0]; // RAM地址等于CPU存储器控制器地址的低17位
// // CPU:实现RISC-V 32位整数基本用户级实模式ISA的CPU // wire [31:0] cpu_ram_a; wire cpu_ram_wr; wire [ 7:0] cpu_ram_din; wire [ 7:0] cpu_ram_dout; wire cpu_rdy;
wire [31:0] cpu_dbgreg_dout;
cpu cpu0( // 实例化CPU模块 .clk_in(clk), .rst_in(rst | program_finish), .rdy_in(cpu_rdy),
.mem_din(cpu_ram_din),
.mem_dout(cpu_ram_dout),
.mem_a(cpu_ram_a),
.mem_wr(cpu_ram_wr),
.io_buffer_full(hci_io_full),
.dbgreg_dout(cpu_dbgreg_dout)
);
// // HCI:主机通信接口块。使用控制器进行交互。 // wire hci_active_out; // HCI模块的活动输出信号 wire [ 7:0] hci_ram_din; // HCI模块的RAM数据输入信号 wire [ 7:0] hci_ram_dout; // HCI模块的RAM数据输出信号 wire [RAM_ADDR_WIDTH-1:0] hci_ram_a; // HCI模块的RAM地址信号 wire hci_ram_wr; // HCI模块的RAM写使能信号
wire hci_io_en; // HCI模块的I/O使能信号 wire [ 2:0] hci_io_sel; // HCI模块的I/O选择信号 wire [ 7:0] hci_io_din; // HCI模块的I/O数据输入信号 wire [ 7:0] hci_io_dout; // HCI模块的I/O数据输出信号 wire hci_io_wr; // HCI模块的I/O写使能信号 wire hci_io_full; // HCI模块的I/O缓冲区满信号
wire program_finish; // 程序结束信号
reg q_hci_io_en;
hci #(.SYS_CLK_FREQ(SYS_CLK_FREQ), // 实例化HCI模块 .RAM_ADDR_WIDTH(RAM_ADDR_WIDTH), .BAUD_RATE(UART_BAUD_RATE)) hci0 ( .clk(clk), .rst(rst), .tx(Tx), .rx(Rx), .active(hci_active_out), .ram_din(hci_ram_din), .ram_dout(hci_ram_dout), .ram_a(hci_ram_a), .ram_wr(hci_ram_wr), .io_sel(hci_io_sel), .io_en(hci_io_en), .io_din(hci_io_din), .io_dout(hci_io_dout), .io_wr(hci_io_wr), .io_full(hci_io_full),
.program_finish(program_finish),
.cpu_dbgreg_din(cpu_dbgreg_dout) // demo
);
assign hci_io_sel = cpumc_a[2:0]; // HCI模块的I/O选择信号等于CPU存储器控制器地址的低3位 assign hci_io_en = (cpumc_a[RAM_ADDR_WIDTH:RAM_ADDR_WIDTH-1] == 2'b11) ? 1'b1 : 1'b0; // 如果地址是0x3XXXX,则HCI I/O使能 assign hci_io_wr = cpumc_wr; // HCI模块的I/O写使能信号等于CPU存储器控制器写使能信号 assign hci_io_din = cpumc_din; // HCI模块的I/O数据输入信号等于CPU存储器控制器数据输入信号
// 在仿真中,HCI始终被禁用 wire hci_active; assign hci_active = hci_active_out & ~SIM;
// 表示调试中断 assign led = hci_active;
// 在HCI活动时暂停CPU assign cpu_rdy = (hci_active) ? 1'b0 : 1'b1;
// 根据调试中断状态(hci_active)从CPU或HCI块选择cpumc信号。 assign cpumc_a = (hci_active) ? hci_ram_a : cpu_ram_a; assign cpumc_wr = (hci_active) ? hci_ram_wr : cpu_ram_wr; assign cpumc_din = (hci_active) ? hci_ram_dout : cpu_ram_dout;
// 2020-10-06修正:返回值与I/O状态的不一致 always @ (posedge clk) begin q_hci_io_en <= hci_io_en; end
assign cpu_ram_din = (q_hci_io_en) ? hci_io_dout : ram_dout; // 如果HCI I/O使能,则CPU RAM数据输入等于HCI I/O数据输出,否则等于RAM数据输出
assign hci_ram_din = ram_dout; // HCI RAM数据输入等于RAM数据输出
endmodul
原文地址: https://www.cveoy.top/t/topic/fhiN 著作权归作者所有。请勿转载和采集!