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

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

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

1module uart_tx
2(
3    input           clock,          // 25 mhz
4    input           reset_n,
5    // Конфигурация
6    input   [11:0]  delay,          // 2604 -> 9600 bod
7    input           parity,         // Если 1, учитывать четность
8    // Ввод-вывод
9    input   [7:0]   in,
10    input           we,             // we=1 -> отсылка данных
11    output  reg     tx,             // Подключено к TX
12    output          ready           // Готовность к принятию данных IN
13);
14
15assign ready = (st == 1'b0);
16
17reg [ 1:0] st       = 1'b0;
18reg [11:0] timer    = 1'b0;
19reg [10:0] data     = 1'b0;
20reg [ 3:0] cnt      = 1'b0;
21
22always @(posedge clock)
23if (reset_n == 1'b0) begin tx <= 1'b1; end
24else case (st)
25
26    // IDLE
27    0: begin
28
29        cnt <= 10 + parity;
30
31        if (we) st <= 1;
32        if (we) data <= {1'b1, ~parity | ~^in, in, 1'b0};
33
34    end
35
36    // Один сдвиг вправо
37    1: begin
38
39        st    <= cnt == 0 ? 0 : 2;
40        tx    <= data[0];
41        data  <= data[10:1];
42        cnt   <= cnt - 1;
43        timer <= delay;
44
45    end
46
47    // Ожидание
48    2: begin if (timer == 2) begin st <= 1; end timer <= timer - 1'b1; end
49
50endcase
51
52endmodule