thermometer_digital/rtl/systemregfile/my_systemregfile.v

102 lines
4.0 KiB
Verilog
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.

//+FHDR--------------------------------------------------------------------------------------------------------
// 增加一个新寄存器:
// SECTION A: 添加 localparam ADDR_NEW = 16'hXX;。
// SECTION B: 声明 wire sel_new, we_new, [31:0] reg_new;。
// SECTION C: 增加译码逻辑assign sel_new = (reg_idx == ADDR_NEW >> 2);。
// SECTION D: 调用底层库,例如 sirv_gnrl_dfflr #(32) new_dff (we_new, wrdata, reg_new, clk, rst_n);。
// SECTION F: 在 always 块中加入 else if (sel_new) rddata_reg = reg_new;。
// SECTION G: 将 reg_new 映射给模块的输出端口。
//-FHDR--------------------------------------------------------------------------------------------------------
module system_regfile # (
parameter CHIPCODE = 32'hDA400801,
parameter MFDATE = 32'h20260510
)(
// [BLOCK 0] 系统与总线接口
input clk, // 时钟
input rst_n, // 异步复位 (低有效)
input [31:0] wrdata, // 总线写数据
input wren, // 写使能
input [24:0] rwaddr, // 地址 (Byte Address)
input rden, // 读使能
output [31:0] rddata // 总线读数据
);
// =============================================================================
// [SECTION A] 地址偏移定义 (Localparams)
// =============================================================================
localparam TESTR = 16'h00, DATER = 16'h04;
// =============================================================================
// [SECTION B] 内部连线声明 (Wires)
// =============================================================================
// 寄存器选择信号 (Enable Wires)
wire sel_testr, sel_dater;
// 写使能信号 (Write Enable Wires)
wire we_testr, we_dater;
// 寄存器存储连线 (Storage Wires)
wire [31:0] testr, dater;
// =============================================================================
// [SECTION C] 译码逻辑 (Decoding)
// =============================================================================
assign sel_testr = (rwaddr[15:0] == TESTR );
assign sel_dater = (rwaddr[15:0] == DATER );
// 写使能分配
assign we_testr = sel_testr & wren;
assign we_dater = sel_dater & wren;
// =============================================================================
// [SECTION D] 寄存器实例化 (Storage Implementation)
// =============================================================================
// --- 通用与测试寄存器 ---
sirv_gnrl_dfflrd #(32) testr_dff (32'h01234567, we_testr, wrdata[31:0], testr, clk, rst_n);
sirv_gnrl_dfflrd #(32) sfrtr_dff (32'd20270403, we_dater, wrdata[31:0], dater, clk, rst_n);
// =============================================================================
// [SECTION E] 特殊业务逻辑 (Business Logic)
// =============================================================================
// LVDS 实时状态寄存器
// sirv_gnrl_dffr #(8) lvdssr_inst ({link_down, train_ready, crc_error_r, phase_adj_req_r, phase_tap[2:0], prefilling}, lvdssr, clk, rst_n);
// =============================================================================
// [SECTION F] 读回逻辑 (Readback Mux)
// =============================================================================
reg [31:0] rddata_reg;
always @(*) begin
rddata_reg = 32'b0;
if (sel_testr) rddata_reg = testr;
else if (sel_dater) rddata_reg = dater;
end
sirv_gnrl_dfflr #(32) rddata_out_dff (rden, rddata_reg, rddata, clk, rst_n);
// =============================================================================
// [SECTION G] 输出映射 (Output Assignments)
// =============================================================================
// assign sys_soft_rstn = sys_soft_rstn_r;
// assign sync_oen = syncr[18];
// assign nco_clr = ncoctrlr[2];
// assign nco_en = ncoctrlr[1] & doselr[2];
// assign p2a_en = ncoctrlr[0] & doselr[2];
endmodule