@@ -10,7 +10,9 @@ entity lin_controller is
10
10
tx : out STD_LOGIC ;
11
11
data_in : in STD_LOGIC_VECTOR (63 downto 0 );
12
12
data_out : out STD_LOGIC_VECTOR (63 downto 0 );
13
- data_valid : out STD_LOGIC
13
+ data_valid : out STD_LOGIC ;
14
+ sync : in STD_LOGIC ;
15
+ bit_time : in STD_LOGIC_VECTOR (15 downto 0 )
14
16
);
15
17
end lin_controller ;
16
18
@@ -25,11 +27,9 @@ architecture Behavioral of lin_controller is
25
27
signal checksum : STD_LOGIC_VECTOR (7 downto 0 ) := (others => '0' );
26
28
27
29
constant SYNC_BYTE : STD_LOGIC_VECTOR (7 downto 0 ) := x"55" ;
28
- constant BIT_TIME : integer := 50 ; -- Assuming 20kbps LIN speed with 1MHz clock
29
30
30
31
begin
31
32
process (clk, rst)
32
- variable bit_time_counter : integer range 0 to BIT_TIME- 1 := 0 ;
33
33
begin
34
34
if rst = '1' then
35
35
state <= IDLE;
@@ -41,83 +41,62 @@ begin
41
41
checksum <= (others => '0' );
42
42
tx <= '1' ;
43
43
data_valid <= '0' ;
44
- elsif rising_edge (clk) then
44
+ elsif rising_edge (clk) and sync = '1' then
45
45
case state is
46
46
when IDLE =>
47
47
tx <= '1' ;
48
48
if rx = '0' then -- Start bit detected
49
49
state <= SYNC;
50
50
bit_counter <= 0 ;
51
- bit_time_counter := 0 ;
52
51
end if ;
53
52
54
53
when SYNC =>
55
- if bit_time_counter = BIT_TIME- 1 then
56
- bit_time_counter := 0 ;
57
- if bit_counter < 8 then
58
- shift_reg <= shift_reg(6 downto 0 ) & rx;
59
- bit_counter <= bit_counter + 1 ;
54
+ if bit_counter < 8 then
55
+ shift_reg <= shift_reg(6 downto 0 ) & rx;
56
+ bit_counter <= bit_counter + 1 ;
57
+ else
58
+ if shift_reg = SYNC_BYTE then
59
+ state <= IDENTIFIER;
60
+ bit_counter <= 0 ;
60
61
else
61
- if shift_reg = SYNC_BYTE then
62
- state <= IDENTIFIER;
63
- bit_counter <= 0 ;
64
- else
65
- state <= IDLE;
66
- end if ;
62
+ state <= IDLE;
67
63
end if ;
68
- else
69
- bit_time_counter := bit_time_counter + 1 ;
70
64
end if ;
71
65
72
66
when IDENTIFIER =>
73
- if bit_time_counter = BIT_TIME- 1 then
74
- bit_time_counter := 0 ;
75
- if bit_counter < 6 then
76
- identifier <= identifier(4 downto 0 ) & rx;
77
- bit_counter <= bit_counter + 1 ;
78
- else
79
- state <= DATA;
80
- bit_counter <= 0 ;
81
- byte_counter <= 0 ;
82
- end if ;
67
+ if bit_counter < 6 then
68
+ identifier <= identifier(4 downto 0 ) & rx;
69
+ bit_counter <= bit_counter + 1 ;
83
70
else
84
- bit_time_counter := bit_time_counter + 1 ;
71
+ state <= DATA;
72
+ bit_counter <= 0 ;
73
+ byte_counter <= 0 ;
85
74
end if ;
86
75
87
76
when DATA =>
88
- if bit_time_counter = BIT_TIME- 1 then
89
- bit_time_counter := 0 ;
90
- if bit_counter < 8 then
91
- shift_reg <= shift_reg(6 downto 0 ) & rx;
92
- bit_counter <= bit_counter + 1 ;
93
- else
94
- data_buffer((7 - byte_counter)* 8 + 7 downto (7 - byte_counter)* 8 ) <= shift_reg;
95
- byte_counter <= byte_counter + 1 ;
96
- bit_counter <= 0 ;
97
- if byte_counter = 7 then
98
- state <= CHECKSUM;
99
- end if ;
100
- end if ;
77
+ if bit_counter < 8 then
78
+ shift_reg <= shift_reg(6 downto 0 ) & rx;
79
+ bit_counter <= bit_counter + 1 ;
101
80
else
102
- bit_time_counter := bit_time_counter + 1 ;
81
+ data_buffer((7 - byte_counter)* 8 + 7 downto (7 - byte_counter)* 8 ) <= shift_reg;
82
+ byte_counter <= byte_counter + 1 ;
83
+ bit_counter <= 0 ;
84
+ if byte_counter = 7 then
85
+ state <= CHECKSUM;
86
+ end if ;
103
87
end if ;
104
88
105
89
when CHECKSUM =>
106
- if bit_time_counter = BIT_TIME- 1 then
107
- bit_time_counter := 0 ;
108
- if bit_counter < 8 then
109
- checksum <= checksum(6 downto 0 ) & rx;
110
- bit_counter <= bit_counter + 1 ;
111
- else
112
- -- Verify checksum (simplified)
113
- if checksum = x"AA" then -- Example checksum
114
- data_out <= data_buffer;
115
- data_valid <= '1' ;
116
- end if ;
117
- state <= IDLE;
118
- end if ;
90
+ if bit_counter < 8 then
91
+ checksum <= checksum(6 downto 0 ) & rx;
92
+ bit_counter <= bit_counter + 1 ;
119
93
else
120
- bit_time_counter := bit_time_counter + 1 ;
94
+ -- Verify checksum (simplified)
95
+ if checksum = x"AA" then -- Example checksum
96
+ data_out <= data_buffer;
97
+ data_valid <= '1' ;
98
+ end if ;
99
+ state <= IDLE;
121
100
end if ;
122
101
end case ;
123
102
end if ;
0 commit comments