copied over old one which works with icarus
[debian/gnuradio] / usrp2 / fpga / control_lib / simple_uart_tx.v
1
2 module simple_uart_tx
3   #(parameter DEPTH=0)
4     (input clk, input rst, 
5      input [7:0] fifo_in, input fifo_write, output [7:0] fifo_level, output fifo_full, 
6      input [15:0] clkdiv, output baudclk, output reg tx);
7    
8    reg [15:0]     baud_ctr;
9    reg [3:0]      bit_ctr;
10    
11    wire           read, empty;
12    wire [7:0]     char_to_send;
13    
14    medfifo #(.WIDTH(8),.DEPTH(DEPTH)) fifo
15      (.clk(clk),.rst(rst),
16       .datain(fifo_in),.write(fifo_write),.full(fifo_full),
17       .dataout(char_to_send),.read(read),.empty(empty),
18       .clear(0),.space(fifo_level),.occupied() );
19    
20    always @(posedge clk)
21      if(rst)
22        baud_ctr <= 0;
23      else if (baud_ctr >= clkdiv)
24        baud_ctr <= 0;
25      else
26        baud_ctr <= baud_ctr + 1;
27
28    always @(posedge clk)
29      if(rst)
30        bit_ctr <= 0;
31      else if(baud_ctr == clkdiv)
32        if(bit_ctr == 9)
33          bit_ctr <= 0;
34        else if(bit_ctr != 0)
35          bit_ctr <= bit_ctr + 1;
36        else if(~empty)
37          bit_ctr <= 1;
38    
39    always @(posedge clk)
40      if(rst)
41        tx <= 1;
42      else
43        case(bit_ctr)
44          0 : tx <= 1;
45          1 : tx <= 0;
46          2 : tx <= char_to_send[0];
47          3 : tx <= char_to_send[1];
48          4 : tx <= char_to_send[2];
49          5 : tx <= char_to_send[3];
50          6 : tx <= char_to_send[4];
51          7 : tx <= char_to_send[5];
52          8 : tx <= char_to_send[6];
53          9 : tx <= char_to_send[7];
54          default : tx <= 1;
55        endcase // case(bit_ctr)
56
57    assign         read = (bit_ctr == 9) && (baud_ctr == clkdiv);
58    assign         baudclk = (baud_ctr == 1);  // Only for debug purposes
59    
60 endmodule // simple_uart_tx