blob: 36fd60fdbe8aafc5b20cf44aebab6f941c72b224 [file] [log] [blame]
//Listing 8.1
module uart_rx
#(
parameter DBIT = 8, // # data bits
SB_TICK = 16 // # ticks for stop bits
)
(
input wire clk, reset,
input wire rx, s_tick,
output reg rx_done_tick,
output wire [7:0] dout
);
// symbolic state declaration
localparam [1:0]
idle = 2'b00,
start = 2'b01,
data = 2'b10,
stop = 2'b11;
// signal declaration
reg [1:0] state_reg, state_next;
reg [3:0] s_reg, s_next;
reg [2:0] n_reg, n_next;
reg [7:0] b_reg, b_next;
// body
// FSMD state & data registers
always @(posedge clk, posedge reset)
if (reset)
begin
state_reg <= idle;
s_reg <= 0;
n_reg <= 0;
b_reg <= 0;
end
else
begin
state_reg <= state_next;
s_reg <= s_next;
n_reg <= n_next;
b_reg <= b_next;
end
// FSMD next-state logic
always @*
begin
state_next = state_reg;
rx_done_tick = 1'b0;
s_next = s_reg;
n_next = n_reg;
b_next = b_reg;
case (state_reg)
idle:
if (~rx)
begin
state_next = start;
s_next = 0;
end
start:
if (s_tick)
if (s_reg==7)
begin
state_next = data;
s_next = 0;
n_next = 0;
end
else
s_next = s_reg + 1;
data:
if (s_tick)
if (s_reg==15)
begin
s_next = 0;
b_next = {rx, b_reg[7:1]};
if (n_reg==(DBIT-1))
state_next = stop ;
else
n_next = n_reg + 1;
end
else
s_next = s_reg + 1;
stop:
if (s_tick)
if (s_reg==(SB_TICK-1))
begin
state_next = idle;
rx_done_tick =1'b1;
end
else
s_next = s_reg + 1;
endcase
end
// output
assign dout = b_reg;
endmodule