基于Verilog的简单FIFO读写实验

一、模块框图及基本思路

 

fifo_ip:ISE生成的IP

fifo_control:在fifo未满情况下不断写入递增的四位数,每隔1s读出一个数据驱动Led显示

fifo_top:前两个模块的组合

二、软件部分

fifo_control:

 1 module fifo_control(
 2     clk,rst,
 3     Data_Out,
 4     din,wr_en,full,
 5     dout,rd_en,empty
 6     );
 7      input clk,rst;
 8      output[3:0] Data_Out;
 9      output [3:0] din;  //相对fifo来说是输入
10      input [3:0] dout;  //相对fifo来说是输出
11      output wr_en,rd_en;
12      input full,empty;
13      
14     
15     /****************定时部分*********************/
16     localparam T1S=50_000_000-1;
17     reg[31:0] Count_1s;
18     always @(posedge clk or posedge rst)
19     begin
20         if(rst)
21         begin
22             Count_1s<=32'd0;
23         end
24         else if(Count_1s==T1S)
25             Count_1s<=32'd0;
26         else if(!isCount)
27             Count_1s<=32'd0;
28         else Count_1s<=Count_1s+1'b1;
29     end
30     /*****************FIFO写入部分********************/
31     reg [1:0] i;
32     reg wr_en;
33     reg [3:0]din;
34     
35     always @(posedge clk or posedge rst)
36     if(rst)
37     begin
38         din<=16'd0;
39         i<=2'd0;
40         wr_en<=1'b0;
41     end
42     else if(!full)
43     case(i)
44         2'd0:begin din<=din+1'b1;i<=i+1'b1;wr_en<=1'b1;end
45         2'd1:begin i<=2'd0;wr_en<=1'b0;end
46     endcase
47     /*******************FIFO读出部分***************************/
48     reg[3:0] Data_Out_r;
49     wire [3:0] dout;
50     reg isCount;
51     reg [2:0]j;
52     reg rd_en;
53     
54     always @(posedge clk or posedge rst)
55     if(rst)
56     begin
57         Data_Out_r<=4'd0;
58         j<=3'd0;
59         isCount<=1'b0;
60         rd_en<=1'b0;
61     end
62     else if(!empty)
63     case(j)
64         3'd0:if(Count_1s==T1S) begin j<=j+1'b1;isCount<=1'b0;rd_en<=1'b1;  end
65                 else isCount<=1'b1;
66         3'd1:begin rd_en<=1'b0;j<=j+1'b1;end
67         3'd2:begin Data_Out_r<=dout;j<=3'd0; end
68     endcase
69     assign Data_Out=Data_Out_r;
70     
71     /****************************************************/
72      
73      
74 
75 
76 endmodule

fifo_top:

 1 module fifo_top(
 2     clk,RSTn,
 3     Data_Out
 4     );
 5      input clk,RSTn;
 6      output[3:0] Data_Out;
 7      
 8      wire [3:0]din;
 9      wire [3:0]dout;
10      wire wr_en,rd_en,full,empty;
11      
12      
13     /****************************************************/
14     fifo_ip U0 (
15   .clk(clk), // input clk
16   .rst(!RSTn), // input rst
17   .din(din), // input [3 : 0] din
18   .wr_en(wr_en), // input wr_en
19   .rd_en(rd_en), // input rd_en
20   .dout(dout), // output [3 : 0] dout
21   .full(full), // output full
22   .empty(empty) // output empty
23 );     
24     /*********************************************************/
25     fifo_control U1 (
26         .clk(clk), 
27         .rst(!RSTn), 
28         .Data_Out(Data_Out), 
29         .din(din), 
30         .wr_en(wr_en), 
31         .full(full), 
32         .dout(dout), 
33         .rd_en(rd_en), 
34         .empty(empty)
35     ); 
36 
37 
38 endmodule

三、硬件部分

黑金SPARTAN开发板

1 NET "clk" LOC = T8;
2 NET "RSTn" LOC = L3;
3 
4 NET "Data_Out[0]" LOC = P4;
5 NET "Data_Out[1]" LOC = N5;
6 NET "Data_Out[2]" LOC = P5;
7 NET "Data_Out[3]" LOC = M6;
原文地址:https://www.cnblogs.com/wt-seu/p/7450450.html