Auto-suggest helps you quickly narrow down your search results by suggesting possible matches as you type.

- Community Forums
- :
- Forums
- :
- Vivado RTL Development
- :
- Synthesis
- :
- Re: Help identifying VHDL Signal forming Combinato...

- Subscribe to RSS Feed
- Mark Topic as New
- Mark Topic as Read
- Float this Topic for Current User
- Bookmark
- Subscribe
- Mute
- Printer Friendly Page

Highlighted

huangpoh

Visitor

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content

07-29-2017 10:40 AM

2,900 Views

Registered:
07-20-2017

Hi Everyone,

Can someone help me identify a the Combinatorial Loop for my simple FSM?

I get this warning : Unit FSM4 : the following signal(s) form a combinatorial loop: Z1. when I sythesize

architecture Behavioral of FSM4 is type STATE is (ST0,ST1); signal CURRENT_STATE : STATE := ST0 ; signal NEXT_STATE : STATE; begin process (CLR, NEXT_STATE) is begin if (CLR = '1') then CURRENT_STATE <= ST0; else CURRENT_STATE <= NEXT_STATE; end if; end process; process(CURRENT_STATE,TOG_EN) is begin Z1<='0'; case (CURRENT_STATE) is when ST0 => Z1 <= '0'; if(TOG_EN = '1') then NEXT_STATE <= ST1; else NEXT_STATE <= ST0; end if; when ST1 => Z1 <= '1'; if(TOG_EN = '1')then NEXT_STATE <= ST0; else NEXT_STATE <= ST1; end if; when others => Z1 <= '0'; NEXT_STATE <= ST0; end case; end process; end Behavioral;

However If I sythesize this code everything is OK, the only difference I see is that the below code has a Clock and the above one doesn't.

architecture Behavioral of FSM is type STATE_TYPE is (ST0,ST1); signal CURRENT_STATE : STATE_TYPE := ST0; signal NEXT_STATE : STATE_TYPE; begin process (CLR,CLK,NEXT_STATE) is begin if (CLR = '1') then CURRENT_STATE <= ST0; elsif (rising_edge(CLK)) then CURRENT_STATE <= NEXT_STATE; end if ; end process; process(CURRENT_STATE,TOG_EN) is begin Z1<='0'; case (CURRENT_STATE) is when ST0 => Z1 <= '0'; if(TOG_EN = '1') then NEXT_STATE <= ST1; else NEXT_STATE <= ST0; end if; when ST1 => Z1 <= '1'; if(TOG_EN = '1')then NEXT_STATE <= ST0; else NEXT_STATE <= ST1; end if; when others => Z1 <= '0'; NEXT_STATE <= ST0; end case; end process; with CURRENT_STATE select Y <= '1' when ST1 , '0' when ST0 , '0' when others; end Behavioral;

In all the examples I've ran into all has the FSM has a clock, I was trying to create one that does not have a CLK

Thanks in advance

Po

1 Solution

Accepted Solutions

Highlighted

u4223374

Advisor

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content

07-29-2017 07:13 PM

4,461 Views

Registered:
04-26-2015

Think about what happens when CLR=0 and TOG=1.

