昨日事情多,空一天。今日不想学,但有亏与心,故打算做一点。
今日做的事情也比较杂:
1.先是完善上次没写完的代码,补充了一些功能,用那个网站跑了个仿真,但还没细看。加上今日不太想学,故草草收场。但好在,day1遇到的不懂的地方知道咋回事了。
2.了解了一下pds软件怎么用的,因为后续还是要在软件上做一些操作(这个网站可能更适合分享一些工程给别人看,但目前我觉得便利性好像也不是很强,因为一开始在软件上弄,搞到网站上还要加一些指定宏),而且debug软件会更方便。但是找了几个教程,感觉质量都挺差的,csdn还全是收费的,无语。
3.不能在for循环里面像for (integer i =0;.....)这样,会报错(起码这个网站会),要拿出去声明。
4.麻蛋的,数模国赛凉凉,返回来想,还是眼高手低了,步子迈太大,扯着蛋了。
今日到此为止,下播,进度如下:
`timescale 1ns/1ns
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, // 采集完成标志
output reg [7:0] freq_spectrum_out, // 频谱数据输出
output reg [3:0] freq_spectrum_index // 频谱数据索引
);
integer j = 0;
reg [2:0] signal_buffer[0:9]; // 信号缓冲区
integer i = 0; // 缓冲区索引
reg [7:0] freq_spectrum[0:9]; // 频谱数据
// 控制信号采集
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
i <= 0;
capture_done <= 0;
captured_signals <= 3'b000;
freq_spectrum_index <= 0;
freq_spectrum_out <= 8'h00;
end else if (start_capture) begin
if (i < 10) begin
signal_buffer[i] <= signals; // 采集信号
i <= i + 1;
end
capture_done <= (i >= 10); // 采集完成标志
end
end
// 简易频谱分析(示例性,实际实现需要更复杂的逻辑)
always @(posedge clk or negedge rst_n) begin
if (!rst_n) begin
captured_signals <= 3'b000;
end else if (capture_done) begin
// 进行FFT处理
for (j = 0; j < 10; j++) begin
freq_spectrum[j] = fft(signal_buffer[j]);
end
captured_signals <= signal_buffer[0]; // 暂存第一个样本作为示例
freq_spectrum_index <= 0; // 初始化频谱索引
freq_spectrum_out <= freq_spectrum[0]; // 输出第一个频谱数据
end else if (freq_spectrum_index < 10) begin
freq_spectrum_index <= freq_spectrum_index + 1;
freq_spectrum_out <= freq_spectrum[freq_spectrum_index];
end
end
// FFT函数(示例性,实际实现需要更复杂的逻辑)
function [7:0] fft(input [2:0] signal);
begin
// 这里可以添加FFT算法的实现
fft = 8'h00; // 示例性返回值
end
endfunction
endmodule
`timescale 1ns/1ns
//----------------Testbench-----------------
module top_module();
reg clk;
reg rst_n;
reg start_capture;
reg [2:0] signals;
wire [2:0] captured_signals;
wire capture_done;
wire [7:0] freq_spectrum_out;
wire [3:0] freq_spectrum_index;
initial `probe_start;
integer k = 0;
// 实例化采集模块
SignalCapture sc (
.clk(clk),
.rst_n(rst_n),
.start_capture(start_capture),
.signals(signals),
.captured_signals(captured_signals),
.capture_done(capture_done),
.freq_spectrum_out(freq_spectrum_out),
.freq_spectrum_index(freq_spectrum_index)
);
// 生成时钟信号
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);
// 这里可以添加代码来处理采集到的信号
for (k = 0; k < 10; k++) begin
#10 $display("Freq Spectrum %d: %h", k, freq_spectrum_out);
end
end
#10 $finish; // 结束仿真
end
// 使用`probe`宏来在时序图中展示信号
`probe(clk);
`probe(rst_n);
`probe(start_capture);
`probe(signals);
`probe(captured_signals);
`probe(capture_done);
endmodule
明日计划:
1.把仿真图看明白了,然后完善代码,起码频谱分析功能搞定。
2.继续搜搜pds教程,太怪异了
3.高项的话,看着做吧,优先第二周任务