aboutsummaryrefslogtreecommitdiffstats
path: root/examples/icestick/rs232demo.v
blob: fc7a770c5df959f0276bd03252ed2415cc77ec04 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
module top (
	input  clk,
	input  RX,
	output TX,
	output reg LED1,
	output reg LED2,
	output reg LED3,
	output reg LED4,
	output reg LED5
);
	parameter integer BAUD_RATE = 9600;
	parameter integer CLOCK_FREQ_HZ = 12000000;
	localparam integer HALF_PERIOD = CLOCK_FREQ_HZ / (2 * BAUD_RATE);

	reg [9:0] buffer;
	reg buffer_valid;

	reg [$clog2(3*HALF_PERIOD):0] cycle_cnt;
	reg [3:0] bit_cnt = 0;
	reg [0:0] state = 0;

	always @(posedge clk) begin
		buffer_valid <= 0;
		case (state)
			0: begin
				if (!RX) begin
					cycle_cnt <= HALF_PERIOD;
					bit_cnt <= 0;
					state <= 1;
				end
			end
			1: begin
				if (cycle_cnt == 2*HALF_PERIOD) begin
					cycle_cnt <= 0;
					buffer[bit_cnt] <= RX;
					bit_cnt <= bit_cnt + 1;
					if (bit_cnt == 9) begin
						buffer_valid <= 1;
						state <= 0;
					end
				end else begin
					cycle_cnt <= cycle_cnt + 1;
				end
			end
		endcase
	end

	always @(posedge clk) begin
		if (buffer_valid) begin
			if (buffer[8:1] == "1") LED1 <= !LED1;
			if (buffer[8:1] == "2") LED2 <= !LED2;
			if (buffer[8:1] == "3") LED3 <= !LED3;
			if (buffer[8:1] == "4") LED4 <= !LED4;
			if (buffer[8:1] == "5") LED5 <= !LED5;
		end
	end

	assign TX = RX;
endmodule