verilog 将单周期脉冲扩展为多周期

本文介绍了如何使用Vivado 2019.1设计一个模块,将FFT IP核产生的单脉冲扩展为1024个时钟周期的脉冲。通过提供的Verilog代码,展示了如何根据输入模式信号动态调整脉冲长度,并在Modelsim 10.1环境下进行了仿真验证。测试结果显示,模块能够正确地扩展脉冲并生成相应的地址信号。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

例如最近在写有关vivado 2019.1 FFT  IP核有关的设计,IP核产生单脉冲的m_axis_data_tlast后需要将该单脉冲扩展为我需要的1024个时钟周期的脉冲,下面为例程与tb

软件 vivado 2019.1 modelsim 10.1

`timescale 1ns / 1ps
//该模块将输入的单周期脉冲m_axis_tdata_ulast扩展成1024个周期或者128周期的脉冲
module pulse_extend_1024_or_128
    (
        input sys_clk,
        input rst_n,
        input fft_out_last,
        input [10:0] mode,         //根据该输入产生1024/128周期脉冲,注意1024只需十位,这里 
                                                        //为11位位宽
        
        output fft_out_last_extended,     //扩展后的脉冲
        output [10:0] addr                //地址信号 该地址信号可以用来在RAM中读取数据
    );
   reg [10:0] addr_buffer;                //以最大上限为位宽+1
   reg fft_out_last_extended_buffer;
   always@(posedge sys_clk or negedge rst_n) begin
        if(!rst_n)
            addr_buffer<='d0;
        else if(fft_out_last_extended_buffer)         //这里是很妙的嵌套,妙在哪里我写的出 
                                                      //来,说不出来
            addr_buffer<=addr_buffer+1'b1;
            if(addr_buffer==mode-1)
                addr_buffer<='dz;        //避免出现一些地址乱入,这里将不需要的地址赋高阻态
   end 

   //valid
   always@(posedge sys_clk or negedge rst_n) begin
       if(!rst_n)
            fft_out_last_extended_buffer<='d0;
       else if(fft_out_last)                           //检测到单脉冲,就拉高
            fft_out_last_extended_buffer<=1'b1;
       else if(addr==mode-1)                           //扩展达到要求就拉低
            fft_out_last_extended_buffer<=1'b0;
       else
            fft_out_last_extended_buffer<=fft_out_last_extended_buffer;//其余保持
   end
   assign fft_out_last_extended=fft_out_last_extended_buffer;
   assign addr=addr_buffer;
endmodule

testbench 如下:

`timescale 1ns / 1ps
// 测试脉冲扩展模块功能正确性
module test_pulse_extend();
reg sys_clk;
reg rst_n;
reg fft_out_last;
reg [10:0] mode;

wire fft_out_last_extended;
wire [10:0] addr;

initial begin
    sys_clk=0;
    rst_n=0;
    fft_out_last=0;
    mode='d0;
    #1000
    rst_n=1;
    mode='d1024;             //产生1024长度的脉冲
    
    #40000
    $stop;
end

always #10 sys_clk=~sys_clk;   //50MHz

pulse_extend_1024_or_128 u0(
        .sys_clk(sys_clk),
        .rst_n(rst_n),
        .fft_out_last(fft_out_last),
        .mode(mode),
        
        .fft_out_last_extended(fft_out_last_extended),
        .addr(addr)
    );
//模拟一个m_axis_data_tlast 脉冲,单时钟周期
reg [3:0] count1;
always@(posedge sys_clk or negedge rst_n) begin
    if(!rst_n) begin
        count1<='d0;
        fft_out_last<='d0;
    end
    else if(count1<'d14) begin
        count1<=count1+1'b1;
        if(count1=='d8)           //计数为8拉高
            fft_out_last<='d1;
        else if(count1=='d9)      //计数为9拉低
            fft_out_last<='d0;
    end
    else begin
        count1<='dz;              //不需要的部分直接高阻态
        fft_out_last<='d0;
    end   
end
endmodule

仿真结果如下:

1、总体结果图:

 2、开头地址

 3、结尾地址

 欢迎评论区讨论!谢谢阅读

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值