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

verilog 将单周期脉冲扩展为多周期 例如最近在写有关vivado 2019.1 FFT IP核有关的设计IP核产生单脉冲的m_axis_data_tlast后需要将该单脉冲扩展为我需要的1024个时钟周期的脉冲下面为例程与tb软件 vivado 2019.1 modelsim 10.1timescale 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_bufferd0; else if(fft_out_last_extended_buffer) //这里是很妙的嵌套妙在哪里我写的出 //来说不出来 addr_bufferaddr_buffer1b1; if(addr_buffermode-1) addr_bufferdz; //避免出现一些地址乱入这里将不需要的地址赋高阻态 end //valid always(posedge sys_clk or negedge rst_n) begin if(!rst_n) fft_out_last_extended_bufferd0; else if(fft_out_last) //检测到单脉冲就拉高 fft_out_last_extended_buffer1b1; else if(addrmode-1) //扩展达到要求就拉低 fft_out_last_extended_buffer1b0; else fft_out_last_extended_bufferfft_out_last_extended_buffer;//其余保持 end assign fft_out_last_extendedfft_out_last_extended_buffer; assign addraddr_buffer; endmoduletestbench 如下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_clk0; rst_n0; fft_out_last0; moded0; #1000 rst_n1; moded1024; //产生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 count1d0; fft_out_lastd0; end else if(count1d14) begin count1count11b1; if(count1d8) //计数为8拉高 fft_out_lastd1; else if(count1d9) //计数为9拉低 fft_out_lastd0; end else begin count1dz; //不需要的部分直接高阻态 fft_out_lastd0; end end endmodule仿真结果如下1、总体结果图2、开头地址3、结尾地址欢迎评论区讨论谢谢阅读