正边缘检测器Verilog行为代码
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了正边缘检测器Verilog行为代码相关的知识,希望对你有一定的参考价值。
我目前正在尝试编写一个上升沿检测器,每次检测到上升沿时都会更改其输出。我成功地使用门级建模来构建一个,但是现在我需要使用行为建模来构建它。我尝试使用此基础构建它:
module pos_edge_det ( input sig,
input clk,
output pe);
reg sig_dly;
always @ (posedge clk) begin
sig_dly <= sig;
end
assign pe = sig & ~sig_dly;
endmodule
所以,我尝试编写一个代码,使其在输入上检测到的每个上升沿中,输出总是反转
module posedgedet(in, out, clk, res);
input wire in,clk,res;
output wire out;
always @ (posedge in, posedge clk)
begin
out <= ~out;
end
endmodule
编译时,它返回以下错误
** Error: C:/Modeltech_pe_edu_10.4a/examples/pos edge detect.v(8): (vlog-2110) Illegal reference to net "out".
此错误是什么意思,以及您如何正确地使用Always码来检测输入和时钟脉冲的上升沿?
答案
该错误表示在out
块中分配wire
时无法将其声明为always
。您需要将out
声明为reg
。
此行也有问题:
always @ (posedge in, posedge clk)
不会被合成为触发器。
[我认为您正在寻找一个模块,该模块将检测sig上的posege并生成输出pe
,该输出将是一个单时钟宽度的脉冲,并且还会生成一个输出out
,该输出将在每次sig上的posege时切换被看到。我假设您的res
信号已重置。
module pos_edge_det (
input sig,
input clk,
input res,
output pe,
output reg out
);
reg sig_dly;
always @ (posedge clk or posedge res) begin
if (res) begin
sig_dly <= 0;
end else begin
sig_dly <= sig;
end
end
assign pe = sig & ~sig_dly;
always @ (posedge clk or posedge res) begin
if (res) begin
out <= 0;
end else if (pe) begin
out <= ~out;
end
end
endmodule
module tb;
reg clk, res, sig;
wire pe, out;
initial begin
clk = 0;
forever #5 clk =~clk;
end
pos_edge_det dut (
// Inputs:
.clk (clk),
.res (res),
.sig (sig),
// Outputs:
.out (out),
.pe (pe)
);
initial begin
sig = 0;
res = 1;
#20 res = 0;
repeat (10) #30 sig = ~sig;
#5 $finish;
end
endmodule
以上是关于正边缘检测器Verilog行为代码的主要内容,如果未能解决你的问题,请参考以下文章
verilog hdl中有了posedge和negedge为啥还要用脉冲边沿检测?。
三帧差,边缘检测,FPGA基于FPGA的三帧差+边缘检测的Verilog实现
12mmaction2 行为识别商用级别X3D复现 demo实现 检测自己的视频 Expanding Architecturesfor Efficient Video Recognition(代码片段