EmbDev.net

Forum: FPGA, VHDL & Verilog Simple Remote Control


von sam j. (sam110)


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;

: Edited by Moderator
von Lothar M. (Company: Titel) (lkmiller) (Moderator)


Rate this post
useful
not useful
sam johnson wrote:
> The code that I've written compiles that problem is that it's not giving
> me a right answer.
What answer do you expect and what answer do you get?

BTW:
Rules — please read before posting
    *Post long source code as attachment, not in the text*

Please log in before posting. Registration is free and takes only a minute.
Existing account
Do you have a Google/GoogleMail account? No registration required!
Log in with Google account
No account? Register here.