(二)脉冲信号检测

要求:检测连续(连续的意思是间隔不超过150us到230us)两个80us~120us的方波信号

方法:利用上一文的边沿检测方法,当检测到满足条件的脉冲时产生一个标志信号,最后再计算他们的间隔是否满足。

1.检测模块代码如下:

module hyjc(  input clk,
              input clk_3m125,   //3.125mhz
              input data,
				  input rstn,
				  output reg  dout_flag


    );
	 
 
	          reg d1;
				 reg [15:0]cnt=0;
				 reg flag=0;
			always@(posedge clk_3m125)
				 d1<=data;
		assign rising=data&(!d1);
		assign falling=d1&(!data);
				  
                   
			always@(posedge clk_3m125 or negedge rstn)
				 if(!rstn)
				  cnt<=0;
				 else if((rising)&(cnt==0))
				  cnt<=cnt+1;
				 else if((cnt>0)&(falling==0))
					cnt<=cnt+1;
				 else if(falling==1)
					cnt<=0;
					
			always@(posedge clk_3m125)
				 if(cnt<240)
					 flag<=0;
				 else if((cnt>240)&(cnt<360)&(falling))
				   flag<=1;
					
		assign a_flag=flag;
				reg d2;
				reg t_flag=0;
							  
			 always@(posedge clk_3m125)
					 d2<=a_flag;
		assign rising1=a_flag&(!d2);
		assign falling1=d2&(!a_flag);				  
							  
				   reg [15:0]cnt1=0;
						
						
				always@(posedge clk_3m125 or negedge rstn)
					 if(!rstn)
					   cnt1<=0;
					 else if((falling1)&(cnt1==0))
						cnt1<=cnt1+1;
					 else if((cnt1>0)&(rising1==0))
						cnt1<=cnt1+1;
					else if(rising1==1)
						cnt1<=0;
						
					always@(posedge clk_3m125)
						if(cnt1<480)
						  dout_flag<=0;
						else if((cnt1>480)&(cnt1<720)&(rising1==1))
						  dout_flag<=1;
						 else if((cnt1>720)&(rising1==1))
						  dout_flag<=0;
						 else if(cnt1<=0)
						dout_flag<=0;
						
	
endmodule

2.待检测信号模块

module sigproduce(
    input clk,            //50M
	 output clk_3m125,     //3.125mhz
	 output rstn,
    output reg dout     //random squence
    );
  
  wire clk3m125,locked;  
  clockpro u1
   (// Clock in ports
    .CLK_IN1(clk),      // IN
    // Clock out ports
    .CLK_OUT1(clk3m25),     // OUT
    // Status and control signals
    .LOCKED(locked));      // OUT	 
  
  assign clk_3m25 = clk3m125;
  assign rstn = locked;
  
  reg [10:0] cn = 0;	
  always @(posedge clk3m125 or negedge locked)
     if (!locked) begin
        cn <= 0;
        dout <= 0;
        end
     else begin
        cn <= cn + 1;
        case (cn)
			  0: dout <= 0;
			  10: dout <= 1;
			  20: dout <= 0;
			  30: dout <= 1;
			  35: dout <= 0;
			  300: dout <= 1;
			  620: dout <= 0;
			  900: dout <= 1;
			  1250: dout <= 0;
			  1600: dout <= 1;
			  1650: dout <= 0;
        endcase
        end		  
	 

endmodule

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FPGA 中实现脉冲信号边缘检测可以利用 FPGA 内部的计数器和触发器等硬件模块,以及 VHDL 或 Verilog 等硬件描述语言进行设计和实现。 以下是一个简单的 FPGA 脉冲信号边缘检测的实现示例,以检测一个外部输入信号的上升沿为例: ```vhdl -- 定义输入、输出端口 entity edge_detection is Port ( clk : in STD_LOGIC; input : in STD_LOGIC; output : out STD_LOGIC); end edge_detection; -- 实现边缘检测 architecture Behavioral of edge_detection is -- 定义计数器和触发器 signal counter : integer range 0 to 9999 := 0; signal trigger : STD_LOGIC := '0'; begin -- 计数器递增 process(clk) begin if rising_edge(clk) then if counter < 9999 then counter <= counter + 1; else counter <= 0; end if; end if; end process; -- 检测上升沿 process(input, counter) begin if input = '1' and counter = 0 then trigger <= '1'; else trigger <= '0'; end if; end process; -- 输出触发信号 process(trigger) begin if trigger = '1' then output <= '1'; else output <= '0'; end if; end process; end Behavioral; ``` 在上面的示例中,我们首先定义了输入端口 clk 和 input,以及输出端口 output。然后在 architecture 中,我们定义了一个计数器 signal counter 和一个触发器 signal trigger,用于实现上升沿的检测。 具体地,我们使用一个 process 对计数器进行递增操作,同时使用另一个 process 对输入信号和计数器进行判断,如果检测到输入信号为高电平且计数器为 0,则表示发生了上升沿,此时触发器的值为 '1';否则触发器的值为 '0'。最后,我们通过一个 process 将触发器的值输出到 output 端口。 这就是一个简单的 FPGA 脉冲信号边缘检测的实现示例。在实际应用中,可能需要更复杂的算法和硬件模块来实现不同的边缘检测需求。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值