§ Модуль передатчика

Пины:
  • clock — опорная частота
  • reset_n — если 0, то сброс
  • delay — период в тактах (25 мгц)
  • parity — если задан 0, то не проверять четность
  • in — данные для отправки
  • we — разрешение отправки
  • tx — исходящие данные UART
  • ready — если 1, то устройство готово к отправке

§ Код на верилоге

module uart_tx
(
    input           clock,          // 25 mhz
    input           reset_n,
    // Конфигурация
    input   [11:0]  delay,          // 2604 -> 9600 bod
    input           parity,         // Если 1, учитывать четность
    // Ввод-вывод
    input   [7:0]   in,
    input           we,             // we=1 -> отсылка данных
    output  reg     tx,             // Подключено к TX
    output          ready           // Готовность к принятию данных IN
);

assign ready = (st == 1'b0);

reg [ 1:0] st       = 1'b0;
reg [11:0] timer    = 1'b0;
reg [10:0] data     = 1'b0;
reg [ 3:0] cnt      = 1'b0;

always @(posedge clock)
if (reset_n == 1'b0) begin tx <= 1'b1; end
else case (st)

    // IDLE
    0: begin

        cnt <= 10 + parity;

        if (we) st <= 1;
        if (we) data <= {1'b1, ~parity | ~^in, in, 1'b0};

    end

    // Один сдвиг вправо
    1: begin

        st    <= cnt == 0 ? 0 : 2;
        tx    <= data[0];
        data  <= data[10:1];
        cnt   <= cnt - 1;
        timer <= delay;

    end

    // Ожидание
    2: begin if (timer == 2) begin st <= 1; end timer <= timer - 1'b1; end

endcase

endmodule