集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 5453|回复: 14

VHDL状态机的时钟产生问题

[复制链接]
inter 发表于 2010-6-26 01:00:19 | 显示全部楼层 |阅读模式
本帖最后由 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 下一条

QQ|小黑屋|手机版|Archiver|fpga论坛|fpga设计论坛 ( 京ICP备20003123号-1 )

GMT+8, 2025-5-6 18:02 , Processed in 0.127779 second(s), 24 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表