自己写一个FB实现FIFO功能,相比系统提供的更加灵活方便。
这个只是初步实现了先入先出的功能,并没有进行充分的测试。
下面是信号定义
VAR varArray Word[Signed](0..15)
VAR varPointer Word[Signed]
VAR R_Push Bit
VAR R_Pop Bit
VAR R_TRIG_Push R_TRIG
VAR R_TRIG_Pop R_TRIG
VAR_OUTPUT FIFO_Full Bit
VAR_OUTPUT FIFO_Empty Bit
VAR_OUTPUT FIFO_Error Bit
VAR_INPUT Push Bit
VAR_INPUT Pop Bit
VAR_IN_OUT Data Word[Signed]
下面是逻辑代码
R_TRIG_Push(_CLK:= Push ,Q:= R_Push );
R_TRIG_Pop(_CLK:= Pop ,Q:= R_Pop );
IF R_Push AND NOT FIFO_Full THEN
varPointer:=varPointer+1;
varArray[varPointer]:=Data;
Data:=0;
END_IF;
IF R_Pop AND NOT FIFO_Empty THEN
Data :=varArray[varPointer];
varArray[varPointer]:=0;
varPointer:=varPointer-1;
END_IF;
FIFO_Full:=(varPointer>=15);
FIFO_Empty:=(varPointer<=0);
FIFO_Error:=(FIFO_Empty AND Pop) OR (FIFO_Full AND Push);