At time 0: CURRENT_STATE is ST0, so NEXT_STATE = ST1 At time 0: CURRENT_STATE = NEXT_STATE = ST1 At time 0: CURRENT_STATE is ST1, so NEXT_STATE = ST0 At time 0: CURRENT_STATE = NEXT_STATE = ST0 At time 0: CURRENT_STATE is ST0, so NEXT_STATE = ST1 At time 0: CURRENT_STATE = NEXT_STATE = ST1 At time 0: CURRENT_STATE is ST1, so NEXT_STATE = ST0 At time 0: CURRENT_STATE = NEXT_STATE = ST0 At time 0: CURRENT_STATE is ST0, so NEXT_STATE = ST1 At time 0: CURRENT_STATE = NEXT_STATE = ST1 At time 0: CURRENT_STATE is ST1, so NEXT_STATE = ST0 At time 0: CURRENT_STATE = NEXT_STATE = ST0 At time 0: CURRENT_STATE is ST0, so NEXT_STATE = ST1 At time 0: CURRENT_STATE = NEXT_STATE = ST1 At time 0: CURRENT_STATE is ST1, so NEXT_STATE = ST0 At time 0: CURRENT_STATE = NEXT_STATE = ST0 At time 0: CURRENT_STATE is ST0, so NEXT_STATE = ST1 At time 0: CURRENT_STATE = NEXT_STATE = ST1 At time 0: CURRENT_STATE is ST1, so NEXT_STATE = ST0 At time 0: CURRENT_STATE = NEXT_STATE = ST0 At time 0: CURRENT_STATE is ST0, so NEXT_STATE = ST1 At time 0: CURRENT_STATE = NEXT_STATE = ST1 At time 0: CURRENT_STATE is ST1, so NEXT_STATE = ST0 At time 0: CURRENT_STATE = NEXT_STATE = ST0 At time 0: CURRENT_STATE is ST0, so NEXT_STATE = ST1 At time 0: CURRENT_STATE = NEXT_STATE = ST1 At time 0: CURRENT_STATE is ST1, so NEXT_STATE = ST0 At time 0: CURRENT_STATE = NEXT_STATE = ST0 .. and so on

In this situation, what result are you expecting the tools to produce? There is no stable state for the system that your code describes.

In contrast, the clocked one does the following:

At time 0: CURRENT_STATE is ST0, so NEXT_STATE = ST1 At time 1: CURRENT_STATE = NEXT_STATE = ST1 At time 1: CURRENT_STATE is ST1, so NEXT_STATE = ST0 At time 2: CURRENT_STATE = NEXT_STATE = ST0 At time 2: CURRENT_STATE is ST0, so NEXT_STATE = ST1 At time 3: CURRENT_STATE = NEXT_STATE = ST1 At time 3: CURRENT_STATE is ST1, so NEXT_STATE = ST0 At time 4: CURRENT_STATE = NEXT_STATE = ST0 At time 4: CURRENT_STATE is ST0, so NEXT_STATE = ST1 At time 5: CURRENT_STATE = NEXT_STATE = ST1 At time 5: CURRENT_STATE is ST1, so NEXT_STATE = ST0 .. and so on

At each time period (defined by the clock) there is a stable state. The system gets into that state and stays there.

5 Replies

Highlighted

avrumw

Guide

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content

07-29-2017 11:05 AM

2,894 Views

Registered:
01-23-2009

In all the examples I've ran into all has the FSM has a clock, I was trying to create one that does not have a CLK

By definition, a finite state machine without a clock (if you can even call it an FSM) is a combinational loop - it can't be anything else. The "state" has to be combinatorially reinforced by the combinatorial loop (since there are no memory elements).

While asynchronous state machines can exist, **nobody** uses them in real designs and especially not in FPGAs. The entire tool chain is designed to work with synchronous design techniques - this is absolutely not one.

I don't know what you are trying to accomplish. If it is anything "real" (i.e. other than an academic exercise to try and implement an asynchronous state machine), this is not the way to do it.

Avrum

Highlighted

muzaffer

Teacher

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content

07-29-2017 12:10 PM

2,876 Views

Registered:
03-31-2012

>> In all the examples I've ran into all has the FSM has a clock

because there is a very good reason for it. The alternative of having storage which doesn't need a clock is extremely difficult to get right so almost all designs use one and most tools support only clocked designs.

Why do you want to have a design with no clock anyway?

- Please mark the Answer as "Accept as solution" if information provided is helpful.

Give Kudos to a post which you think is helpful and reply oriented.

Give Kudos to a post which you think is helpful and reply oriented.

Highlighted

u4223374

Advisor

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content

07-29-2017 07:13 PM

4,462 Views

Registered:
04-26-2015

Think about what happens when CLR=0 and TOG=1.

