how do you code this?

Discussion in 'VHDL' started by aravind, Jan 26, 2007.

  1. aravind

    aravind Guest

    There is a 20 bit counter,with two inputs ,on the rising edge of one
    input the counter must increment and on the rising edge of the other
    input the counter must decrement.
    this is for a 1MB FIFO buffer using single port external SRAM,I'm using
    Xilinx ISE tool.according to the xilinx tool you cannot have two
    (rising_edge()) statements in a single process.

    How do you code it?
    aravind, Jan 26, 2007
    #1
    1. Advertising

  2. aravind

    Guest

    aravind skrev:

    > There is a 20 bit counter,with two inputs ,on the rising edge of one
    > input the counter must increment and on the rising edge of the other
    > input the counter must decrement.
    > this is for a 1MB FIFO buffer using single port external SRAM,I'm using
    > Xilinx ISE tool.according to the xilinx tool you cannot have two
    > (rising_edge()) statements in a single process.
    >
    > How do you code it?


    Make two process, one for the increment and one for decrement.
    , Jan 26, 2007
    #2
    1. Advertising

  3. aravind

    Zara Guest

    On 25 Jan 2007 23:13:41 -0800, "aravind" <> wrote:

    >
    >There is a 20 bit counter,with two inputs ,on the rising edge of one
    >input the counter must increment and on the rising edge of the other
    >input the counter must decrement.
    >this is for a 1MB FIFO buffer using single port external SRAM,I'm using
    >Xilinx ISE tool.according to the xilinx tool you cannot have two
    >(rising_edge()) statements in a single process.
    >
    >How do you code it?



    I f you have a clock available faster than the control inputs, you may
    generate with it one pulse on rising_edge of one control signal,
    another pulse for the other control signal, and use them as clock
    enables for the fast clock

    Best regards,

    Zara
    Zara, Jan 26, 2007
    #3
  4. aravind

    aravind Guest

    On Jan 26, 5:35 pm, Zara <> wrote:
    > On 25 Jan 2007 23:13:41 -0800, "aravind" <> wrote:
    >
    >
    >
    > >There is a 20 bit counter,with two inputs ,on the rising edge of one
    > >input the counter must increment and on the rising edge of the other
    > >input the counter must decrement.
    > >this is for a 1MB FIFO buffer using single port external SRAM,I'm using
    > >Xilinx ISE tool.according to the xilinx tool you cannot have two
    > >(rising_edge()) statements in a single process.

    >
    > >How do you code it?I f you have a clock available faster than the control inputs, you may

    > generate with it one pulse on rising_edge of one control signal,
    > another pulse for the other control signal, and use them as clock
    > enables for the fast clock
    >
    > Best regards,
    >
    > Zara


    thanks
    I believe you are suggesting a gated clock,But a gated clock is not a
    recommended design practice(i think).
    aravind, Jan 26, 2007
    #4
  5. aravind

    Ben Jones Guest

    "aravind" <> wrote in message
    news:...
    > On Jan 26, 5:35 pm, Zara <> wrote:
    >> On 25 Jan 2007 23:13:41 -0800, "aravind" <> wrote:
    >> >There is a 20 bit counter,with two inputs ,on the rising edge of one
    >> >input the counter must increment and on the rising edge of the other
    >> >input the counter must decrement.


    >> If you have a clock available faster than the control inputs, you may
    >> generate with it one pulse on rising_edge of one control signal,
    >> another pulse for the other control signal, and use them as clock
    >> enables for the fast clock


    > I believe you are suggesting a gated clock,But a gated clock is not a
    > recommended design practice(i think).


    No, what is being described is a single synchronous circuit which runs in a
    clock domain that is fast enough to re-synchronize and sample the "rising
    edges" you described, generating synchronous pulses to increment and
    decrement the counter. This, if possible, is the cleanest solution to your
    problem.

    -Ben-
    Ben Jones, Jan 26, 2007
    #5
  6. aravind wrote:
    > There is a 20 bit counter,with two inputs ,on the rising edge of one
    > input the counter must increment and on the rising edge of the other
    > input the counter must decrement.
    > this is for a 1MB FIFO buffer using single port external SRAM,I'm using
    > Xilinx ISE tool.according to the xilinx tool you cannot have two
    > (rising_edge()) statements in a single process.
    >
    > How do you code it?
    >

    Two ideas :)


    Idea a:
    =======
    1. Assure both inputs are synchronised to the counter's clock

    2. If you have to synchronise your inputs choose the counter's clock frequency
    according to following formula:
    fcnt > 1/(2 * (min(thmin(i1), tlmin(i2)), min(thmin(i2), tlmin(i2)))
    with
    i1 and i2: designating the two inputs
    thmin: minimum high time
    tlmin: minimum low time

    3. The counter's code:

    signal cnt20 : unsigned(19 downto 0);
    signal i1, i2 : std_ulogic; -- inputs 1, 2
    signal i1_old, i2_old : std_ulogic -- differentiated inputs 1, 2

    p_cnt20 : process (clk,reset)
    begin
    if reset = ActiveResetLevel then
    cnt20 <= (others => '0');
    i1_old <= '1';
    i2_old <= '1';

    elsif (clk'event and clk = '1') then
    if i1_old = '0' and i1 = '1' and -- rising edge of i1
    i2_old = '0' and i2 = '1' then -- rising edge of i2
    NULL;

    elsif i1_old = '0' and i1 = '1' then -- rising edge of i1
    cnt20 <= cnt20 + 1;

    elsif i2_old = '0' and i2 = '1' then -- rising edge of i2
    cnt20 <= cnt20 - 1;

    end if;
    end if;
    end process;

    Idea b:
    =======
    1. use one 20 bit counter for each clock domain and
    (1a. eventually encode with Gray code for only one bit changes)
    2. synchronise both counter outputs for the result clock domain
    (2a. decode the Gray encoded counter values if Gray encoded)
    3. substract one result from the other for the SRAM address.

    Cheers

    Wolfgang
    Wolfgang Grafen, Jan 26, 2007
    #6
  7. Upps,

    code unverified but just realised I forgot to assign i1_old and i2_old ;)

    Wolfgang Grafen wrote:
    > aravind wrote:
    >> There is a 20 bit counter,with two inputs ,on the rising edge of one
    >> input the counter must increment and on the rising edge of the other
    >> input the counter must decrement.
    >> this is for a 1MB FIFO buffer using single port external SRAM,I'm using
    >> Xilinx ISE tool.according to the xilinx tool you cannot have two
    >> (rising_edge()) statements in a single process.
    >>
    >> How do you code it?
    >>

    > Two ideas :)
    >
    >
    > Idea a:
    > =======
    > 1. Assure both inputs are synchronised to the counter's clock
    >
    > 2. If you have to synchronise your inputs choose the counter's clock
    > frequency
    > according to following formula:
    > fcnt > 1/(2 * (min(thmin(i1), tlmin(i2)), min(thmin(i2), tlmin(i2)))
    > with
    > i1 and i2: designating the two inputs
    > thmin: minimum high time
    > tlmin: minimum low time
    >
    > 3. The counter's code:
    >
    > signal cnt20 : unsigned(19 downto 0);
    > signal i1, i2 : std_ulogic; -- inputs 1, 2
    > signal i1_old, i2_old : std_ulogic -- differentiated inputs 1, 2
    >
    > p_cnt20 : process (clk,reset)
    > begin
    > if reset = ActiveResetLevel then
    > cnt20 <= (others => '0');
    > i1_old <= '1';
    > i2_old <= '1';
    >
    > elsif (clk'event and clk = '1') then

    i1_old <= i1;
    i2_old <= i2;
    > if i1_old = '0' and i1 = '1' and -- rising edge of i1
    > i2_old = '0' and i2 = '1' then -- rising edge of i2
    > NULL;
    >
    > elsif i1_old = '0' and i1 = '1' then -- rising edge of i1
    > cnt20 <= cnt20 + 1;
    >
    > elsif i2_old = '0' and i2 = '1' then -- rising edge of i2
    > cnt20 <= cnt20 - 1;
    >
    > end if;
    > end if;
    > end process;
    >
    > Idea b:
    > =======
    > 1. use one 20 bit counter for each clock domain and
    > (1a. eventually encode with Gray code for only one bit changes)
    > 2. synchronise both counter outputs for the result clock domain
    > (2a. decode the Gray encoded counter values if Gray encoded)
    > 3. substract one result from the other for the SRAM address.
    >
    > Cheers
    >
    > Wolfgang
    >
    >
    >
    Wolfgang Grafen, Jan 26, 2007
    #7
  8. aravind

    Andy Guest

    Xilinx has a very good app note on designing a synchronous, two clock
    fifo with BRAM. It wouldn't be hard to adapt it to external sram. I
    don't recall the appnote number. It is based along the lines of
    Wofgang's idea B, but you do not subtract one counter from the other
    for the SRAM address, you do that to figure out full/empty/neither
    (some extra logic is required to tell full from empty). The counter
    being incrmented on the write clock is the address for writing. The
    counter incremented on the read clock is the address for reading.

    Andy

    On Jan 26, 8:56 am, Wolfgang Grafen <>
    wrote:
    > Upps,
    >
    > code unverified but just realised I forgot to assign i1_old and i2_old ;)
    >
    >
    >
    > Wolfgang Grafen wrote:
    > > aravind wrote:
    > >> There is a 20 bit counter,with two inputs ,on the rising edge of one
    > >> input the counter must increment and on the rising edge of the other
    > >> input the counter must decrement.
    > >> this is for a 1MB FIFO buffer using single port external SRAM,I'm using
    > >> Xilinx ISE tool.according to the xilinx tool you cannot have two
    > >> (rising_edge()) statements in a single process.

    >
    > >> How do you code it?

    >
    > > Two ideas :)

    >
    > > Idea a:
    > > =======
    > > 1. Assure both inputs are synchronised to the counter's clock

    >
    > > 2. If you have to synchronise your inputs choose the counter's clock
    > > frequency
    > > according to following formula:
    > > fcnt > 1/(2 * (min(thmin(i1), tlmin(i2)), min(thmin(i2), tlmin(i2)))
    > > with
    > > i1 and i2: designating the two inputs
    > > thmin: minimum high time
    > > tlmin: minimum low time

    >
    > > 3. The counter's code:

    >
    > > signal cnt20 : unsigned(19 downto 0);
    > > signal i1, i2 : std_ulogic; -- inputs 1, 2
    > > signal i1_old, i2_old : std_ulogic -- differentiated inputs 1, 2

    >
    > > p_cnt20 : process (clk,reset)
    > > begin
    > > if reset = ActiveResetLevel then
    > > cnt20 <= (others => '0');
    > > i1_old <= '1';
    > > i2_old <= '1';

    >
    > > elsif (clk'event and clk = '1') then i1_old <= i1;

    > i2_old <= i2;
    >
    > > if i1_old = '0' and i1 = '1' and -- rising edge of i1
    > > i2_old = '0' and i2 = '1' then -- rising edge of i2
    > > NULL;

    >
    > > elsif i1_old = '0' and i1 = '1' then -- rising edge of i1
    > > cnt20 <= cnt20 + 1;

    >
    > > elsif i2_old = '0' and i2 = '1' then -- rising edge of i2
    > > cnt20 <= cnt20 - 1;

    >
    > > end if;
    > > end if;
    > > end process;

    >
    > > Idea b:
    > > =======
    > > 1. use one 20 bit counter for each clock domain and
    > > (1a. eventually encode with Gray code for only one bit changes)
    > > 2. synchronise both counter outputs for the result clock domain
    > > (2a. decode the Gray encoded counter values if Gray encoded)
    > > 3. substract one result from the other for the SRAM address.

    >
    > > Cheers

    >
    > > Wolfgang
    Andy, Jan 27, 2007
    #8
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Doris Cox
    Replies:
    0
    Views:
    544
    Doris Cox
    Dec 2, 2003
  2. Dennis
    Replies:
    0
    Views:
    691
    Dennis
    Dec 2, 2003
  3. Dennis
    Replies:
    0
    Views:
    447
    Dennis
    Dec 2, 2003
  4. pek
    Replies:
    0
    Views:
    1,213
  5. johannes falcone
    Replies:
    6
    Views:
    993
    johannes falcone
    May 16, 2013
Loading...

Share This Page