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

一句话说明这个问题:

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

如下图所示,当输入发生一次握手之后,计数器的值就会加一。此时的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
相关推荐
ZYNQRFSOC4 小时前
基于XCKU5P纯逻辑 NVME测试
fpga开发
FPGA小迷弟9 小时前
使用FPGA开发高速AD/DA芯片的接口学习
fpga开发
stars-he10 小时前
FPGA学习笔记(6)逻辑设计小结与以太网发送前置
笔记·学习·fpga开发
燎原星火*10 小时前
FPGA 逻辑级数
fpga开发
175063319451 天前
Vivado Zynq7020 生成正弦波(查表法) + 行为级仿真
fpga开发
Terasic友晶科技1 天前
4-DE10-Nano的HDMI方块移动案例——I2C通信协议
fpga开发·i2c·hdmi·de10-nano·i2c通信协议
云雾J视界1 天前
FPGA在AI时代的角色重塑:硬件可重构性与异构计算的完美结合
fpga开发·边缘计算·gpu·vitis·ai推理·azure云·异构编程
s09071362 天前
FPGA中CIC设计注意事项
算法·fpga开发·cic滤波器
Aaron15882 天前
RFSOC+VU13P在无线信道模拟中的技术应用分析
数据结构·人工智能·算法·fpga开发·硬件架构·硬件工程·射频工程
碎碎思2 天前
BerkeleyLab Bedrock:为 FPGA 与加速计算打造的开源基石
fpga开发·开源