设计实例14-credit计算

该文讨论了如何在Verilog中通过计数器和阈值检查来控制上级模块的发包速率。模块通过一个名为`rdy`的信号限制发送速率,该信号基于一个内部计数器(`cnt`)和预设的阈值(3)。在收到`push`信号时增加计数,在`cack`信号时减少计数,并根据新的计数值与阈值比较来更新`rdy`信号。这种设计可以防止上级模块过快地向FIFO写入数据。
摘要由CSDN通过智能技术生成

问题:下级模块入口fifo的阈值是3,如何在上级模块计算rdy,限制上级模块的发包速度?

module top(
input clk,
input rst_n,
input cack,
input push,
output rdy 
);

reg[7:0]   credit_thr = 8'h3;
reg[7:0]   cnt, cnt_next;

always @(*) begin
    cnt_next = cnt;
    case({cack, push})
      2'b01: cnt_next = cnt + 1;
      2'b10: cnt_next = cnt - 1;
    endcase
end

always @(posedge clk, negedge rst_n) begin
    if(~rst_n) begin
        cnt <= 8'b0;
        cnt_next <= 8'b0;
        rdy <= 1'b0;
    end
    else begin
        cnt <= cnt_next;
        rdy <= (cnt_next < credit_thr);
    end
end

endmodule

另外合并写法:

module top(
input clk,
input rst_n,
input cack,
input push,
output rdy 
);

reg[7:0]   credit_thr = 8'h3;
reg[7:0]   cnt;


always @(posedge clk, negedge rst_n) begin
    if(~rst_n) begin
        cnt <= 8'b0;
        rdy <= 1'b0;
    end
    else begin
        case(cack, push)
          2'b00, 
          2'b11: begin
                   rdy <= (cnt < credit_thr);    
                 end
          2'b01: begin
                   cnt <= cnt + 1; //下一拍赋值
                   rdy <= ((cnt + 1) < credit_thr); //注意是在当拍计算rdy信号,cnt要加1
                 end
          2'b10: begin
                   cnt <= cnt - 1;
                   rdy <= ((cnt - 1) < credit_thr); 
                 end
        endcase
    end
end

endmodule
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值