【问题标题】:How to create positive edge detector behavioural code?如何创建正边缘检测器行为代码?
【发布时间】:2021-05-05 06:23:49
【问题描述】:

我目前正在尝试编写一个上升沿检测器,每次检测到上升沿时都会改变其输出。我成功地使用门级建模构建了一个,但现在我需要使用行为建模来构建它。我尝试使用这个基础构建它:

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

编译时返回如下错误

错误:C:/Modeltech_pe_edu_10.4a/examples/pos edge detect.v(8): (vlog-2110) 非法引用网络“out”。

此错误是什么意思,如何正确使用always 代码来检测输入和时钟脉冲的上升沿?

【问题讨论】:

    标签: verilog


    【解决方案1】:

    该错误意味着当您在 always 块内分配给 out 时,您不能将其声明为 wire。您需要将out 声明为reg。我在 edaplayground 上发布了您的模块,并在几个模拟器上对其进行了编译,其中一个产生了这个稍微更具体的错误消息:

    out 在这里被声明为wire。

    至少这会提示您使用wire 有问题。

    这行也有问题:

    always @ (posedge in, posedge clk)
    

    这不会被合成到触发器中。

    我认为您正在寻找一个模块,该模块将检测sig 上的姿势并生成输出pe,这将是一个单时钟宽脉冲,并且还会生成一个输出out,该输出将在每次触发时切换可以看到sig 上的姿势。我假设您的 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-30
      • 1970-01-01
      • 2020-07-13
      相关资源
      最近更新 更多