§ Верхний уровень
1serial SERIAL(
2
3 .clk12 (),
4 .rx (),
5 .rx_byte (),
6 .rx_ready ()
7);
§ Код модуля
- Модуль приёмопередатчика UART (FTDI Marsohod)
- Скорость: 460800 бод, эквивалентно 51200 байт в секунду (50 кб в секунду)
- Длина: 1 старт бит + 8 бит (байт) + 1 (бит чётности)
1module serial(
2 input wire clk12,
3 input wire rx,
4 output reg [7:0] rx_byte,
5 output wire rx_ready
6);
7
8
9parameter R_COUNT = 26;
10
11reg [8:0] rc_data;
12reg [1:0] latch;
13reg [6:0] period = 1'b0;
14reg [3:0] num_bits = 1'b0;
15reg [1:0] flg = 1'b0;
16reg waiting = 1'b1;
17
18
19assign rx_ready = (flg == 2'b10);
20
21
22always @(posedge clk12) latch <= {latch[0], rx};
23
24
25wire eof = (period == R_COUNT-1 && num_bits == 4'd9);
26
27
28
29
30
31
32always @(posedge clk12) begin
33
34
35
36 if (waiting && latch[1:0] == 2'b10) begin
37 waiting <= 1'b0;
38
39 end
40
41
42 else if (!waiting) begin
43
44
45 if (period == R_COUNT-1) begin
46
47 period <= 1'b0;
48
49
50 if (num_bits == 4'd9) begin
51
52 waiting <= 1'b1;
53 num_bits <= 1'b0;
54 rx_byte <= rc_data[7:0];
55
56
57 end else num_bits <= num_bits + 1'b1;
58
59 end
60 else begin
61
62
63 if (period == R_COUNT / 2) rc_data <= {latch[1], rc_data[8:1]};
64
65
66 period <= period + 1'b1;
67
68 end
69
70 end
71
72
73 flg <= {flg[0], eof};
74
75end
76
77endmodule