1. 概念
Peterson算法是一种实现互斥锁的并发程序设计方式,保证了两个进程真正实现互斥进入关键区域。
2. 方式
通过设置两个标志来达到互斥的目的。
3. verilog代码.
//peterson.v: Model of Peterson's algorithm for mutual exclusion of two processes.
typedef enum {L0, L1, L2, L3, L4, L5} loc;
module peterson(clock,select,pause);
input clock;
input select;
input pause;
reg interested[0:1];
reg [0:0] turn, self;
loc reg pc[0:1];
initial begin
pc[0] = L0; pc[1] = L0;
interested[0] = 0; interested[1] = 0;
turn = 0;
self = 0;
end
always @ (posedge clock) begin
self = select;
case (pc[self])
L0: if (!pause) pc[self] = L1; // noncritical section
L1: begin interested[self] = 1; pc[self] = L2; end
L2: begin turn = ~self; pc[self] = L3; end
L3: if (!interested[~self] || turn == self) pc[self] = L4;
L4: if (!pause) pc[self] = L5; // critical section
L5: begin interested[self] = 0; pc[self] = L0; end
endcase
end
endmodule // peterson
这里设置了turn和interested两个标签。前者是礼让标志,表明可以让对方进入关键区域;后者是期望标志,表明希望进入关键区域。
对peterson算法的一些规范检验见另一篇博客。