EmbDev.net

Forum: FPGA, VHDL & Verilog VHDL Counter Problem (Please help)


Author: Icy Snow (icysnow)
Posted on:

Rate this post
0 useful
not useful
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:
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

code
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity johnson_counter is
port ( 
    D_in  : in std_logic_vector(2 downto 0);
    alarm : out std_logic;
    CLK_I : in std_logic
    );
end johnson_counter;

architecture Behavioral of johnson_counter is

signal xnew, xold, count1, count2: unsigned(2 downto 0):=(others => '0');

begin


process(CLK_I)
begin
if( rising_edge(CLK_I) ) then
 xnew <= std_logic_vector(unsigned(D_in));
 xnew <= xnew - "010";
    if (xnew => xold) then
        count1 <= count1 + "1";
    if(xnew = 0) then
            count2 <= count2 + "1";
      if(xnew /= 0) then
            count2 <= "0";
      if(count2 = "011") then
            alarm <= "1";
    end if;
      end if;
      end if;
      end if;
end if;
end process;

: Edited by Moderator
Author: Lothar Miller (lkmiller) (Moderator)
Posted on:

Rate this post
0 useful
not useful
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:
  xnew <= std_logic_vector(unsigned(D_in)); -- what type is xnew?

This does not behave like you desired it:
 process(CLK_I)
 begin
 if( rising_edge(CLK_I) ) then
   xnew <= std_logic_vector(unsigned(D_in));
   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:
 process(CLK_I)
 begin
 if( rising_edge(CLK_I) ) then
   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?
Formatting options
    [vhdl]VHDL code[/vhdl]

: Edited by Moderator
Author: and (Guest)
Posted on:

Rate this post
0 useful
not useful
this
if (xnew => xold) then
...
won't work as you expect it to work.
Try:
if (xnew >= xold) then

Reply

Entering an e-mail address is optional. If you want to receive reply notifications by e-mail, please log in.

Rules — please read before posting

  • Post long source code as attachment, not in the text
  • Posting advertisements is forbidden.

Formatting options

  • [c]C code[/c]
  • [avrasm]AVR assembler code[/avrasm]
  • [vhdl]VHDL code[/vhdl]
  • [code]code in other languages, ASCII drawings[/code]
  • [math]formula (LaTeX syntax)[/math]




Bild automatisch verkleinern, falls nötig
Note: the original post is older than 6 months. Please don't ask any new questions in this thread, but start a new one.