phobos1
Full Member level 2
- Joined
- Jan 18, 2010
- Messages
- 135
- Helped
- 15
- Reputation
- 30
- Reaction score
- 15
- Trophy points
- 1,298
- Location
- Salem, Tamil Nadu, India
- Activity points
- 2,112
module TX_fsm(
input clk,
input rst,
input baudclk,
input go,
input [7:0] data,
output reg TX
);
wire cclk;
BUFG UUT4 (.I(clk),.O(cclk));
parameter IDLE = 4'b0000,
START = 4'b0001,
BUSY = 4'b0010,
STOP1 = 4'b0011,
STOP2 = 4'b0100,
DONE = 4'b0101;
reg [3:0]state, next;
reg [7:0]temp;
always@(posedge cclk, negedge rst)
begin
if (!rst) begin
state <= IDLE;
TX <= 1'b0;
end
else
state <= next;
end
always@(state, data)
begin
TX = 1'b0;
next = 4'bx;
case (state)
IDLE : begin
TX = 1'b1;
if (!go)
next = IDLE;
else
next = START;
end
START : begin
if (baudclk)
TX = 1'b0;
temp[7:0] = data[7:0];
next = BUSY;
end
BUSY : begin
if (baudclk)
TX = temp[7];
temp[7:0] = {temp[7:0],1'b0};
if (temp[7:0] == 8'b0)
next = STOP1;
else
next = BUSY;
end
STOP1 : begin
if (baudclk)
TX = 1'b1;
next = STOP2;
end
STOP2 : begin
if (baudclk)
TX = 1'b1;
next = DONE;
end
DONE : next = IDLE;
endcase
end
endmodule
input clk,
input rst,
input baudclk,
input go,
input [7:0] data,
output reg TX
);
wire cclk;
BUFG UUT4 (.I(clk),.O(cclk));
parameter IDLE = 4'b0000,
START = 4'b0001,
BUSY = 4'b0010,
STOP1 = 4'b0011,
STOP2 = 4'b0100,
DONE = 4'b0101;
reg [3:0]state, next;
reg [7:0]temp;
always@(posedge cclk, negedge rst)
begin
if (!rst) begin
state <= IDLE;
TX <= 1'b0;
end
else
state <= next;
end
always@(state, data)
begin
TX = 1'b0;
next = 4'bx;
case (state)
IDLE : begin
TX = 1'b1;
if (!go)
next = IDLE;
else
next = START;
end
START : begin
if (baudclk)
TX = 1'b0;
temp[7:0] = data[7:0];
next = BUSY;
end
BUSY : begin
if (baudclk)
TX = temp[7];
temp[7:0] = {temp[7:0],1'b0};
if (temp[7:0] == 8'b0)
next = STOP1;
else
next = BUSY;
end
STOP1 : begin
if (baudclk)
TX = 1'b1;
next = STOP2;
end
STOP2 : begin
if (baudclk)
TX = 1'b1;
next = DONE;
end
DONE : next = IDLE;
endcase
end
endmodule