134 lines
5.8 KiB
Verilog
134 lines
5.8 KiB
Verilog
//+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 (
|
||
// [BLOCK 0] 系统与总线接口
|
||
input clk,
|
||
input rst_n,
|
||
input [31:0] wrdata,
|
||
input wren,
|
||
input [24:0] rwaddr,
|
||
input rden,
|
||
output [31:0] rddata,
|
||
|
||
output [23:0]win_us,
|
||
output [1:0]out_mode, //0输出对应温度, 1输出对应的频率,2单位窗口输出脉冲的个数
|
||
output [15:0]temp_85_fre_k, //85°对应的频率,默认为600khz
|
||
output [15:0]temp_neg_40_fre_k , //-40对应的频率,默认为160khz,单位khz
|
||
output report_en,
|
||
output [23:0]rep_gap_us, //最小位win_us 小于就不上报了
|
||
input [23:0]therm_out,
|
||
input therm_vld
|
||
|
||
);
|
||
|
||
// =============================================================================
|
||
// [SECTION A] 地址偏移定义 (Localparams)
|
||
// =============================================================================
|
||
localparam TESTR = 16'h00, DATER = 16'h04;
|
||
localparam WIN_MODE_R = 16'h08; // 配置窗口时间与输出模式
|
||
localparam CALIB_R = 16'h0C; // 标定参数寄存器
|
||
localparam REPORT_R = 16'h10; // 上报使能与间隔
|
||
localparam RESULT_R = 16'h14; // 状态与结果寄存器 (只读)
|
||
|
||
|
||
|
||
// =============================================================================
|
||
// [SECTION B] 内部连线声明 (Wires)
|
||
// =============================================================================
|
||
|
||
// 寄存器选择信号 (Enable Wires)
|
||
wire sel_testr, sel_dater;
|
||
wire sel_win_mode, sel_calib, sel_report, sel_result;
|
||
|
||
// 写使能信号 (Write Enable Wires)
|
||
wire we_testr, we_dater;
|
||
wire we_win_mode, we_calib, we_report;
|
||
|
||
|
||
// 寄存器存储连线 (Storage Wires)
|
||
wire [31:0] testr, dater;
|
||
wire [31:0] win_mode_r, calib_r, report_r, result_r;
|
||
// =============================================================================
|
||
// [SECTION C] 译码逻辑 (Decoding)
|
||
// =============================================================================
|
||
assign sel_testr = (rwaddr[15:0] == TESTR );
|
||
assign sel_dater = (rwaddr[15:0] == DATER );
|
||
assign sel_win_mode = (rwaddr[15:0] == WIN_MODE_R );
|
||
assign sel_calib = (rwaddr[15:0] == CALIB_R );
|
||
assign sel_report = (rwaddr[15:0] == REPORT_R );
|
||
assign sel_result = (rwaddr[15:0] == RESULT_R );
|
||
|
||
// 写使能分配
|
||
assign we_testr = sel_testr & wren;
|
||
assign we_dater = sel_dater & wren;
|
||
assign we_win_mode = sel_win_mode & wren;
|
||
assign we_calib = sel_calib & wren;
|
||
assign we_report = sel_report & 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'h20260406, we_dater, wrdata[31:0], dater, clk, rst_n);
|
||
|
||
// --- 温度计业务寄存器 ---
|
||
// win_mode_r: [25:24] out_mode, [23:0] win_us (默认窗口 1000us)
|
||
sirv_gnrl_dfflrd #(32) win_mode_dff (32'h0000_03E8, we_win_mode, wrdata, win_mode_r, clk, rst_n);
|
||
// calib_r: [31:16] 85度频率(默认600k), [15:0] -40度频率(默认160k)
|
||
sirv_gnrl_dfflrd #(32) calib_dff (32'h0258_00A0, we_calib, wrdata, calib_r, clk, rst_n);
|
||
// report_r: [31] report_en, [23:0] rep_gap_us (默认间隔 50ms)
|
||
sirv_gnrl_dfflrd #(32) report_dff (32'h0000_C350, we_report, wrdata, report_r, clk, rst_n);
|
||
|
||
sirv_gnrl_dffr #(32) result_dff ({8'b0,therm_out},result_r, 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;
|
||
else if (sel_win_mode) rddata_reg = win_mode_r;
|
||
else if (sel_calib) rddata_reg = calib_r;
|
||
else if (sel_report) rddata_reg = report_r;
|
||
else if (sel_result) rddata_reg = result_r;
|
||
end
|
||
|
||
sirv_gnrl_dfflr #(32) rddata_out_dff (rden, rddata_reg, rddata, clk, rst_n);
|
||
|
||
// =============================================================================
|
||
// [SECTION G] 输出映射 (Output Assignments)
|
||
// =============================================================================
|
||
assign win_us = win_mode_r[23:0];
|
||
assign out_mode = win_mode_r[25:24];
|
||
assign temp_85_fre_k = calib_r[31:16];
|
||
assign temp_neg_40_fre_k = calib_r[15:0];
|
||
assign report_en = report_r[31];
|
||
assign rep_gap_us = report_r[23:0];
|
||
|
||
endmodule |