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

Subversion Repositories virtual_rs232_terminal_with_lvds_lcd

[/] [virtual_rs232_terminal_with_lvds_lcd/] [trunk/] [rtl/] [uart_tx.v] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 racerxdl
// RS-232 TX module
2
// (c) fpga4fun.com KNJN LLC - 2003, 2004, 2005, 2006
3
 
4
module async_transmitter(clk, TxD_start, TxD_data, TxD, TxD_busy);
5
input clk, TxD_start;
6
input [7:0] TxD_data;
7
output TxD, TxD_busy;
8
 
9
parameter ClkFrequency = 64000000;      // 64MHz
10
parameter Baud = 115200;
11
parameter RegisterInputData = 1;        // in RegisterInputData mode, the input doesn't have to stay valid while the character is been transmitted
12
 
13
// Baud generator
14
parameter BaudGeneratorAccWidth = 16;
15
reg [BaudGeneratorAccWidth:0] BaudGeneratorAcc;
16
 
17
wire [BaudGeneratorAccWidth:0] BaudGeneratorInc = ((Baud<<(BaudGeneratorAccWidth-4))+(ClkFrequency>>5))/(ClkFrequency>>4);
18
 
19
wire BaudTick = BaudGeneratorAcc[BaudGeneratorAccWidth];
20
wire TxD_busy;
21
always @(posedge clk) if(TxD_busy) BaudGeneratorAcc <= BaudGeneratorAcc[BaudGeneratorAccWidth-1:0] + BaudGeneratorInc;
22
 
23
// Transmitter state machine
24
reg [3:0] state;
25
wire TxD_ready = (state==0);
26
assign TxD_busy = ~TxD_ready;
27
 
28
reg [7:0] TxD_dataReg = 0;
29
always @(posedge clk) if(TxD_ready & TxD_start) TxD_dataReg <= TxD_data;
30
wire [7:0] TxD_dataD = RegisterInputData ? TxD_dataReg : TxD_data;
31
 
32
always @(posedge clk)
33
case(state)
34
        4'b0000: if(TxD_start) state <= 4'b0001;
35
        4'b0001: if(BaudTick) state <= 4'b0100;
36
        4'b0100: if(BaudTick) state <= 4'b1000;  // start
37
        4'b1000: if(BaudTick) state <= 4'b1001;  // bit 0
38
        4'b1001: if(BaudTick) state <= 4'b1010;  // bit 1
39
        4'b1010: if(BaudTick) state <= 4'b1011;  // bit 2
40
        4'b1011: if(BaudTick) state <= 4'b1100;  // bit 3
41
        4'b1100: if(BaudTick) state <= 4'b1101;  // bit 4
42
        4'b1101: if(BaudTick) state <= 4'b1110;  // bit 5
43
        4'b1110: if(BaudTick) state <= 4'b1111;  // bit 6
44
        4'b1111: if(BaudTick) state <= 4'b0010;  // bit 7
45
        4'b0010: if(BaudTick) state <= 4'b0011;  // stop1
46
        4'b0011: if(BaudTick) state <= 4'b0000;  // stop2
47
        default: if(BaudTick) state <= 4'b0000;
48
endcase
49
 
50
// Output mux
51
reg muxbit;
52
always @( * )
53
case(state[2:0])
54
        3'd0: muxbit <= TxD_dataD[0];
55
        3'd1: muxbit <= TxD_dataD[1];
56
        3'd2: muxbit <= TxD_dataD[2];
57
        3'd3: muxbit <= TxD_dataD[3];
58
        3'd4: muxbit <= TxD_dataD[4];
59
        3'd5: muxbit <= TxD_dataD[5];
60
        3'd6: muxbit <= TxD_dataD[6];
61
        3'd7: muxbit <= TxD_dataD[7];
62
endcase
63
 
64
// Put together the start, data and stop bits
65
reg TxD;
66
always @(posedge clk) TxD <= (state<4) | (state[3] & muxbit);  // register the output to make it glitch free
67
 
68
endmodule

powered by: WebSVN 2.1.0

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