Simple Remote Control

OP #3435302
Rate this post
• ▲ useful
▼ not useful
Hey guys. I'm new to this forum and new to VHDL. I'm trying to create a 
simple remote control with three inputs Nex, Prev and Number and two 
outputs
Channel (0-9)which has the same value as Number and Video which is 
asserted when Number is "0000". The code that I've written compiles that 
problem is that it's not giving me a right answer. Please can someone 
help me find the error in my logic?

Code (includes test bench):
1
library ieee;
2
use ieee.std_logic_1164.all;
3
use ieee.std_logic_arith.all;
4
use ieee.std_logic_unsigned.all;
5

6
entity remote is
7
  port( nex,clock,prev: in std_logic;
8
        number: in std_logic_vector(3 downto 0);
9
        video: out std_logic;
10
        channel: out std_logic_vector(3 downto 0));
11
end entity;
12

13
architecture arch of remote is
14
  signal chan:std_logic_vector (3 downto 0):=(others=>'0');
15
  signal vid:std_logic;
16
  type state is(S0,S1,S2,S3,S4,S5,S6,S7,S8,S9);
17
  signal current_state, next_state: state:=S0;
18
  begin
19
    process(nex,prev,number)
20
      begin
21
        if(nex='1' or prev='1') then
22
    case current_state is
23
    when S0=>
24
      if(nex='1' and prev='0')
25
      then  next_state<=S1;
26
            vid<='0';
27
            chan<="0001";
28
      elsif(nex='0' and prev='1')
29
      then  next_state<=S9;
30
            vid<='0';
31
            chan<="1001";
32
      elsif(nex='1' and prev='1')
33
      then  next_state<=S0;
34
            vid<='1';
35
            chan<="0000";
36
    end if;
37
    
38
    when S1=>
39
      if(nex='1' and prev='0')
40
      then  next_state<=S2;
41
            vid<='0';
42
            chan<="0010";
43
      elsif(nex='0' and prev='1')
44
      then  next_state<=S0;
45
            vid<='1';
46
            chan<="0000";
47
      elsif(nex='1' and prev='1')
48
      then  next_state<=S1;
49
            vid<='0';
50
            chan<="0001";
51
    end if;
52
    
53
    when S2=>
54
      if(nex='1' and prev='0')
55
      then  next_state<=S3;
56
            vid<='0';
57
            chan<="0011";
58
      elsif(nex='0' and prev='1')
59
      then  next_state<=S1;
60
            vid<='0';
61
            chan<="0001";
62
      elsif(nex='1' and prev='1')
63
      then  next_state<=S2;
64
            vid<='0';
65
            chan<="0010";
66
    end if;
67
    
68
    when S3=>
69
      if(nex='1' and prev='1')
70
      then  next_state<=S4;
71
            vid<='0';
72
            chan<="0100";
73
      elsif(nex='0' and prev='1')
74
      then  next_state<=S2;
75
            vid<='0';
76
            chan<="0010";
77
      elsif(nex='1' and prev='1')
78
      then  next_state<=S3;
79
            vid<='0';
80
            chan<="0011";
81
    end if;
82
    
83
    when S4=>
84
      if(nex='1' and prev='0')
85
      then  next_state<=S5;
86
            vid<='0';
87
            chan<="0101";
88
      elsif(nex='0' and prev='1')
89
      then  next_state<=S3;
90
            vid<='0';
91
            chan<="0011";
92
      elsif(nex='1' and prev='1')
93
      then  next_state<=S4;
94
            vid<='0';
95
            chan<="0100";
96
    end if;
97
    
98
    when S5=>
99
      if(nex='1' and prev='0')
100
      then  next_state<=S6;
101
            vid<='0';
102
            chan<="0110";
103
      elsif(nex='0' and prev='1')
104
      then  next_state<=S4;
105
            vid<='0';
106
            chan<="0100";
107
      elsif(nex='1' and prev='1')
108
      then  next_state<=S5;
109
            vid<='0';
110
            chan<="0101";
111
    end if;
112
    
113
    when S6=>
114
      if(nex='1' and prev='0')
115
      then  next_state<=S7;
116
            vid<='0';
117
            chan<="0111";
118
      elsif(nex='0' and prev='1')
119
      then  next_state<=S5;
120
            vid<='0';
121
            chan<="0101";
122
      elsif(nex='1' and prev='1')
123
      then  next_state<=S6;
124
            vid<='0';
125
            chan<="0110";
126
    end if;
127
    
128
    when S7=>
129
      if(nex='1' and prev='0')
130
      then  next_state<=S8;
131
            vid<='0';
132
            chan<="1000";
133
      elsif(nex='0' and prev='1')
134
      then  next_state<=S6;
