【线性序列机-04】- 带请求保持计数优先的线性序列机
1. 功能介绍
在上一篇文章中,我们深入且细致地介绍了计数优先的线性序列机。这种线性序列机在大多数常见场景下是切实可行的,能够有效地实现相应的功能。然而,在某些特定的应用场景中,可能会出现这样的情况:当正在进行计数时,又有新的请求信号来临,这会导致新的请求被忽略和遗漏,而这种情况在某些对实时性和请求响应有严格要求的应用场景下,是完全不可接受的。为了解决这个问题,本文将着重详细介绍一种带有请求保持功能的计数优先的线性序列机。
这种改进后的线性序列机通过增加请求保持的机制,能够在计数过程中妥善处理新的请求,避免其被忽略,从而更好地满足那些对请求响应有着更高要求的应用场景,提供更稳定和可靠的性能。它可以确保在计数的同时,不会遗漏任何重要的请求,使得系统在各种复杂的情况下都能准确无误地运行。
2. 结构框图
3. 源码实现
module lsm_ctrl3 #(
parameter CW = 4 ,
parameter QW = 4
)(
input wire clk ,
input wire rstn ,
input wire req ,
input wire hold ,
output wire full ,
input wire [CW-1:0] cnt_in ,
output wire [CW-1:0] cnt_nxt ,
output reg [CW-1:0] cnt_cur ,
output wire cnt_eq0
);
reg [QW-1:0] req_cnt;
wire cnt_ne0 = |cnt_cur;
wire req_ne0 = |req_cnt;
wire req_max = &req_cnt;
wire req_all = req | (|req_cnt);
wire cnt_ena = ~hold & (req_all | cnt_ne0);
wire req_inc = req & cnt_ne0 & ~req_max;
wire req_dec = ~req & ~cnt_ne0 & req_ne0;
wire req_ena = req_inc | req_dec;
wire [QW-1:0] req_nxt = req_cnt + {{(QW-1){req_dec}}, req_dec | req_inc};
assign full = req_max;
assign cnt_eq0 = ~cnt_ne0;
assign cnt_nxt = cnt_ne0 ? cnt_cur - 1'b1 : {CW{req_all}} & cnt_in;
always @(posedge clk or negedge rstn)
begin
if(!rstn)
cnt_cur <= {CW{1'b0}};
else if(cnt_ena)
cnt_cur <= cnt_nxt;
end
always @(posedge clk or negedge rstn)
begin
if(!rstn)
req_cnt <= {QW{1'b0}};
else if(req_ena)
req_cnt <= req_nxt;
end
endmodule
4. 仿真结果
4.1 仿真顶层
module test_top;
reg clk;
reg rstn;
reg req;
reg hold;
reg [3:0] cnt_in;
initial begin
clk = 1'b0;
forever #5 clk = ~clk;
end
initial begin
rstn = 1'b0;
#1_001;
rstn = 1'b1;
end
lsm_ctrl3 #(.CW(4)) dut (
.clk (clk ),
.rstn (rstn ),
.req (req ),
.hold (hold ),
.full ( ),
.cnt_in (cnt_in ),
.cnt_nxt ( ),
.cnt_cur ( ),
.cnt_eq0 ( )
);
initial begin
req = 1'b0;
hold = 1'b0;
cnt_in = 4'd0;
#100_000;
for(integer i=0; i<16; i=i+1) begin
@(posedge clk) #1;
req = 1'b1;
cnt_in = i[3:0];
@(posedge clk) #1;
req = 1'b0;
#100_000;
end
for(integer i=0; i<3; i=i+1) begin
@(posedge clk) #1;
req = 1'b1;
cnt_in = 4'd12;
@(posedge clk) #1;
req = 1'b0;
repeat(3) @(posedge clk) #1;
end
#100_000;
$finish();
end
endmodule
4.2 仿真结果
- 单次请求,正常计数
- 重复请求,计数器持续之前的计数
从上图能够清楚地看到,在单次请求的情形之下,线性序列机能够稳定且正常地执行计数这一功能。而当面临多次请求的状况时,计数器不但会保持住之前正在进行的计数,而且还会准确地记录并妥善保存新到来的请求。在仅有单次请求出现的时候,它能够依据预先设定好的规则,顺利且流畅地完成整个计数过程,并输出与之相对应的结果。然而,在多次请求接连出现的情况下,由于其自身计数优先的固有特性,它并不会立刻响应新的请求从而改变当下的计数状态。而是会一直等到当前的计数完成之后,才会紧接着对新的请求做出快速响应。这种计数优先的特性带来了显著的优点。首先,它保证了时序的准确性和稳定性。无论外界环境如何变化,计数过程不受干扰,从而为系统提供了可靠的时间基准。其次,它有助于减少系统的不确定性和错误。由于计数的连续性,减少了因频繁切换任务而可能产生的错误和冲突。
5. 综合结果
在参数CW=4的情况下,以某90nm的数字标准单元库工艺综合的结果如下所示
5.1 面积
Number of ports: 26
Number of nets: 72
Number of cells: 58
Number of combinational cells: 45
Number of sequential cells: 11
Number of macros/black boxes: 0
Number of buf/inv: 13
Number of references: 21
Combinational area: 153.820804
Buf/Inv area: 27.518401
Noncombinational area: 149.587200
Macro/Black Box area: 0.000000
Net Interconnect area: undefined (No wire load specified)
Total cell area: 303.408005
Total area: undefined
5.2 功耗
Internal Switching Leakage Total
Power Group Power Power Power Power ( % ) Attrs
--------------------------------------------------------------------------------------------------
io_pad 0.0000 0.0000 0.0000 0.0000 ( 0.00%)
memory 0.0000 0.0000 0.0000 0.0000 ( 0.00%)
black_box 0.0000 0.0000 0.0000 0.0000 ( 0.00%)
clock_network 0.0000 0.0000 0.0000 0.0000 ( 0.00%)
register 0.0000 0.0000 0.0000 0.0000 ( 0.00%)
sequential 5.0326e-03 1.3693e-04 1.5704e+05 5.3265e-03 ( 53.29%)
combinational 2.7986e-03 1.7132e-03 1.5753e+05 4.6693e-03 ( 46.71%)
--------------------------------------------------------------------------------------------------
Total 7.8312e-03 mW 1.8501e-03 mW 3.1457e+05 pW 9.9958e-03 mW
5.3 时序
Point Incr Path
-----------------------------------------------------------
cnt_cur_reg_0_/CK (DFFRQXL) 0.00 0.00 r
cnt_cur_reg_0_/Q (DFFRQXL) 0.20 0.20 f
U32/Y (NOR2XL) 0.06 0.26 r
U33/Y (INVXL) 0.04 0.30 f
U28/Y (NOR2XL) 0.08 0.38 r
U34/Y (INVXL) 0.04 0.42 f
U30/Y (NOR2XL) 0.14 0.56 r
U62/Y (OAI21XL) 0.09 0.66 f
U66/Y (OAI22XL) 0.06 0.72 r
cnt_nxt[2] (out) 0.00 0.72 r
data arrival time 0.72
-----------------------------------------------------------
6. 总结
带请求保持计数优先的线性序列机是在前一篇计数优先的线性序列机基础上进行了优化和改进。它主要增强了在计数过程中能够接收和处理请求的能力。原本的计数优先线性序列机可能在计数期间无法响应新的请求,而带请求保持计数优先的线性序列机则解决了这个问题。这意味着即使在正在进行计数操作的时候,如果有新的请求到来,它也能够及时接收并记录下来,而不会忽略或丢失这些请求。这种改进使得线性序列机在实际应用中更加灵活和实用,能够更好地应对复杂的情况,提高了系统的整体性能和可靠性。