一句话说明这个问题:
计数器的值,就是第几次的输入的值,就是晚了一个时钟周期。
如下图所示,当输入发生一次握手之后,计数器的值就会加一。此时的1,是真的传输了一个数据包,这个1真的是数据包的数量。
有个问题,怎么保证是第1000个包产生一个int吧报文,因为还有一个归零的逻辑,所以说当counter的值第二次为零的时候,是标识上个时钟周期的时候,第1001个数据包已经输入了。
每1000次握手,产生一个信号的代码模板
// 现在暂定是1000个包,生成一个探测报文
wire [15 : 0 ] how_many_cycles_to_generate_has_int;
assign how_many_cycles_to_generate_has_int = 1000;
reg [15 : 0 ] packet_counter;
// 因为0计数到999是1000,所以计数器只需要循环计数从0到999就可以
always @(posedge clk) begin
if( rst || ( (packet_counter == how_many_cycles_to_generate_has_int -1 ) && (in_proto_hdr_valid & in_proto_hdr_ready) ) ) begin
packet_counter <= 0;
end
else if ((in_proto_hdr_valid & in_proto_hdr_ready)) begin
packet_counter <= packet_counter + 1;
end
else begin
packet_counter <= packet_counter;
end
end
reg has_int_reg;
always @(posedge clk) begin
if( rst ) begin
has_int_reg <= 0;
end
// 定的值是1000,那么在计数器到999的时候,就需要设置探测报文的标志位了,然后拉高的int字段会让下一级产生对应的int报文,用always@*,纯线网逻辑
// 虽然包头和has_int标志位同时到达,但是线网always@*会根据int=1实时改变生成的数据包
else if ( packet_counter == how_many_cycles_to_generate_has_int - 1 ) begin
has_int_reg <= 1;
end
else begin
has_int_reg <= 0;
end
end