verilog实现可综合脉冲信号延时模块的三种方法-基础小知识(四)


脉冲信号间隔数个时钟周期后输出是常见的信号处理形式,这里总结了三种常见的同步时钟下脉冲信号延时的方法,仅供参考。~~~

1.1 背景

下面处理的都是单个周期宽度的脉冲信号,信号宽度与时钟周期相同。三种方法分别是延时打拍,寄存器移位,计数器延时

1.2 延时打拍

方法比较简单,适用于两拍,三拍传递数据,两拍跨时钟域同步,两拍信号上升沿、下降沿采样。

1.3 寄存器移位

较多次打拍从形式上较为繁琐,可以采用定义多为寄存器移位传输数据。

    input    pulse_in ;      //脉冲输入
    wire     pulse_out ;     //脉冲输出
reg  [9:0]   pulse_tmp ;     //存放脉冲在传输过程的临时数据  

     always @(posedge CLK or negedge rst_n)	begin	
	      if(!rst_n)
				pulse_tmp <= 10'd0;
         else if(pulse_in == 1'b1)//脉冲输入信号到来
             pulse_tmp <= {pulse_tmp[8:0],pulse_in};
		 else
             pulse_tmp <= {pulse_tmp[8:0],1'b0};       //每隔一个时钟周期,前移一位
		end
     assign pulse_out = pulse_tmp[9] ;        //间隔数个周期后,从高位输出   
1.4 计数器延时

原理为采样到输入脉冲后把flag信号置1,开始计数,计数到需要的延时之后,输出一个脉冲信号,同时清除计数,清零flag信号。

module pulse_delay(
		input     CLK  ,	 
		input     rst_n,
		input     Delay_IN  ,	//输入脉冲
		output    Delay_OUT //延时后的输出脉冲
	      );
     reg [7:0] delay_plus;
	 reg Delay_plus;
	 reg plus_flag;
	 
	 assign Delay_OUT = Delay_plus;
	always @(posedge CLK or negedge rst_n) begin
	  if(!rst_n)
	  	    plus_flag<= 1'b0;	  
	  else if(Delay_IN == 1'b1)
		    plus_flag<= 1'b1;
	  else if(delay_plus[7:0]==16'h8)
	  	    plus_flag<= 1'b0;
	end	
	always @(posedge CLK or negedge rst_n)	begin	
	      if(!rst_n)
			begin
				delay_plus[7:0] <= 8'd0;
				Delay_plus<= 1'b0;
			end	  
			else if(delay_plus[7:0]==16'h8 && plus_flag == 1'b1)//延时时间
			begin
				delay_plus[7:0] <= 8'd0;
				Delay_plus<= 1'b1;
			end
			else if (plus_flag == 1'b1) begin
				Delay_plus<= 1'b0;
				delay_plus[7:0] <= delay_plus[7:0]+1'b1;
			end		
			else 	begin
				delay_plus[7:0] <= 8'd0;
				Delay_plus<= 1'b0;
			end	
		end       						  
endmodule

计数器延时参考波形在这里插入图片描述
计数器延时参考波形

  • 12
    点赞
  • 125
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 15
    评论
以下是一个基本的Verilog程序,用于实现路信号输入的delta-sigma脉冲量化调制: ``` module delta_sigma(input clk, input reset, input signed [15:0] in1, input signed [15:0] in2, input signed [15:0] in3, input signed [15:0] in4, output reg quantized_out); // 定义参数 parameter OSR = 128; // 过采样率 parameter ORDER = 2; // 阶数 parameter REF = 2.5; // 基准电压 parameter GAIN = (2**ORDER)/REF; // 增益 // 定义寄存 reg signed [ORDER:0] integrator1 = 0; reg signed [ORDER:0] integrator2 = 0; reg signed [ORDER:0] integrator3 = 0; reg signed [ORDER:0] integrator4 = 0; reg quantized = 0; // 定义计数 reg [6:0] counter = 0; // 定义比较 reg comparator_out = 0; always @(posedge clk) begin if (reset) begin integrator1 <= 0; integrator2 <= 0; integrator3 <= 0; integrator4 <= 0; quantized <= 0; counter <= 0; comparator_out <= 0; end else begin // 计算积分 integrator1 <= integrator1 + in1 - quantized*GAIN; integrator2 <= integrator2 + in2 - quantized*GAIN; integrator3 <= integrator3 + in3 - quantized*GAIN; integrator4 <= integrator4 + in4 - quantized*GAIN; // 过采样 if (counter == OSR-1) begin // 比较 if (integrator1 >= 0) comparator_out <= 1; else comparator_out <= 0; // 量化 if (comparator_out) quantized <= 1; else quantized <= -1; // 重置计数 counter <= 0; end else begin // 计数 counter <= counter + 1; end end end // 输出量化结果 assign quantized_out = quantized; endmodule ``` 这个程序定义了个输入信号(in1,in2,in3和in4)和一个输出信号(quantized_out)。程序使用两个积分和一个比较实现delta-sigma脉冲量化调制。在每个时钟周期内,程序将输入信号和量化输出信号的乘积减去积分的值,并将结果添加到积分中。程序还使用过采样技术来提高精度,并在每个周期结束时进行比较和量化。最终,量化结果被输出到quantized_out信号中。
评论 15
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Paul安

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值