diff options
author | Matt Ettus <matt@ettus.com> | 2010-06-10 11:34:18 -0700 |
---|---|---|
committer | Matt Ettus <matt@ettus.com> | 2010-06-10 11:34:18 -0700 |
commit | 45e5589ed9c555c604fb66be9f314c02ff5fb9e4 (patch) | |
tree | 06ec12796d2f60d4e6a01ae97356817202e13262 /usrp2/fifo/fifo_short.v | |
parent | 8dbe0a6f5c4cb4d3d888d94287e788153762d14b (diff) | |
download | uhd-45e5589ed9c555c604fb66be9f314c02ff5fb9e4.tar.gz uhd-45e5589ed9c555c604fb66be9f314c02ff5fb9e4.tar.bz2 uhd-45e5589ed9c555c604fb66be9f314c02ff5fb9e4.zip |
first attempt at cleaning up the build system
Diffstat (limited to 'usrp2/fifo/fifo_short.v')
-rw-r--r-- | usrp2/fifo/fifo_short.v | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/usrp2/fifo/fifo_short.v b/usrp2/fifo/fifo_short.v new file mode 100644 index 000000000..53a7603c7 --- /dev/null +++ b/usrp2/fifo/fifo_short.v @@ -0,0 +1,95 @@ + +module fifo_short + #(parameter WIDTH=32) + (input clk, input reset, input clear, + input [WIDTH-1:0] datain, + input src_rdy_i, + output dst_rdy_o, + output [WIDTH-1:0] dataout, + output src_rdy_o, + input dst_rdy_i, + + output reg [4:0] space, + output reg [4:0] occupied); + + reg full, empty; + wire write = src_rdy_i & dst_rdy_o; + wire read = dst_rdy_i & src_rdy_o; + + assign dst_rdy_o = ~full; + assign src_rdy_o = ~empty; + + reg [3:0] a; + genvar i; + + generate + for (i=0;i<WIDTH;i=i+1) + begin : gen_srl16 + SRL16E + srl16e(.Q(dataout[i]), + .A0(a[0]),.A1(a[1]),.A2(a[2]),.A3(a[3]), + .CE(write),.CLK(clk),.D(datain[i])); + end + endgenerate + + always @(posedge clk) + if(reset) + begin + a <= 0; + empty <= 1; + full <= 0; + end + else if(clear) + begin + a <= 0; + empty <= 1; + full<= 0; + end + else if(read & ~write) + begin + full <= 0; + if(a==0) + empty <= 1; + else + a <= a - 1; + end + else if(write & ~read) + begin + empty <= 0; + if(~empty) + a <= a + 1; + if(a == 14) + full <= 1; + end + + // NOTE will fail if you write into a full fifo or read from an empty one + + ////////////////////////////////////////////////////////////// + // space and occupied are used for diagnostics, not + // guaranteed correct + + //assign space = full ? 0 : empty ? 16 : 15-a; + //assign occupied = empty ? 0 : full ? 16 : a+1; + + always @(posedge clk) + if(reset) + space <= 16; + else if(clear) + space <= 16; + else if(read & ~write) + space <= space + 1; + else if(write & ~read) + space <= space - 1; + + always @(posedge clk) + if(reset) + occupied <= 0; + else if(clear) + occupied <= 0; + else if(read & ~write) + occupied <= occupied - 1; + else if(write & ~read) + occupied <= occupied + 1; + +endmodule // fifo_short + |