初步学习verilog,目前需要做的工作是 采集到一段信号。想要统计这段信号的脉冲个数,以及脉冲宽度的分布情况。
初步想法是通过对该段信号的上升沿检测,检测到上升沿就计数+1,可以最终得到脉冲个数。
然后检测下降沿,通过下降沿的时间减去上升沿的时间可以得到脉冲宽度,并且也存放起来。
目前只是单纯的实现了上升沿和下降沿的检测。
module edge_detect(
input clk,
input rst,
input sig,
output pos_edge,
output neg_edge
);
reg sig_r1,sig_r2; //2级寄存器
reg cnt; //对上升沿进行计数
always @(posedge clk) begin //复位
if (rst) begin
sig_r1 <= 1'b0;
sig_r2 <= 1'b0;
end
else begin
sig_r1 <= sig;
sig_r2 <= sig_r1;
end
end
module edge_detect(
input clk,
input rst,
input sig,
output pos_edge,
output neg_edge
);
reg sig_r1,sig_r2; //2级寄存器
reg [15:0] cnt_r = 0; //对上升沿进行计数
reg [15:0] cnt_s = 0; //计数结果
reg pos_edge_r = 0;
reg neg_edge_r = 0;
assign pos_edge = pos_edge_r; //上升沿脉冲比实际的 sig 迟后 2 个clk 和 sig_r2 对齐
assign neg_edge = neg_edge_r; //下降沿脉冲比实际的 sig 迟后 2 个clk 和 sig_r2 对齐
always @(posedge clk) begin //复位
if (rst) begin
sig_r1 <= 1'b0;
sig_r2 <= 1'b0;
end
else begin
sig_r1 <= sig;
sig_r2 <= sig_r1;
end
end
always @(posedge clk)
begin
if (rst)
begin
pos_edge_r <= 1'b0;
end
else if(sig_r1 != sig_r2 && sig_r1 == 1'b1) //上升沿
begin
pos_edge_r <= 1'b1;
end
else
begin
pos_edge_r <= 1'b0;
end
end
always @(posedge clk)
begin
if (rst)
begin
neg_edge_r <= 1'b0;
end
else if(sig_r1 != sig_r2 && sig_r1 == 1'b0) //下降沿
begin
neg_edge_r <= 1'b1;
end
else
begin
neg_edge_r <= 1'b0;
end
end
always @(posedge clk)
begin
if (rst)
begin
cnt_r <= 16'b0;
end
else if(sig_r2 == 1)
begin
cnt_r <= cnt_r + 1;
end
else
begin
cnt_r <= 16'b0;
end
end
always @(posedge clk)
begin
if (rst)
begin
cnt_s <= 16'b0;
end
else if(neg_edge_r == 1)
begin
cnt_s <= cnt_r;
end
end
endmodule
要做一个计时器吧