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功能。