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不同,时延也不同 你是用的pres_state触发,而pres_state又是由时钟触发产生的,所以状态里面的pres_state触发要等到时钟触发后才执行,所以有延迟,我学verilog的,感觉是这样 建议状态机用时钟沿触发~! 谢谢playme119的回复,我按照您的建议,修正了一下程序,使用一个进程,时钟触发,但是还是有时延,当时钟周期为10ns时,时延大约为半个多周期,程序如下:<br>
<br>
library ieee ; <br>
use ieee.std_logic_1164.all ;<br>
<br>
entity cycles is <br>
port (<br>
clock_main,rst: in std_logic ;<br>
c0, c1, c2, c3 : out std_logic) ;<br>
end cycles ;<br>
architecture rtl of cycles is<br>
type state_values is (st0 , st1 , st2 , st3) ;<br>
signal pres_state: state_values ;<br>
begin<br>
<br>
process(rst,clock_main)<br>
begin<br>
if (rst='1') then<br>
pres_state <= st0 ;<br>
elsif (clock_main'event and clock_main= '1') then <br>
case pres_state is<br>
when st0 =><br>
c0 <= '1' ; <br>
c1 <= '0' ;<br>
c2 <= '0' ;<br>
c3 <= '0' ;<br>
pres_state <= st1 ;<br>
<br>
when st1 =><br>
c0 <= '0' ; <br>
c1 <= '1' ;<br>
c2 <= '0' ;<br>
c3 <= '0' ;<br>
pres_state <= st2 ;<br>
<br>
when st2 =><br>
c0 <= '0' ; <br>
c1 <= '0' ;<br>
c2 <= '1' ;<br>
c3 <= '0' ;<br>
pres_state<= st3 ;<br>
<br>
when st3 =><br>
c0 <= '0' ; <br>
c1 <= '0' ;<br>
c2 <= '0' ;<br>
c3 <= '1' ;<br>
pres_state <= st0 ;<br>
<br>
when others =><br>
pres_state <= st0 ;<br>
<br>
end case ;<br>
end if;<br>
end process ;<br>
end rtl ; ENTITY __machine_name IS<br>
PORT<br>
(<br>
__clk : IN STD_LOGIC;<br>
__reset : IN STD_LOGIC;<br>
__input_name, __input_name : IN STD_LOGIC;<br>
__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>
IF __reset = '1' THEN<br>
state <= __state_name;<br>
ELSIF __clk'EVENT AND __clk = '1' THEN<br>
CASE state IS<br>
WHEN __state_name =><br>
IF __condition THEN<br>
state <= __state_name;<br>
END IF;<br>
WHEN __state_name =><br>
IF __condition THEN<br>
state <= __state_name;<br>
END IF;<br>
WHEN __state_name =><br>
IF __condition THEN<br>
state <= __state_name;<br>
END IF;<br>
END CASE;<br>
END IF;<br>
END PROCESS;<br>
WITH state SELECT<br>
__output_name <= __output_value WHEN __state_name,<br>
__output_value WHEN __state_name,<br>
__output_value WHEN __state_name;<br>
END a;<br>
<br>
<br>
这是标准状态机的写法.请参照下~<br>
<br>
[ 本帖最后由 playme119 于 2007-5-21 15:03 编辑 ] 我觉得后来修改的那个与playme119给的模板基本一致,只是输出结果放在进程里面了<br>
不知道这个影响大吗?而且我也看了很多状态机的例子,输出都是放在进程里的 这个时延是由状态机造成的还是其他原因呢<br>
当我把状态机去掉,直接给输出赋予一个值时,这个时延依然存在<br>
为什么? 怎么看不到图片??? 怎么还是看不到图片,怎么回事? 哈哈,看到图片了,原来是没有钱呀!!!物价都涨了,高呀
页:
[1]
2