I am not able to do the increment and the testbench for this code. Question: A system has a 3-bit input D_IN which is read in at every positive edge of a clock input CLK. If the current D_IN is greater than the previous D_IN by at least 2, a 3-bit output Count is incremented. If D_IN is 0 for 3 consecutive CLK cycles, the count is reset. When Count reaches 6, the system will assert an output Alarm and the Count will not increase further, till it is reset by giving 0s at D_IN for 3 consecutive cycles. Test case:
1 | Clk 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
2 | |
3 | D_IN 0 0 0 2 4 7 6 0 2 4 6 3 5 7 0 0 0 0 |
code
1 | library IEEE; |
2 | use IEEE.STD_LOGIC_1164.ALL; |
3 | use IEEE.NUMERIC_STD.ALL; |
4 | |
5 | entity johnson_counter is |
6 | port ( |
7 | D_in : in std_logic_vector(2 downto 0); |
8 | alarm : out std_logic; |
9 | CLK_I : in std_logic |
10 | );
|
11 | end johnson_counter; |
12 | |
13 | architecture Behavioral of johnson_counter is |
14 | |
15 | signal xnew, xold, count1, count2: unsigned(2 downto 0):=(others => '0'); |
16 | |
17 | begin
|
18 | |
19 | |
20 | process(CLK_I) |
21 | begin
|
22 | if( rising_edge(CLK_I) ) then |
23 | xnew <= std_logic_vector(unsigned(D_in)); |
24 | xnew <= xnew - "010"; |
25 | if (xnew => xold) then |
26 | count1 <= count1 + "1"; |
27 | if(xnew = 0) then |
28 | count2 <= count2 + "1"; |
29 | if(xnew /= 0) then |
30 | count2 <= "0"; |
31 | if(count2 = "011") then |
32 | alarm <= "1"; |
33 | end if; |
34 | end if; |
35 | end if; |
36 | end if; |
37 | end if; |
38 | end process; |
:
Edited by Moderator
Icy Snow wrote: > code Whats the problem with it? Whats the problem at all? Is this any good for: > xold It isn't used in the code, so it must be obsolete... This will create an error:
1 | xnew <= std_logic_vector(unsigned(D_in)); -- what type is xnew? |
This does not behave like you desired it:
1 | process(CLK_I) |
2 | begin
|
3 | if( rising_edge(CLK_I) ) then |
4 | xnew <= std_logic_vector(unsigned(D_in)); |
5 | xnew <= xnew - "010"; |
You know about the behaviour of signal in a process? You will find out, that the fist assignment is simply ignored, and therefore xnew is simply a down-counter with a decrement of 2. In fact you could write this process without any change in behaviour like this:
1 | process(CLK_I) |
2 | begin
|
3 | if( rising_edge(CLK_I) ) then |
4 | xnew <= xnew - "010"; |
> Test case: > Clk 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 > D_IN 0 0 0 2 4 7 6 0 2 4 6 3 5 7 0 0 0 0 Did you create a test bench out of this data? How does it look like? All in all you are a lucky man: you don't have to do last milleniums technology like structural description of a multiplier built of halfadders. Insted you got a problem fairly near to what is the daily work of a FPGA designer. BTW: Did you see this above the edit box?
1 | Formatting options |
2 | [vhdl]VHDL code[/vhdl] |
:
Edited by Moderator
this
1 | if (xnew => xold) then |
... won't work as you expect it to work. Try:
1 | if (xnew >= xold) then |