From 5761fb9a62c2ddb2a3d5644cb72b18ba01531aaf Mon Sep 17 00:00:00 2001 From: yangshenbo Date: Thu, 9 Apr 2026 11:18:14 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E4=BA=86spi=E6=B8=A9?= =?UTF-8?q?=E5=BA=A6=E8=AE=A1=E6=A8=A1=E5=9D=97:win=5Fus=20->win=5Ftime(cl?= =?UTF-8?q?k)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- spi_thermometer_digital/rtl/digital_top.v | 6 +- .../rtl/systemregfile/systemregfile.v | 12 +- spi_thermometer_digital/rtl/therm/pulse_cnt.v | 4 +- spi_thermometer_digital/tb/tb_diginal_top.sv | 4 +- spi_thermometer_digital/tb/tb_diginal_top.v | 119 ------------------ 5 files changed, 13 insertions(+), 132 deletions(-) delete mode 100644 spi_thermometer_digital/tb/tb_diginal_top.v diff --git a/spi_thermometer_digital/rtl/digital_top.v b/spi_thermometer_digital/rtl/digital_top.v index f027161..41427db 100644 --- a/spi_thermometer_digital/rtl/digital_top.v +++ b/spi_thermometer_digital/rtl/digital_top.v @@ -40,7 +40,7 @@ wire wren; wire rden; wire [31:0]rddata; -wire [23:0] win_us; +wire [31:0] win_time; wire cnt_vld; wire [23:0]cnt_out; @@ -71,7 +71,7 @@ wire [23:0]cnt_out; .rden (rden), .rddata (rddata), // digital_thermometer - .win_us(win_us), + .win_time(win_time), .pulse_cnt_out(cnt_out), .pules_cnt_vld(cnt_vld) ); @@ -83,7 +83,7 @@ wire [23:0]cnt_out; .clk (clk), .rst_n (rst_n), .sig_in (sig_in), - .win_us (win_us), + .win_time (win_time), .cnt_out(cnt_out), .vld_out(cnt_vld) ); diff --git a/spi_thermometer_digital/rtl/systemregfile/systemregfile.v b/spi_thermometer_digital/rtl/systemregfile/systemregfile.v index 3cb78ed..bdf3fbc 100644 --- a/spi_thermometer_digital/rtl/systemregfile/systemregfile.v +++ b/spi_thermometer_digital/rtl/systemregfile/systemregfile.v @@ -24,7 +24,7 @@ module system_regfile ( input rden, output [31:0] rddata, - output [23:0]win_us, + output [31:0] win_time, input [23:0]pulse_cnt_out, input pules_cnt_vld @@ -52,8 +52,8 @@ module system_regfile ( // Register storage wires (Storage Wires) - wire [31:0] testr, dater; - wire [23:0] win_time_r, result_r; + wire [31:0] testr, dater , win_time_r; + wire [23:0] result_r; // ============================================================================= // [SECTION C] Decoding Logic (Decoding) // ============================================================================= @@ -77,7 +77,7 @@ sirv_gnrl_dfflrd #(32) testr_dff (32'h01234567, we_testr, wrdata[31:0], testr, c sirv_gnrl_dfflrd #(32) sfrtr_dff (32'h20260406, we_dater, wrdata[31:0], dater, clk, rst_n); // --- Thermometer Functional Registers --- -sirv_gnrl_dfflrd #(24) win_time_dff (32'h00_03E8, we_win_time, wrdata, win_time_r, clk, rst_n); +sirv_gnrl_dfflrd #(32) win_time_dff (32'h0000_C350, we_win_time, wrdata, win_time_r, clk, rst_n); sirv_gnrl_dfflr #(24) result_dff (pules_cnt_vld,pulse_cnt_out,result_r, clk, rst_n); @@ -96,7 +96,7 @@ always @(*) begin rddata_reg = 32'b0; if (sel_testr) rddata_reg = testr; else if (sel_dater) rddata_reg = dater; - else if (sel_win_time) rddata_reg = {8'b0,win_time_r}; + else if (sel_win_time) rddata_reg = win_time_r; else if (sel_result) rddata_reg = {8'b0,result_r}; end @@ -105,7 +105,7 @@ end // ============================================================================= // [SECTION G] Output Mapping (Output Assignments) // ============================================================================= - assign win_us = win_time_r; + assign win_time = win_time_r; endmodule \ No newline at end of file diff --git a/spi_thermometer_digital/rtl/therm/pulse_cnt.v b/spi_thermometer_digital/rtl/therm/pulse_cnt.v index 06ee09b..a229bbd 100644 --- a/spi_thermometer_digital/rtl/therm/pulse_cnt.v +++ b/spi_thermometer_digital/rtl/therm/pulse_cnt.v @@ -6,7 +6,7 @@ module pulse_cnt #( input wire clk, input wire rst_n, input wire sig_in, - input wire [23:0] win_us, + input wire [31:0] win_time, output reg [23:0] cnt_out, output reg vld_out ); @@ -40,7 +40,7 @@ module pulse_cnt #( end else begin vld_out <= 1'b0; - target_cnt <= ( {40'd0, win_us} * CLK_FREQ) / 1_000_000 ; + target_cnt <= win_time ; // Window count end condition: current count reaches target_cnt if (window_cnt >= target_cnt) begin cnt_out <= pulse_cnt; diff --git a/spi_thermometer_digital/tb/tb_diginal_top.sv b/spi_thermometer_digital/tb/tb_diginal_top.sv index 9d7c69b..3eeca1c 100644 --- a/spi_thermometer_digital/tb/tb_diginal_top.sv +++ b/spi_thermometer_digital/tb/tb_diginal_top.sv @@ -54,11 +54,11 @@ module tb_digital_top(); #(CLK_PERIOD * 10); spi_read(25'h0c, 5'h00); #(CLK_PERIOD * 10); - spi_write(25'h08, 5'h00, 32'h2); + spi_write(25'h08, 5'h00, 32'h61a8); end begin - gen_pulses(1000,5); + gen_pulses(400,5); end join diff --git a/spi_thermometer_digital/tb/tb_diginal_top.v b/spi_thermometer_digital/tb/tb_diginal_top.v deleted file mode 100644 index b9b60ef..0000000 --- a/spi_thermometer_digital/tb/tb_diginal_top.v +++ /dev/null @@ -1,119 +0,0 @@ -`timescale 1ns / 1ps - -module tb_digital_top(); - - // 参数定义 - parameter CLK_PERIOD = 10; // 100MHz 系统时钟 - parameter SCLK_PERIOD = 100; // 10MHz SPI时钟 (必须比系统时钟慢) - - // 信号声明 - logic clk; - logic rst_n; - logic [4:0] cfgid; - - logic sclk; - logic csn; - logic mosi; - logic miso; - logic oen; - - - // 实例化 DUT - digital_top u_digital_top ( - .clk (clk ), - .rst_n (rst_n ), - .cfgid (cfgid ), - .sclk (sclk ), - .csn (csn ), - .mosi (mosi ), - .miso (miso ), - .oen (oen ), - .sig_in ( ) - ); - - // 系统时钟产生 - initial begin - clk = 0; - forever #(CLK_PERIOD/2) clk = ~clk; - end - - // 初始复位与赋值 - initial begin - rst_n = 0; - sclk = 0; - csn = 1; - mosi = 0; - cfgid = 5'h0A; // 设定芯片ID为 10 - - #(CLK_PERIOD * 10); - rst_n = 1; - #(CLK_PERIOD * 10); - - // --- 开始测试 --- - - // 1. 测试写操作: 写入 0x12345678 到 地址 0x100 - spi_write(25'h100, 5'h0A, 32'h12345678); - - #(SCLK_PERIOD * 5); - - // 2. 测试读操作: 从地址 0x100 读取 (验证读使能和地址) - spi_read(25'h222, 5'h0A); - - #(SCLK_PERIOD * 20); - $display("Test Bench Finished."); - $finish; - end - - // --------------------------------------------------------- - // Task: SPI 发送/接收 32位数据 - // --------------------------------------------------------- - task spi_xfer_32(input [31:0] data_in, output [31:0] data_out); - for (int i = 31; i >= 0; i--) begin - mosi = data_in[i]; // MSB First - #(SCLK_PERIOD/2); - sclk = 1; // 上升沿,DUT采样 - #(SCLK_PERIOD/2); - data_out[i] = miso; // 采样从机发回的数据 - sclk = 0; - end - endtask - - // --------------------------------------------------------- - // Task: 写操作 (wnr=0) - // --------------------------------------------------------- - task spi_write(input [24:0] target_addr, input [4:0] id, input [31:0] data); - logic [31:0] header; - logic [31:0] dummy; - - header = {1'b0, target_addr, id, 1'b0}; // 构造命令帧 - - $display("[WRITE] Addr: %h, Data: %h", target_addr, data); - - csn = 0; - spi_xfer_32(header, dummy); // 发送命令 - spi_xfer_32(data, dummy); // 发送数据 - csn = 1; - mosi = 0; - endtask - - // --------------------------------------------------------- - // Task: 读操作 (wnr=1) - // --------------------------------------------------------- - task spi_read(input [24:0] target_addr, input [4:0] id); - logic [31:0] header; - logic [31:0] read_val; - - header = {1'b1, target_addr, id, 1'b0}; // 构造命令帧 (wnr=1) - - $display("[READ] Addr: %h", target_addr); - - csn = 0; - spi_xfer_32(header, read_val); // 发送命令帧,此时读回的可能是无用数据 - spi_xfer_32(32'h0, read_val); // 发送Dummy,接收真正的读数据 - csn = 1; - mosi = 0; - - $display("[READ] Result: %h", read_val); - endtask - -endmodule \ No newline at end of file