inter 发表于 2010-6-26 01:00:19

VHDL状态机的时钟产生问题

本帖最后由 fpgaw 于 2010-11-18 16:15 编辑

我想用一个主时钟来产生如图1所示的四个时钟,程序如下
library ieee ;
use ieee.std_logic_1164.all ;
entity cycles is
port (
clock_main , rst: in std_logic ;
c0, c1, c2, c3 : out std_logic) ;
end cycles ;
architecture rtl of cycles is
type state_values is (st0 , st1 , st2 ,st3) ;
signal pres_state , next_state : state_values ;
begin
process (clock_main , rst)
begin
if (rst = '1') then
pres_state <= st0 ;
elsif (clock_main'event and clock_main= '1') then
pres_state <= next_state ;
end if ;
end process ;
process(pres_state)
begin
case pres_state is
when st0 =>
c0 <= '1' ;
c1 <= '0' ;
c2 <= '0' ;
c3 <= '0' ;
next_state <= st1 ;
when st1 =>
c0 <= '0' ;
c1 <= '1' ;
c2 <= '0' ;
c3 <= '0' ;
next_state <= st2 ;

when st2 =>
c0 <= '0' ;
c1 <= '0' ;
c2 <= '1' ;
c3 <= '0' ;
next_state <= st3 ;
when st3 =>
c0 <= '0' ;
c1 <= '0' ;
c2 <= '0' ;
c3 <= '1' ;
next_state <= st0 ;
when others =>
next_state <= st0 ;
end case ;
end process ;
end rtl ;

为什么我产生的时钟c0,c1,c2,c3和主时钟clock_main的边沿有很大的时延呢,如图2,我怎么改都是这样,而且主时钟clock_main不同,时延也不同

ngtim 发表于 2010-6-26 01:51:16

你是用的pres_state触发,而pres_state又是由时钟触发产生的,所以状态里面的pres_state触发要等到时钟触发后才执行,所以有延迟,我学verilog的,感觉是这样

CTT 发表于 2010-6-26 02:33:00

建议状态机用时钟沿触发~!

ngtim 发表于 2010-6-26 04:19:00

谢谢playme119的回复,我按照您的建议,修正了一下程序,使用一个进程,时钟触发,但是还是有时延,当时钟周期为10ns时,时延大约为半个多周期,程序如下:<br>
<br>
library ieee ; <br>
use ieee.std_logic_1164.all ;<br>
<br>
entity cycles is <br>
port (<br>
&nbsp; &nbsp;&nbsp; &nbsp;clock_main,rst: in std_logic ;<br>
&nbsp; &nbsp;&nbsp; &nbsp;c0, c1, c2, c3 : out std_logic) ;<br>
end cycles ;<br>
architecture rtl of cycles is<br>
type state_values is (st0 , st1 , st2 ,&nbsp;&nbsp;st3) ;<br>
signal pres_state: state_values ;<br>
begin<br>
<br>
process(rst,clock_main)<br>
begin<br>
if (rst='1') then<br>
&nbsp; &nbsp;pres_state &lt;= st0 ;<br>
elsif (clock_main'event and clock_main= '1') then <br>
case pres_state is<br>
&nbsp;&nbsp;when st0 =&gt;<br>
&nbsp; &nbsp;c0 &lt;= '1' ; <br>
&nbsp; &nbsp;c1 &lt;= '0' ;<br>
&nbsp; &nbsp;c2 &lt;= '0' ;<br>
&nbsp; &nbsp;c3 &lt;= '0' ;<br>
&nbsp; &nbsp;pres_state &lt;= st1 ;<br>
<br>
&nbsp;&nbsp;when st1 =&gt;<br>
&nbsp; &nbsp; c0 &lt;= '0' ; <br>
&nbsp; &nbsp;c1 &lt;= '1' ;<br>
&nbsp; &nbsp;c2 &lt;= '0' ;<br>
&nbsp; &nbsp;c3 &lt;= '0' ;<br>
&nbsp; &nbsp; pres_state &lt;= st2 ;<br>
<br>
when st2 =&gt;<br>
&nbsp; &nbsp;c0 &lt;= '0' ; <br>
&nbsp; &nbsp;c1 &lt;= '0' ;<br>
&nbsp; &nbsp;c2 &lt;= '1' ;<br>
&nbsp; &nbsp;c3 &lt;= '0' ;<br>
&nbsp; &nbsp;pres_state&lt;= st3 ;<br>
<br>
when st3 =&gt;<br>
&nbsp; &nbsp;c0 &lt;= '0' ; <br>
&nbsp; &nbsp;c1 &lt;= '0' ;<br>
&nbsp; &nbsp;c2 &lt;= '0' ;<br>
&nbsp; &nbsp;c3 &lt;= '1' ;<br>
&nbsp; &nbsp;pres_state &lt;= st0 ;<br>
<br>
when others =&gt;<br>
&nbsp; &nbsp; pres_state &lt;= st0 ;<br>
<br>
end case ;<br>
end if;<br>
end process ;<br>
end rtl ;

VVIC 发表于 2010-6-26 05:32:05

ENTITY __machine_name IS<br>
PORT<br>
(<br>
&nbsp;&nbsp;__clk&nbsp; &nbsp;&nbsp; &nbsp; : IN STD_LOGIC;<br>
&nbsp;&nbsp;__reset&nbsp; &nbsp;&nbsp; &nbsp; : IN STD_LOGIC;<br>
&nbsp;&nbsp;__input_name, __input_name&nbsp;&nbsp;: IN STD_LOGIC;<br>
&nbsp;&nbsp;__output_name, __output_name : OUT STD_LOGIC<br>
);<br>
END __machine_name;<br>
ARCHITECTURE a OF __machine_name IS<br>
TYPE STATE_TYPE IS (__state_name, __state_name, __state_name);<br>
SIGNAL state: STATE_TYPE;<br>
BEGIN<br>
PROCESS (clk, reset)<br>
BEGIN<br>
&nbsp;&nbsp;IF __reset = '1' THEN<br>
&nbsp; &nbsp;state &lt;= __state_name;<br>
&nbsp;&nbsp;ELSIF __clk'EVENT AND __clk = '1' THEN<br>
&nbsp; &nbsp;CASE state IS<br>
&nbsp; &nbsp; WHEN __state_name =&gt;<br>
&nbsp; &nbsp;&nbsp;&nbsp;IF __condition THEN<br>
&nbsp; &nbsp;&nbsp; &nbsp;state &lt;= __state_name;<br>
&nbsp; &nbsp;&nbsp;&nbsp;END IF;<br>
&nbsp; &nbsp; WHEN __state_name =&gt;<br>
&nbsp; &nbsp;&nbsp;&nbsp;IF __condition THEN<br>
&nbsp; &nbsp;&nbsp; &nbsp;state &lt;= __state_name;<br>
&nbsp; &nbsp;&nbsp;&nbsp;END IF;<br>
&nbsp; &nbsp; WHEN __state_name =&gt;<br>
&nbsp; &nbsp;&nbsp;&nbsp;IF __condition THEN<br>
&nbsp; &nbsp;&nbsp; &nbsp;state &lt;= __state_name;<br>
&nbsp; &nbsp;&nbsp;&nbsp;END IF;<br>
&nbsp; &nbsp;END CASE;<br>
&nbsp;&nbsp;END IF;<br>
END PROCESS;<br>
WITH state SELECT<br>
&nbsp;&nbsp;__output_name &lt;= __output_value WHEN __state_name,<br>
&nbsp; &nbsp;&nbsp; &nbsp; __output_value WHEN __state_name,<br>
&nbsp; &nbsp;&nbsp; &nbsp; __output_value WHEN __state_name;<br>
END a;<br>
<br>
<br>
这是标准状态机的写法.请参照下~<br>
<br>
[ 本帖最后由 playme119 于 2007-5-21 15:03 编辑 ]

ICE 发表于 2010-6-26 06:15:16

我觉得后来修改的那个与playme119给的模板基本一致,只是输出结果放在进程里面了<br>
不知道这个影响大吗?而且我也看了很多状态机的例子,输出都是放在进程里的

UFP 发表于 2010-6-26 06:47:27

这个时延是由状态机造成的还是其他原因呢<br>
当我把状态机去掉,直接给输出赋予一个值时,这个时延依然存在<br>
为什么?

CCIE 发表于 2010-6-26 07:35:45

怎么看不到图片???

CHAN 发表于 2010-6-26 08:36:06

怎么还是看不到图片,怎么回事?

AAT 发表于 2010-6-26 10:15:46

哈哈,看到图片了,原来是没有钱呀!!!物价都涨了,高呀
页: [1] 2
查看完整版本: VHDL状态机的时钟产生问题