OpenCores
URL https://opencores.org/ocsvn/blue/blue/trunk

Subversion Repositories blue

[/] [blue/] [trunk/] [blue8/] [txmit.v] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 wd5gnr
/*
2
    This file is part of Blue8.
3
 
4
    Foobar is free software: you can redistribute it and/or modify
5
    it under the terms of the GNU Lesser General Public License as published by
6
    the Free Software Foundation, either version 3 of the License, or
7
    (at your option) any later version.
8
 
9
    Foobar is distributed in the hope that it will be useful,
10
    but WITHOUT ANY WARRANTY; without even the implied warranty of
11
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12
    GNU Lesser General Public License for more details.
13
 
14
    You should have received a copy of the GNU Lesser General Public License
15
    along with Blue8.  If not, see <http://www.gnu.org/licenses/>.
16
 
17
    Blue8 by Al Williams alw@al-williams.com
18
 
19
*/
20
 
21
// Async transmitter -- Williams
22
`default_nettype none
23
 
24
module txmit (input wire clk,input wire clke,input wire rst,output reg sdo,input wire [7:0] din,
25
output reg tbre,output reg tsre,input write);
26
//input clk;            // system clock
27
//input clke;           // 16x baud rate clock enable
28
//input rst;     // reset
29
//output sdo;    // output data
30
//output tbre;   // transmit buffer empty
31
//output tsre;   // transmit shift reg. empty
32
//input [7:0] din;      // data bus in
33
//input write;  // load tbr
34
 
35
reg clk1x_enable;  // 1x clock enable flag (character in progress)
36
reg [7:0] tsr;     // shift register
37
reg [7:0] tbr;            // buffer register
38
 
39
reg[3:0] clkdiv;   // used to divide 16x clock to 1x clock
40
reg [3:0] no_bits_sent;  // track # of bits sent
41
reg clk1xe;        // 1x clock enable
42
 
43
always @(posedge clk or posedge rst)      // manage data coming in from the system
44
begin
45
  if (rst)
46
  begin
47
    tbre<=1'b1;
48
         clk1x_enable<=1'b0;
49
         tbr=8'b0;
50
  end
51
  else
52
  begin
53
    if (clk1xe)
54
         begin
55
      if (no_bits_sent == 4'b0010) tbre<=1'b1;            // at count 2, tbr is empty again
56
      else if (no_bits_sent==4'b1011)  clk1x_enable<=1'b0;    // done!
57
    end
58
  if (clke & no_bits_sent==4'b0000 & ~tbre) clk1x_enable<=1'b1;  // send buffered
59
  if (write & tbre)  // if writing and buffer is empty, start process
60
  begin
61
    clk1x_enable<=1'b1;  // start right away, unless already 1 at which point nop               
62
         tbre<=1'b0;
63
         tbr=din;
64
  end
65
  end
66
 end
67
 
68
 
69
always @(posedge clk or posedge rst)             // generate 1x rate clock
70
begin
71
if (rst)
72
  clkdiv = 4'b0;
73
else if (clke && clk1x_enable)
74
  clkdiv = clkdiv + 1;
75
else if (~clk1x_enable) clkdiv=4'b0;
76
end
77
 
78
always @(posedge clk or posedge rst)            // generate 1x clock enable
79
begin
80
 if (rst) clk1xe=1'b0;
81
 else
82
   if (clke & clk1x_enable & clkdiv==4'b0111) clk1xe=1'b1; else clk1xe=1'b0;
83
end
84
 
85
 
86
always @(posedge clk or posedge rst)    // main state machine
87
if (rst)
88
begin
89
sdo <= 1'b1;
90
tsre <= 1'b1;
91
tsr <= 9'b0;
92
end
93
  else if (clk1xe)
94
  begin
95
    if (no_bits_sent == 4'b0001)  // start, so load shift register
96
    begin
97
      tsr[7:0] <= tbr;
98
                sdo<=1'b0;   // start bit
99
      tsre <= 1'b0;
100
    end
101
    else if ((no_bits_sent >= 4'b0010) && (no_bits_sent <= 4'b1010))
102
    begin
103
      tsr[6:0] <= tsr[7:1];
104
      tsr[7] <= 1'b1;       // shift in stop bits
105
      sdo <= tsr[0];
106
           if (no_bits_sent==4'b1010) tsre<=1'b1;       // last bit, shift reg empty just stop bit
107
    end
108
end
109
 
110
always @(posedge clk or posedge rst)     // manage the # of bits sent
111
begin
112
  if (rst)
113
    no_bits_sent = 4'b0000;
114
  else if (clk1xe)
115
    begin
116
    if (no_bits_sent==4'b1011)
117
      no_bits_sent = 4'b0000;
118
    else
119
      no_bits_sent = no_bits_sent + 1;
120
    end
121
end
122
 
123
endmodule
124
 
125
 

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.