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

一句话说明这个问题:

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

如下图所示,当输入发生一次握手之后,计数器的值就会加一。此时的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
相关推荐
荆白雪8 小时前
触摸按键控制LED
fpga开发
sz66cm14 小时前
FPGA基础 -- cocotb仿真之任务调度cocotb.start_soon与asyncio的使用注意事项
fpga开发
霖0016 小时前
ZYNQ裸机开发指南笔记
人工智能·经验分享·笔记·matlab·fpga开发·信号处理
tiantianuser16 小时前
NVMe高速传输之摆脱XDMA设计52: 上板资源占用率分析
fpga开发·nvme·pcie·xdma·高性能nvme
我爱C编程17 小时前
【仿真测试】基于FPGA的完整DQPSK通信链路实现,含频偏锁定,帧同步,定时点,Viterbi译码,信道,误码统计
fpga开发·帧同步·viterbi译码·dqpsk·频偏锁定·定时点
nnerddboy17 小时前
FPGA自学笔记(正点原子ZYNQ7020):2.IP核与组成
fpga开发
碰大点19 小时前
第8章 zynq uboot更新系统镜像并引导启动和个人心得
驱动开发·fpga开发·uboot·zynq
szxinmai主板定制专家20 小时前
基于ARM+FPGA的无人机数据采集卡,6通道24bit采集
arm开发·嵌入式硬件·fpga开发·无人机·能源
贝塔实验室21 小时前
QPSK信号载波同步技术---四相Costas 环法
数学建模·fpga开发·硬件工程·动态规划·信息与通信·信号处理·傅立叶分析
bnsarocket1 天前
Verilog和FPGA的自学笔记2——点亮LED
笔记·fpga开发·verilog·自学