RTL 设计中 信号Mask处理

RTL中遇到某个oneshot(单拍)采样信号,需要处理为每隔4个信号采样输出1个信号的功能。

原信号signal:周期为2cycle,高电平采样有效,有效宽度1cycle,占空比为50%。

要得到signal_mask信号:周期8cycle,高电平采样有效,有效1cycle,占空比1/8,要求signal_mask和signal时序对齐。

时序图参考↓

1,为了让输出的signal和signal_mask同时序,要使用signal信号Latch前的signal_pre信号来计数。(为保证信号稳定,以及后端时序分析,采样信号一般通过FF输出给后段模块使用)

2,以signal_pre为计数基准得到一个从1开始,最大值为4的循环计数器。

3,第一个基准信号不能被mask掉。

4,按照期望间隔数,得到mask信号,mask有效期间输出信号为无效态。

 代码参考↓

always @(posedge clk or negedge xrst) begin
    if(~xrst) begin 
        mask_cnt <= #1 4'h0;
    end
    else if (first_signal_pre) begin
        mask_cnt <= #1 4'h1;  //从第一个signal_pre开始计数
    end
    else if (~signal_pre) begin   //考虑signal_pre无效期间超过1cycle的情况
        mask_cnt <= #1 mask_cnt;  
    end
    else if (mask_cnt >= mask_cnt_max) begin //达到最大计数值,复位
        mask_cnt <= #1 4'h1;
    end
    else begin
        mask_cnt <= #1 mask_cnt + 4'h1;
end 

assign mask = mask_cnt[3];

always @(posedge clk or negedge xrst) begin
    if (~xrst) begin
        signal_mask <= #1 4'h0;
    end
    else if(first_signal_pre) bgein //第一个signal_pre保留,不mask
        signal_mask <= #1 4'h1;
    end
    else if (~mask) begin
        signal_mask <= #1 signal_pre;  //mask期间外的信号保留
    end
    else begin
        signal_mask <= #1 4'h0;
    end
end

always @(posedge clk or negedge xrst) begin
    if(~xrst) begin 
        signal <= #1 4'h0;
    end
    else begin
        signal <= #1 signal_pre; //signal 和signal_mask信号同时序输出
end     

上例代码中,调整mask_cnt中mask的取值,可实现1~max间的mask功能。

修改max值可以实现其他要求mask功能。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值