At time 0: CURRENT_STATE is ST0, so NEXT_STATE = ST1 At time 0: CURRENT_STATE = NEXT_STATE = ST1 At time 0: CURRENT_STATE is ST1, so NEXT_STATE = ST0 At time 0: CURRENT_STATE = NEXT_STATE = ST0 At time 0: CURRENT_STATE is ST0, so NEXT_STATE = ST1 At time 0: CURRENT_STATE = NEXT_STATE = ST1 At time 0: CURRENT_STATE is ST1, so NEXT_STATE = ST0 At time 0: CURRENT_STATE = NEXT_STATE = ST0 At time 0: CURRENT_STATE is ST0, so NEXT_STATE = ST1 At time 0: CURRENT_STATE = NEXT_STATE = ST1 At time 0: CURRENT_STATE is ST1, so NEXT_STATE = ST0 At time 0: CURRENT_STATE = NEXT_STATE = ST0 At time 0: CURRENT_STATE is ST0, so NEXT_STATE = ST1 At time 0: CURRENT_STATE = NEXT_STATE = ST1 At time 0: CURRENT_STATE is ST1, so NEXT_STATE = ST0 At time 0: CURRENT_STATE = NEXT_STATE = ST0 At time 0: CURRENT_STATE is ST0, so NEXT_STATE = ST1 At time 0: CURRENT_STATE = NEXT_STATE = ST1 At time 0: CURRENT_STATE is ST1, so NEXT_STATE = ST0 At time 0: CURRENT_STATE = NEXT_STATE = ST0 At time 0: CURRENT_STATE is ST0, so NEXT_STATE = ST1 At time 0: CURRENT_STATE = NEXT_STATE = ST1 At time 0: CURRENT_STATE is ST1, so NEXT_STATE = ST0 At time 0: CURRENT_STATE = NEXT_STATE = ST0 At time 0: CURRENT_STATE is ST0, so NEXT_STATE = ST1 At time 0: CURRENT_STATE = NEXT_STATE = ST1 At time 0: CURRENT_STATE is ST1, so NEXT_STATE = ST0 At time 0: CURRENT_STATE = NEXT_STATE = ST0 .. and so on

In this situation, what result are you expecting the tools to produce? There is no stable state for the system that your code describes.

In contrast, the clocked one does the following:

At time 0: CURRENT_STATE is ST0, so NEXT_STATE = ST1 At time 1: CURRENT_STATE = NEXT_STATE = ST1 At time 1: CURRENT_STATE is ST1, so NEXT_STATE = ST0 At time 2: CURRENT_STATE = NEXT_STATE = ST0 At time 2: CURRENT_STATE is ST0, so NEXT_STATE = ST1 At time 3: CURRENT_STATE = NEXT_STATE = ST1 At time 3: CURRENT_STATE is ST1, so NEXT_STATE = ST0 At time 4: CURRENT_STATE = NEXT_STATE = ST0 At time 4: CURRENT_STATE is ST0, so NEXT_STATE = ST1 At time 5: CURRENT_STATE = NEXT_STATE = ST1 At time 5: CURRENT_STATE is ST1, so NEXT_STATE = ST0 .. and so on

At each time period (defined by the clock) there is a stable state. The system gets into that state and stays there.

Highlighted

huangpoh

Visitor

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content

08-01-2017 07:20 PM

2,683 Views

Registered:
07-20-2017

The reason that I was wondering if it is possible, in my design there is a XC9500XL CPLD without external clock, in the datasheet I don't see an internal clock so I was wondering how I would go about creating a FSM without a clock, are there CPLDs or FPGAs with internal clocks?

I think I just answered my question there is no internal clock for CPLDs, however there are PLLs clock synthesis blocks in FPGAs however you would still need a source from an external clock, or https://www.xilinx.com/support/documentation/user_guides/ug472_7Series_Clocking.pdf

Highlighted

muzaffer

Teacher

- Mark as New
- Bookmark
- Subscribe
- Mute
- Subscribe to RSS Feed
- Permalink
- Email to a Friend
- Report Inappropriate Content

08-01-2017 07:40 PM

2,679 Views

Registered:
03-31-2012

@huangpoh CPLDs are a lot more deterministic in terms of timing so I think it would be possible to create an internal oscillator which can be controlled enough to have a period which is always useful to use inside the chip. You wouldn't be able to control the exact period but the range so that you can check setup timing.

- Please mark the Answer as "Accept as solution" if information provided is helpful.

Give Kudos to a post which you think is helpful and reply oriented.

Give Kudos to a post which you think is helpful and reply oriented.