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

一句话说明这个问题:

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

如下图所示,当输入发生一次握手之后,计数器的值就会加一。此时的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
相关推荐
星夜离尘5610 小时前
PWM 信号生成与呼吸灯:占空比控制、按键调光与舵机扩展(附完整 Verilog 实操)
fpga开发
zlinear数据采集卡14 小时前
ZLinear DABM-D223 通信协议与软件开发全解析:从 USB CDC 到 DDS 波形输出
arm开发·嵌入式硬件·fpga开发·开源
LCMICRO-1331084774618 小时前
国产长芯微LD3092完全pin-pin替代LT3092,是一款可编程两端电流源
arm开发·单片机·嵌入式硬件·fpga开发·硬件工程·恒流源·lt3092
nuoxin11419 小时前
BL-M8812CU3 无线 WiFi 模块-富利威
人工智能·嵌入式硬件·fpga开发·硬件工程·dsp开发
xiaojiaohuazi1 天前
基于Zynq UltraScale+ MPSoC的PL DDR4直写多NVMe条带阵列(RAID 0)与exFAT高速采集存储系统
fpga开发
ALINX技术博客1 天前
【黑金云课堂】FPGA技术教程Vitis开发:AXI总线
fpga开发·vitis
星夜离尘561 天前
UART 串口通信:从帧格式到收发回显(附完整 Verilog 实操)
fpga开发
仲南音2 天前
Xilinx FPGA—— DDR4读写
fpga开发
思尔芯S2C2 天前
思尔芯RCF RTL自动分割工具,助力大规模AI/HPC芯片原型验证
人工智能·fpga开发·内存模型·自动编译·ddr5·prototyping·原型验证
Terasic友晶科技2 天前
答疑解惑|Agilex 3 FPGA QSPI时钟设置注意事项
fpga开发·de23-lite·terasic·qspi flash