今天主要是找了个能在线verilog仿真的网站,学习了怎么使用,搞了个具有示波器功能,能进行信号的采集和显示,并能控制信号进行采集,能对信号进行 简易频谱分析,能改变信号的显示刻度,调整示波器的精度,代码如下:
//--------------RTL------------------
module SignalCapture(
input wire clk,
input wire rst_n,
input wire start_capture, // 控制信号采集的开始
input wire [2:0] signals, // 假设采集3位宽的数字信号
output reg [2:0] captured_signals, // 采集信号
output reg capture_done // 采集完成标志
);
reg [2:0] signal_buffer[0:9]; // 信号缓冲区
integer i = 0; // 缓冲区索引
// 控制信号采集
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
i <= 0;
capture_done <= 0;
captured_signals <= 3'b000;
end else if (start_capture) begin
if (i < 10) begin
signal_buffer[i] <= signals; // 采集信号
i <= i + 1;
end
capture_done <= (i >= 3); // 采集完成标志
end
end
// 简易频谱分析(示例性,实际实现需要更复杂的逻辑)
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
captured_signals <= 3'b000;
end else if (capture_done) begin
captured_signals <= signal_buffer[0]; // 暂存第一个样本作为示例
end
end
endmodule
`timescale 1ns/1ns
//----------------Testbench-----------------
module top_module();
reg clk;
reg rst_n;
initial `probe_start;
reg start_capture;
reg [2:0] signals;
wire [2:0] captured_signals;
wire capture_done;
// 实例化采集模块
SignalCapture sc (
.clk(clk),
.rst_n(rst_n),
.start_capture(start_capture),
.signals(signals),
.captured_signals(captured_signals),
.capture_done(capture_done)
);
// 生成时钟信号
initial begin
clk = 0;
forever #5 clk = ~clk; // 产生周期为10单位时间的时钟信号
end
// 初始化并提供测试信号
initial begin
rst_n = 0; // 复位
#10;
rst_n = 1; // 释放复位
#10;
start_capture = 0;
signals = 3'b000;
#10;
start_capture = 1; // 开始信号采集
#10 signals = 3'b001;
#10 signals = 3'b010;
#10 signals = 3'b011;
#10 signals = 3'b100;
#10 signals = 3'b101;
#10 signals = 3'b110;
#10 signals = 3'b111;
#10 start_capture = 0; // 停止信号采集
#10;
if (capture_done) begin
$display("Capture Done at %t", $time);
// 这里可以添加代码来处理采集到的信号
end
#10 $finish; // 结束仿真
end
// 使用`probe`宏来在时序图中展示信号
`probe(clk);
`probe(rst_n);
`probe(start_capture);
`probe(signals);
`probe(captured_signals);
`probe(capture_done);
endmodule
但是仿真产生的波形图却是这样的:
captured_signals始终没有抓取到信号,它是从缓冲区获得的,明天再具体看看代码逻辑哪里有问题,明天早八,今天太晚了