135
            vid<='0';
136
            chan<="0110";
137
      elsif(nex='1' and prev='1')
138
      then  next_state<=S7;
139
            vid<='0';
140
            chan<="0111";
141
    end if;
142
    
143
    when S8=>
144
      if(nex='1' and prev='0')
145
      then  next_state<=S9;
146
            vid<='0';
147
            chan<="1001";
148
      elsif(nex='0' and prev='1')
149
      then  next_state<=S7;
150
            vid<='0';
151
            chan<="0111";
152
      elsif(nex='1' and prev='1')
153
      then  next_state<=S8;
154
            vid<='0';
155
            chan<="1000";
156
    end if;
157
    
158
    when S9=>
159
      if(nex='1' and prev='0')
160
      then  next_state<=S0;
161
            vid<='1';
162
            chan<="0000";
163
      elsif(nex='0' and prev='1')
164
      then  next_state<=S8;
165
            vid<='0';
166
            chan<="1000";
167
      elsif(nex='1' and prev='1')
168
      then  next_state<=S9;
169
            vid<='0';
170
            chan<="1001";
171
    end if;
172
end case;
173
else
174
  case number is
175
    
176
    when "0000"=>
177
      next_state<=S0;
178
      vid<='1';
179
      chan<="0000";
180
    
181
    when "0001"=>
182
      next_state<=S1;
183
      vid<='0';
184
      chan<="0001";
185
    
186
    when "0010"=>
187
      next_state<=S2;
188
      vid<='0';
189
      chan<="0010";
190

191
    when "0011"=>
192
      next_state<=S3;
193
      vid<='0';
194
      chan<="0011";
195

196
    when "0100"=>
197
      next_state<=S4;
198
      vid<='0';
199
      chan<="0100";
200

201
    when "0101"=>
202
      next_state<=S5;
203
      vid<='0';
204
      chan<="0101";
205

206
    when "0110"=>
207
      next_state<=S6;
208
      vid<='0';
209
      chan<="0110";
210

211
    when "0111"=>
212
      next_state<=S7;
213
      vid<='0';
214
      chan<="0111";
215

216
    when "1000"=>
217
      next_state<=S8;
218
      vid<='0';
219
      chan<="1000";
220
      
221
    when "1001"=>
222
      next_state<=S9;
223
      vid<='0';
224
      chan<="1001";
225
    when others=>
226
      next_state<=S0;
227
      vid<='1';
228
      chan<="0000";
229
      
230
      
231
      end case;
232
end if;
233

234
end process;
235

236
SEQ: process(clock)
237
begin
238
if clock'event and clock = '1' then
239
current_state <= next_state;
240
video<=vid;
241
channel<=chan;
242
end if;
243
end process SEQ;
244

245
end arch;
246

247
------------------------------------------------   
248
test bench:
249

250
library ieee;
251
use ieee.std_logic_1164.all;
252
use ieee.std_logic_arith.all;
253
use ieee.std_logic_unsigned.all;
254

255
entity testbench is
256
end testbench;
257

258
architecture testbench of testbench is 
259

260
component remote port(nex,clock,prev: in std_logic;
261
        number: in std_logic_vector(3 downto 0);
262
        video: out std_logic;
263
        channel: out std_logic_vector(3 downto 0));
264
end component;
265

266
signal nex : std_logic := '0';
267
signal prev : std_logic := '0';
268
signal clock : std_logic := '0';
269
signal number : std_logic_vector(3 downto 0) := "0000";
270
signal video : std_logic;
271
signal channel : std_logic_vector(3 downto 0);
272

273
begin
274
  
275
  UUT: remote port map (nex => nex, prev => prev, clock => clock, number => number, video => video, channel => channel);
276
    process 
277
      begin
278
        Clock <= '0' ; wait for 20 ns;
279
        Clock <= '1' ; wait for 20 ns;
280
    end process;
281
    
282
    process
283
      begin
284
        
285
        number <= "0110"; nex <= '1'; prev <= '0'; wait for 30 ns;
286
        number <= "0110"; nex <= '0'; prev <= '1'; wait for 230 ns;
287
    end process;
288
end testbench;

Reply

Note: the original post is older than 6 months. Please don't ask any new questions in this thread, but start a new one.

Formatting
  • [c]C-Code[/c]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]code in other languages, ASCII drawings[/code]
  • [math]formula (LaTeX syntax)[/math]
  • [[Title]] – link to an article
  • Link to another post: right-click its post ID (#8078628), copy the address, paste it into the text

More about formatting

Post long source code as an attachment, not in the text.

Already registered? Log in

Not shown to anyone. We send you a link; your post appears once you confirm it there.

By submitting you create a free account and accept the terms of use.