verilog 将多个周期的脉冲转换为单脉冲----边沿检测

当我们需要部分长短只对脉冲的个数进行计数时,可以使用这种方式

边沿检测分为上升沿检测和下降沿检测,这里主要介绍下降沿检测和仿真结果

`timescale 1ns / 1ps
//该模块给出当前memory 存储长维度的计数
module Nc_or_Ns_count(
        input sys_clk,
        input rst_n,
        input fft_out_valid,
        input [10:0] mode,         //计数总长度
        
        output [10:0] Ns_or_Nc     //计数结果
    );
    
    //上升沿检测,产生单脉冲
    wire pos;
    reg [1:0] data_in_buffer;    //移位寄存器
    always@(posedge sys_clk or negedge rst_n) begin
        if(!rst_n) 
            data_in_buffer<='d0;
        else
            data_in_buffer<={data_in_buffer[0],fft_out_valid};
    end
    //assign neg=data_in_buffer[1] & ~data_in_buffer[0];   //下降沿检测
    assign pos=~data_in_buffer[1] & data_in_buffer[0];//该信号的期望波形应该是每次有拉高的 
                                  //fft_out_valid长信号给出,该信号延迟一个周期给出单个脉冲
    
    reg [10:0] Ns_or_Nc_buffer;
   always@(posedge sys_clk or negedge rst_n) begin
        if(!rst_n)
            Ns_or_Nc_buffer<='d0;
        else if(pos) begin              //检测到单脉冲就计数
            Ns_or_Nc_buffer<=Ns_or_Nc_buffer+1'b1;
            if(Ns_or_Nc_buffer==mode-1)
                Ns_or_Nc_buffer<='dz;
        end
        else
            Ns_or_Nc_buffer<=Ns_or_Nc_buffer;        
   end
   assign Ns_or_Nc=Ns_or_Nc_buffer;
endmodule

testbench

`timescale 1ns / 1ps
module test_Nc_or_Ns_count();
    reg sys_clk;
    reg rst_n;
    reg fft_out_valid;
    reg [10:0] mode;
    
    wire [10:0] Ns_or_Nc;
    
    initial begin
        sys_clk='d0;
        rst_n='d0;
        fft_out_valid='d0;
        mode='d0;
        #1000;
        rst_n=1'b1;
        mode='d3;               //mode这个测试里给的很小
        
        #50;                    //用简陋的方式实现不同长度的长脉冲
        fft_out_valid<=1'b1;
        #100;
        fft_out_valid<=1'b0;
        #100;
        fft_out_valid<=1'b1;
        #120;
        fft_out_valid<=1'b0;
        #100;
        fft_out_valid<=1'b1;
        #140;
        fft_out_valid<=1'b0;
        
        
        #1000;
        $stop; 
    end
    always #10 sys_clk=~sys_clk;      //50MHz
    
    Nc_or_Ns_count u0(
        .sys_clk(sys_clk),
        .rst_n(rst_n),
        .fft_out_valid(fft_out_valid),
        .mode(mode),
        
        .Ns_or_Nc(Ns_or_Nc)
    );
    
    
endmodule

仿真结果:

 从仿真结果可以看出,在长脉冲出现之后,单脉冲会延迟一个时钟周期给出,而计数结果会延迟两个时钟周期,这一点需要注意。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Verilog的IRIG-B生成代码是一种能够产生IRIG-B时间信号的时钟生成器。IRIG-B是一种精密的时间标准,用于同步位于不同位置的设备。以秒为位的时间信息通过调制成脉冲的方式传送,每个脉冲代表一个时钟节拍。生成IRIG-B信号的时钟生成器可以将电子设备与IRIG-B时钟同步,从而保证设备间的精准协调。 IRIG-B生成代码由以下组成部分: 1. 时钟输入模块:处理从外部提供的时钟信号的输入,并在时钟边沿进行采样和同步。 2. 时钟分频模块:使用分频器来将输入的时钟信号分频为适当的频率。 3. 时间计数模块:以主频为参考,统计时钟节拍数。在达到指定秒数后,使用编码器将时间信息转换为IRIG-B脉冲信号。 4. 脉冲生成模块:组合布尔逻辑电路生成脉冲信号,用于表示秒数和分数。 5. 编码器模块:将时间信息转换为二进制编码,并将其调制成脉冲信号传输。IRIG-B信号由参考脉冲、秒脉冲、分脉冲等不同类型的脉冲信号组成,通过适当的时间分割来区分脉冲信号类型。 以上是Verilog的IRIG-B生成代码的主要组成部分,可以根据需要进行调整和优化。这种时钟生成器的用途非常广泛,被广泛应用于精密仪器、通信设备、电力系统等领域,可以提高系统的稳定性和可靠性。 ### 回答2: 首先,IRIG-B是一种广泛用于时间同步的协议,通常用于同步设备的精确时间。Verilog时序编程语言可以用于生成IRIG-B的信号,因为它可以使用内置的计数器和时钟模块来控制时序。 为了生成IRIG-B信号,我们需要将当前时间作为输入,使用Verilog的时钟和计数器模块计算出IRIG-B码,并输出到对应的端口上。IRIG-B格式通常以二进制形式表示,需要依据协议规范进行格式化和计算。其中,计算包含同步跳秒、分钟、小时、日期和年份。 此外,要生成IRIG-B信号,需要一个精确的时钟信号,通常是一个基于晶振的稳定时钟。设计时还需要考虑到时钟分频器的数量和分频比例以及计数器的位宽,以确保IRIG-B信号精度和稳定性。 总的来说,Verilog的IRIG-B生成代码需要考虑到多个因素,包括计时精度、时钟信号来源和计算规则等等。算法设计和代码实现需要考虑到细节问题,包括位宽、顺序、时序和格式等等,以确保IRIG-B信号准确无误。 ### 回答3: Verilog IRIG-B生成代码是一种在数字电路设计中使用的代码,它可以用于实现基于国际无线定时和调度协议(IRIG-B)标准的时钟和时间同步系统。IRIG-B是一种高精度、高可靠性的时间标准,通常用于各种应用中需要精确时间同步的场合,如电力系统、航空控制、铁路信号系统等。 Verilog IRIG-B生成代码包括时钟输入、输出信号、纠错码、同步信号等部分。在代码中需要设计一个时钟模块,该模块生成数量可配置的高频时钟。IRIG-B信号需要根据国际标准的规定进行生成,包括脉宽和频率等参数。在代码中还需要实现纠错码功能,以保证数据传输的正确性。此外,同步信号也需要根据IRIG-B标准生成,以确保时间同步的准确性。 Verilog IRIG-B生成代码使用灵活、可配置,并且具有可拓展性。可以根据具体应用场景进行参数配置,并可与其他代码模块进行组合使用,以实现各种复杂的数字电路设计。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值