根据时钟周期来做判断,怎么理清逻辑,计数器的逻辑,握手

一句话说明这个问题:

计数器的值,就是第几次的输入的值,就是晚了一个时钟周期。

如下图所示,当输入发生一次握手之后,计数器的值就会加一。此时的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
相关推荐
步达硬件11 小时前
【FPGA】DP、HDMI、USB4、GPMI、eDP、LVDS等音视频协议及性能对比
fpga开发
-木槿昔年-1 天前
【米尔-安路MYD-YM90X创意秀】飞龙派学习和PS串口实践
学习·fpga开发
Aaron15881 天前
基于RFSOC+VU13P+GPU架构在雷达电子战的技术
人工智能·算法·fpga开发·架构·硬件工程·信号处理·基带工程
jifengzhiling1 天前
伺服驱动器中DSP与FPGA高效协同架构解析
fpga开发·foc电机控制
太爱学习了2 天前
FPGA图像处理之:图像畸变矫正原理及matlab与fpga实现
图像处理·matlab·fpga开发
技术性摸鱼2 天前
FPGA选型参数
fpga开发
FPGA_小田老师2 天前
ibert 7 Series GT:IBERT远近端(内外)环回测试
fpga开发·ibert·gt测试·近端pcs环回·近端pma环回·远端pcs环回·远端pma环回
尤老师FPGA2 天前
【无标题】
fpga开发
175063319453 天前
VIVADO VLA VIO 硬件调试 降采样
fpga开发
FPGA小迷弟3 天前
基于FPGA开发高速ADC/DAC芯片笔记
图像处理·fpga开发·数据采集·fpga·adc