例如最近在写有关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、结尾地址
欢迎评论区讨论!谢谢阅读