基于三菱PLC ST语言的FIFO实现

自己写一个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);

  • 7
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是使用Verilog语言实现3x3矩阵的FIFO队列的代码示例: ```verilog module fifo_3x3_matrix ( input clk, // 时钟信号 input rst_n, // 复位信号,低电平有效 input wr_en, // 写使能信号 input [7:0] din, // 写入数据 input rd_en, // 读使能信号 output [7:0] dout // 读出数据 ); parameter WIDTH = 8; // 数据位宽 parameter SIZE = 9; // FIFO队列大小,即3x3矩阵元素个数 reg [WIDTH-1:0] fifo [SIZE-1:0]; // FIFO队列 reg wr_ptr, rd_ptr; // 写指针和读指针 // 写操作 always @(posedge clk) begin if (rst_n == 1'b0) begin wr_ptr <= 0; end else if (wr_en == 1'b1) begin fifo[wr_ptr] <= din; wr_ptr <= (wr_ptr == SIZE-1) ? 0 : wr_ptr+1; end end // 读操作 always @(posedge clk) begin if (rst_n == 1'b0) begin rd_ptr <= 0; end else if (rd_en == 1'b1) begin dout <= fifo[rd_ptr]; rd_ptr <= (rd_ptr == SIZE-1) ? 0 : rd_ptr+1; end end endmodule ``` 以上代码实现了一个带有读写指针的FIFO队列,可以存储8位宽的数据。在这个FIFO队列中,可以将9个元素按行优先顺序写入队列中,并逐个读取出来填充到3x3矩阵中。 下面是使用Verilog语言实现3x3矩阵的代码示例: ```verilog module matrix_3x3 ( input clk, // 时钟信号 input rst_n, // 复位信号,低电平有效 input [7:0] din, // 写入数据 input wr_en, // 写使能信号 input rd_en, // 读使能信号 output [7:0] dout // 读出数据 ); parameter WIDTH = 8; // 数据位宽 parameter SIZE = 9; // FIFO队列大小,即3x3矩阵元素个数 wire rd_en_fifo = (wr_en == 1'b1) ? 1'b1 : rd_en; // FIFO读使能信号 wire wr_en_fifo = (rd_en == 1'b1) ? 1'b1 : wr_en; // FIFO写使能信号 fifo_3x3_matrix fifo ( .clk(clk), .rst_n(rst_n), .din(din), .wr_en(wr_en_fifo), .rd_en(rd_en_fifo), .dout(dout) ); reg [WIDTH-1:0] matrix [2:0][2:0]; // 3x3矩阵 // 写操作 always @(posedge clk) begin if (rst_n == 1'b0) begin matrix[0][0] <= 8'h00; matrix[0][1] <= 8'h00; matrix[0][2] <= 8'h00; matrix[1][0] <= 8'h00; matrix[1][1] <= 8'h00; matrix[1][2] <= 8'h00; matrix[2][0] <= 8'h00; matrix[2][1] <= 8'h00; matrix[2][2] <= 8'h00; end else if (wr_en == 1'b1) begin case (fifo.rd_ptr) 0: matrix[0][0] <= din; 1: matrix[0][1] <= din; 2: matrix[0][2] <= din; 3: matrix[1][0] <= din; 4: matrix[1][1] <= din; 5: matrix[1][2] <= din; 6: matrix[2][0] <= din; 7: matrix[2][1] <= din; 8: matrix[2][2] <= din; endcase end end // 读操作 always @(posedge clk) begin if (rst_n == 1'b0) begin dout <= 8'h00; end else if (rd_en == 1'b1) begin case ({fifo.wr_ptr, fifo.rd_ptr}) 9'b000000000: dout <= matrix[0][0]; 9'b000000001: dout <= matrix[0][1]; 9'b000000010: dout <= matrix[0][2]; 9'b000000011: dout <= matrix[1][0]; 9'b000000100: dout <= matrix[1][1]; 9'b000000101: dout <= matrix[1][2]; 9'b000000110: dout <= matrix[2][0]; 9'b000000111: dout <= matrix[2][1]; 9'b000001000: dout <= matrix[2][2]; default: dout <= 8'h00; endcase end end endmodule ``` 以上代码实现了一个可以存储3x3矩阵的模块,其中使用了上面实现FIFO队列。在这个模块中,可以将9个元素按行优先顺序写入FIFO队列中,并逐个读取出来填充到3x3矩阵中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值