请问怎么用verilog语言来判断一个输入信号是持续高电平还是时钟信号,请大侠指点

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了请问怎么用verilog语言来判断一个输入信号是持续高电平还是时钟信号,请大侠指点相关的知识,希望对你有一定的参考价值。

参考技术A 边沿检测,假如要检测的信号是a:
if(posedge clk)
a1 <= a;
assign edge_sig = a1^a;

使用Verilog如何设计一个上升沿检测器?

设计一个模块:当输入信号端(位宽1位)出现上升沿跳变时,执行相应操作?请问该如何实现检测该上升沿检测?

疑问1:可以使用posedge+端口名称来实现上升沿检测吗?我看了好多程序中posedge后面都跟的是时钟?

Posedge用来作为时钟使用的。相当于触发器的时钟输入端。

要检测信号上升沿的话,可以采用以下方法:
always@(posedge clk or negedge rst)
if(!rst)
begin sign_1b <= 1'b0; sign_2b <= 1'b0; end
else
begin sign_1b <= sign; sign_2b <= sign_1b; end

always@(posedge clk or negedge rst)
if(!rst)
sign_pos <= 1'b0;
else if (sign_2b && !sign_1b)
sign_pos <= 1'b1;
else
sign_pos <= 1'b0;
参考技术A Posedge用来作为时钟使用的。相当于触发器的时钟输入端。

要检测信号上升沿的话,可以采用以下方法:
always@(posedge clk or negedge rst)
if(!rst)
begin sign_1b <= 1'b0; sign_2b <= 1'b0; end
else
begin sign_1b <= sign; sign_2b <= sign_1b; end

always@(posedge clk or negedge rst)
if(!rst)
sign_pos <= 1'b0;
else if (sign_2b && !sign_1b)
sign_pos <= 1'b1;
else
sign_pos <= 1'b0;
参考技术B 答:
  如果你是有clk的同步时序电路,那么不允许使用posedge + 端口名称的方式来生成边沿检测
电路。

  所谓边沿检测就是对前一个clock状态和目前clock状态的比较,如果是由0变为1,能够检测
到上升沿,则称为上升沿检测电路(posedge edge detection circuit),若是由1变为0,能够
检测到下降沿,则被称为下降沿检测电路(negedge edge dttection circuit),能够同时检测
上升沿与下降沿的电路称为双沿检测电路(double edge detection)。

照这个原理,下面的代码是一个上升沿检测电路,巧妙运用了非阻塞赋值自动产生寄存器的
特性。下降沿检测电路只需把 pedge <= in & ~d_last; 改为 pedge <= ~in & d_last;
即可。双沿检测电路只需把 pedge <= in & ~d_last; 改为 pedge <= in ^ d_last;
(异或)即可。

module top_module(
       input clk,
       input [7:0] in,
       output reg [7:0] pedge);
      
       reg [7:0] d_last;     
                    
       always @(posedge clk) begin
         d_last <= in; // 保存上一个状态
         pedge <= in & ~d_last; //in的数据变化后有上升沿时,pedge变1
       end
      
endmodule

以上是关于请问怎么用verilog语言来判断一个输入信号是持续高电平还是时钟信号,请大侠指点的主要内容,如果未能解决你的问题,请参考以下文章

用verilog来描述组合逻辑电路

使用Verilog如何设计一个上升沿检测器?

verilog hdl中有了posedge和negedge为啥还要用脉冲边沿检测?。

verilog 中啥语句并行运行啥时候顺序运行!搞不懂 请教高手!

六位数字序列连续出现,输出高电平并报警的verilog语言怎么写?

请问c语言中用字符数组怎么判断输入的一串数字是大于等于或者小于0呢