Create list_ch08_03_uart_tx.v
diff --git a/verilog/rtl/list_ch08_03_uart_tx.v b/verilog/rtl/list_ch08_03_uart_tx.v
new file mode 100644
index 0000000..16e6dce
--- /dev/null
+++ b/verilog/rtl/list_ch08_03_uart_tx.v
@@ -0,0 +1,115 @@
+//Listing 8.3

+module uart_tx

+   #(

+     parameter DBIT = 8,     // # data bits

+               SB_TICK = 16  // # ticks for stop bits

+   )

+   (

+    input wire clk, reset,

+    input wire tx_start, s_tick,

+    input wire [7:0] din,

+    output reg tx_done_tick,

+    output wire tx

+   );

+

+   // 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;

+   reg tx_reg, tx_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;

+            tx_reg <= 1'b1;

+         end

+      else

+         begin

+            state_reg <= state_next;

+            s_reg <= s_next;

+            n_reg <= n_next;

+            b_reg <= b_next;

+            tx_reg <= tx_next;

+         end

+

+   // FSMD next-state logic & functional units

+   always @*

+   begin

+      state_next = state_reg;

+      tx_done_tick = 1'b0;

+      s_next = s_reg;

+      n_next = n_reg;

+      b_next = b_reg;

+      tx_next = tx_reg ;

+      case (state_reg)

+         idle:

+            begin

+               tx_next = 1'b1;

+               if (tx_start)

+                  begin

+                     state_next = start;

+                     s_next = 0;

+                     b_next = din;

+                  end

+            end

+         start:

+            begin

+               tx_next = 1'b0;

+               if (s_tick)

+                  if (s_reg==15)

+                     begin

+                        state_next = data;

+                        s_next = 0;

+                        n_next = 0;

+                     end

+                  else

+                     s_next = s_reg + 1;

+            end

+         data:

+            begin

+               tx_next = b_reg[0];

+               if (s_tick)

+                  if (s_reg==15)

+                     begin

+                        s_next = 0;

+                        b_next = b_reg >> 1;

+                        if (n_reg==(DBIT-1))

+                           state_next = stop ;

+                        else

+                           n_next = n_reg + 1;

+                     end

+                  else

+                     s_next = s_reg + 1;

+            end

+         stop:

+            begin

+               tx_next = 1'b1;

+               if (s_tick)

+                  if (s_reg==(SB_TICK-1))

+                     begin

+                        state_next = idle;

+                        tx_done_tick = 1'b1;

+                     end

+                  else

+                     s_next = s_reg + 1;

+            end

+      endcase

+   end

+   // output

+   assign tx = tx_reg;

+

+endmodule
\ No newline at end of file