diff options
author | eb <eb@221aa14e-8319-0410-a670-987f0aec2ac5> | 2007-09-05 01:43:43 +0000 |
---|---|---|
committer | eb <eb@221aa14e-8319-0410-a670-987f0aec2ac5> | 2007-09-05 01:43:43 +0000 |
commit | 3872941ae16eab596f48429057b3490b256bce6d (patch) | |
tree | 0f5eddd6f0c7299878dca972412a1d3be76e91e5 /inband_lib/channel_demux.v | |
parent | 632d8e2dd3c961326f985add8d5d97db5ffcf314 (diff) | |
download | uhd-3872941ae16eab596f48429057b3490b256bce6d.tar.gz uhd-3872941ae16eab596f48429057b3490b256bce6d.tar.bz2 uhd-3872941ae16eab596f48429057b3490b256bce6d.zip |
Merged features/inband-usb r5224:6306 into trunk. This is work-in-progress on inband signaling for the USRP1.
git-svn-id: http://gnuradio.org/svn/gnuradio/trunk@6307 221aa14e-8319-0410-a670-987f0aec2ac5
Diffstat (limited to 'inband_lib/channel_demux.v')
-rw-r--r-- | inband_lib/channel_demux.v | 78 |
1 files changed, 78 insertions, 0 deletions
diff --git a/inband_lib/channel_demux.v b/inband_lib/channel_demux.v new file mode 100644 index 000000000..d46be9397 --- /dev/null +++ b/inband_lib/channel_demux.v @@ -0,0 +1,78 @@ +module channel_demux + #(parameter NUM_CHAN = 2, parameter CHAN_WIDTH = 2) ( //usb Side + input [31:0]usbdata_final, + input WR_final, + + // TX Side + input reset, + input txclk, + output reg [CHAN_WIDTH:0] WR_channel, + output reg [31:0] ram_data, + output reg [CHAN_WIDTH:0] WR_done_channel ); +/* Parse header and forward to ram */ + reg [2:0]reader_state; + reg [4:0]channel ; + reg [6:0]read_length ; + + // States + parameter IDLE = 3'd0; + parameter HEADER = 3'd1; + parameter WAIT = 3'd2; + parameter FORWARD = 3'd3; + + `define CHANNEL 20:16 + `define PKT_SIZE 127 + wire [4:0] true_channel; + assign true_channel = (usbdata_final[`CHANNEL] == 5'h1f) ? + NUM_CHAN : (usbdata_final[`CHANNEL]); + + always @(posedge txclk) + begin + if (reset) + begin + reader_state <= IDLE; + WR_channel <= 0; + WR_done_channel <= 0; + end + else + case (reader_state) + IDLE: begin + if (WR_final) + reader_state <= HEADER; + end + + // Store channel and forware header + HEADER: begin + channel <= true_channel; + WR_channel[true_channel] <= 1; + ram_data <= usbdata_final; + read_length <= 7'd0 ; + + reader_state <= WAIT; + end + + WAIT: begin + WR_channel[channel] <= 0; + + if (read_length == `PKT_SIZE) + reader_state <= IDLE; + else if (WR_final) + reader_state <= FORWARD; + end + + FORWARD: begin + WR_channel[channel] <= 1; + ram_data <= usbdata_final; + read_length <= read_length + 7'd1; + + reader_state <= WAIT; + end + + default: + begin + //error handling + reader_state <= IDLE; + end + endcase + end +endmodule |