Programmable Devices
CPLDs, FPGAs, SoC FPGAs, Configuration, and Transceivers
公告
FPGA community forums and blogs on community.intel.com are migrating to the new Altera Community and are read-only. For urgent support needs during this transition, please visit the FPGA Design Resources page or contact an Altera Authorized Distributor.
21615 讨论

Is it possible to write this?

Altera_Forum
名誉分销商 II
1,676 次查看

Hello, 

I have to write a VHDL code in which i wrote case statement two times for the same FSM states(case statement was in fact interrupted by an if statement).Please look at the underlined lines of the code to  

understand what i mean. 

case etat_courant is when Idle => SCLK<= '1'; SDIN<= '1'; if SDIN = '0' then etat_suivant<= Start_recep; end if; when Start_recep => SCLK<= '1'; SDIN<= '0'; if SDIN = '1' then etat_suivant<= Reception; end if; when Reception => if (m <= 47) then if (s <= 7) then --while (m <= 47) loop --while (s <= 7) loop SDIN<= ADCDAT(s); s:= s+1; --end loop ; end if ; m:= m+1; --end loop ; elsif (m = 48) then etat_suivant<= Depart_trans; end if; end case; if (n <= 15) then case etat_courant is when Depart_trans => SCLK<= '0'; SDIN<= '0'; if (SDIN = '1') then etat_suivant<= Tran_addr; end if; when Tran_addr => if (i < 7 ) then SDIN<= adr_reg (i); i:= i+1; --end loop ; DATA_0<= adr_reg & '0'; elsif (i = 7) then etat_suivant<= Ack_1; end if; when Ack_1 => SDIN<= '0'; ACK<='1'; etat_suivant<= Trans_data_1 ; when Trans_data_1 => ACK<='0'; if (j < 8 ) then SDIN<= DATA_1(j); j:= j+1; elsif (j = 8) then etat_suivant<= Ack_2; end if; when Ack_2 => SDIN<= '0'; ACK<='1'; etat_suivant<= Trans_data_2 ; when Trans_data_2 => ACK<='0'; if (k < 8 ) then SDIN<= DATA_2(k); k:= k+1; --end loop ; elsif (k = 8) then etat_suivant<= Ack_3; end if; when Ack_3 => SDIN<= '0'; ACK<='1'; etat_suivant<= Stop_cond_1 ; when Stop_cond_1 => ACK <= '0'; SDIN<= '0'; SCLK<='0'; etat_suivant<= Stop_cond_2 ; when Stop_cond_2 => SDIN<= '0'; SCLK<='1'; etat_suivant<= Stop_cond_3 ; when Stop_cond_3 => SDIN<= '1'; SCLK<='1'; etat_suivant<= Depart_trans ; when OTHERS => etat_suivant<=Idle; n:=n+1; end case; elsif ( n > 15) then fin<='1'; etat_suivant<= Idle ; end if;
0 项奖励
4 回复数
Altera_Forum
名誉分销商 II
989 次查看

No you can't. You'll have to put your 'if' line in every state that requires it.

0 项奖励
Altera_Forum
名誉分销商 II
989 次查看

No it's not this what i need.I want to have the states within if statement looped together for 16 times on a row. 

Take a look at this FSM schematic: 

 

 

https://www.alteraforum.com/forum/attachment.php?attachmentid=1284
0 项奖励
Altera_Forum
名誉分销商 II
989 次查看

From what I see in your schematic you can put the if statement inside the Stop_Cond_3 state. 

You should also initialize all your variables somewhere. I guess setting them to 0 in the Idle state should do the trick.
0 项奖励
Altera_Forum
名誉分销商 II
989 次查看

I think, the shown code isn't legal VHDL because each case statement must either cover all possible state alternatives or contain an others case. It's no problem to supplement the code respectively, but the design is at least rather confusing. Thus I would also suggest to merge the code into one case statement.

0 项奖励
回复