1、 rst_n , data_in , /输入数据 data_out /输出数据 ); input clk ; input rst_n ; input 7:0 data_in ; output 7:0 data_out; reg 7:0 buffer1 255:0 ; /缓存区10 buffer2 255:0 ; /缓存区2 reg wr_flag ; /写标志, wr_flag = 0,写buffer1,wr_flag = 1,写buffer2 reg rd_flag ; /读标志, rd_flag = 0,读buffer2,wr_flag = 1,读buffer1 reg state ; /
2、状态机, 0:写1读2, 1:写2读1 ,状态转移和输出分开编码 reg 7:0 cnt; parameter state0=1b0; parameter state1=1b1; always (posedge clk or negedge rst_n) /状态转移 begin if(rst_n = 1b0) cnt = 0; else cnt = cnt + 1;end always (posedge clk or negedge rst_n) /状态转移 begin if(rst_n = 1b0) state = 1 else begin case(state) state0 : if(c
3、nt=8hff) state state1 : default : state endcase end end always (state ) /状态输出 case(state) state0 : begin wr_flag = 1 /写1 rd_flag = 1 /读2 end state1 : wr_flag = 1 /写2 rd_flag = 1 /读1 end default : endcase end always (posedge clk) begin case(wr_flag) 1b0 : buffer1cnt = data_in; /wr_flag = 0 ,写buffer1b
4、1 : buffer2cnt /wr_flag = 1 ,写buffer2 default : buffer1cnt = 8 buffer2cnt end endcase end always (posedge clk or negedge rst_n) begin if(rst_n = 1b0) data_out else begin case(rd_flag) 1b0 : data_out = buffer2cnt; /rd_flag = 0,读buffer2b1 := buffer1cnt; /rd_flag = 1,读buffer1 default :b0 ; endcase end
5、endendmoduleTB代码如下:timescale 100ns / 10nsmodule pingpang_tb_v; / Inputs reg clk ; reg rst_n ; reg 7:0 data_in; / Outputs wire 7: / Instantiate the Unit Under Test (UUT) pingpang uut ( .clk (clk ), .rst_n (rst_n ), .data_in (data_in ), .data_out(data_out) ); initial begin / Initialize Inputs clk = 0; rst_n = 0; data_in = 0; #100; rst_n = 1; always #10 clk = clk; always (posedge clk or negedge rst_n) if(rst_n = 1b0) data_in else data_in = data_in + 1 end 仿真波形如图:当state进行状态切换后,数据读写存储区域发生了变化,实现乒乓的操作。通过“输入数据选择单元”和“输出数据选择单元按节拍的切换,将经过缓冲的数据流没有停顿地送到“数据流运算处理模块”进行运算处理。
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1