125677|14

42

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

状态机的状态转换周期问题 [复制链接]

VHDL,状态机状态转换周期必须是固定周期的吗?? 比如说,CLK的周期不是固定的,可能10us出现一个上升沿,然后又过100us才出现另外一个上升沿,这样子可以吗?   我现在这里有个小设计,要求是通过IO口来控制功放的通断,16路IO口输出, 控制在同一时间只有一个功放工作。  但每个功放的工作时间不一样,有的是416us,有的是6ms,或者8ms,这中问题大家会如何处理呢。用状态机可以吗? 因为每个相互的时间也不是倍数关系,所以一直没想明白,我就想状态机的转换周期可以是非周期性的吗??
此帖出自FPGA/CPLD论坛

最新回复

给计数器的输出端再加一级寄存器,估计就OK了。 从附件的图上可以看到生成的时钟信号的组合逻辑非常长,一定要用寄存器打一拍。 global的作用是把内部信号转到芯片的时钟网络上。如果成功,就不再会有timing的问题了。所以,你可以再试一下,并在布线时注意下global有没有起作用。 如果不起作用,就再设定一个fanout的约束。具体可以参考下help.   详情 回复 发表于 2010-7-21 19:08
点赞 关注
 

回复
举报

113

帖子

0

TA的资源

一粒金砂(高级)

沙发
 
时钟是固定的,不同周期可以根据时钟做个倍数脉冲来控制
此帖出自FPGA/CPLD论坛
 
 

回复

325

帖子

0

TA的资源

裸片初长成(初级)

板凳
 

回复 楼主 yaxuangela 的帖子

CLK是时钟哈,要是像你那样就不叫时钟了。你功放之间切换是用时间来作为切换信号还是有其他信号作为切换信号的?如果用时间的话,那就用计数器来计时,如果用其他信号那就检测其他信号。
此帖出自FPGA/CPLD论坛
个人签名科技应该让生活变得更简单!
 
 
 

回复

42

帖子

0

TA的资源

一粒金砂(初级)

4
 
Warning: Circuit may not operate. Detected 14 non-operational path(s) clocked by clock "clk" with clock skew larger than data delay. See Compilation Report for details.
有这么个报错,
高手能抽点时间帮我看看吗?  因为是自学,所以很多东西不明白,公司又没人教,进展缓慢啊,能请大家帮我看下程序吗?  我自己都觉得好像不能这么写啊。
此帖出自FPGA/CPLD论坛
 
 
 

回复

42

帖子

0

TA的资源

一粒金砂(初级)

5
 
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;

entity AD_generate is
port( clk: in std_logic;
      rst: in std_logic;

      dout: out std_logic_vector(15 downto 0)
    );
end ad_generate;

architecture ver1 of ad_generate is
signal count:std_logic_vector(13 downto 0);
signal clk_48:std_logic;
type state is(r0,r1,g12,g11,g10,g9,g8,g7,g6,g5,g4,g3,g2,g1,g0,g0_1);
signal current_state,next_state:state;

begin

HZ24M:process(clk,rst)
begin
if (rst='0')
then count<=(others=>'0');
  elsif(clk'event and clk='1')
   then if (count<9999)
    then   count<=count+1;
   else count<=(others=>'0');
end if;
end if;
end process;

HZ48K:process( count)
begin
if(count<5000)
then clk_48<='1';
else clk_48<='0';
end if;
end process;

reg:process(clk_48,rst)
begin
if(rst='0') then current_state<=r0;
elsif(clk_48'event and clk_48='1') then
current_state<=next_state;
end if;
end process;

com:process( current_state)
begin
case current_state is
when r0 => next_state<=r1;
when r1 => next_state<=g12;
when g12 => next_state<=g11;
when g11 => next_state<=g10;
when g10 => next_state<=g9;
when g9 => next_state<=g8;
when g8 => next_state<=g7;
when g7 => next_state<=g6;
when g6 => next_state<=g5;
when g5 => next_state<=g4;
when g4 => next_state<=g3;
when g3 => next_state<=g2;
when g2 => next_state<=g1;
when g1 => next_state<=g0;
when g0 => next_state<=g0_1;
when g0_1 => next_state<=r0;
when others => next_state<=r0;
end case;
end process;

com1:process(current_state)
begin
case current_state is
when r0 => dout<="1111111011111111";
when r1 => dout<="1111110111111111";
when g12=> dout<="1111101111111111";
when g11=> dout<="1111011111111111";
when g10=> dout<="1110111111111111";
when g9 => dout<="1101111111111111";
when g8 => dout<="1011111111111111";
when g7 => dout<="0111111111111111";
when g6 => dout<="1111111111111110";
when g5 => dout<="1111111111111101";
when g4 => dout<="1111111111111011";
when g3 => dout<="1111111111110111";
when g2 => dout<="1111111111101111";
when g1 => dout<="1111111111011111";
when g0 => dout<="1111111110111111";
when g0_1=>dout<="1111111101111111";
when others=> dout<="1111111111111111";
end case;
end process;


end ver1;
此帖出自FPGA/CPLD论坛
 
 
 

回复

130

帖子

0

TA的资源

纯净的硅(高级)

6
 

这是时钟延迟的问题

状态机采用了计数器输出作为时钟信号,由于这是一个内部信号,驱动不同的寄存器时,由于走线的延迟造成时钟沿到达各个寄存器的时延不同,而且超过了一个时钟周期。这会使电路功能出错。 解决的方法是采用锁相环作为分频器,或者在内部增加一个GLOBAL buffer
此帖出自FPGA/CPLD论坛
 
 
 

回复

325

帖子

0

TA的资源

裸片初长成(初级)

7
 

回复 5楼 yaxuangela 的帖子

应该把你process(current_state)这个进程换程时序逻辑,以clk作为敏感信号的哈。
此帖出自FPGA/CPLD论坛
个人签名科技应该让生活变得更简单!
 
 
 

回复

42

帖子

0

TA的资源

一粒金砂(初级)

8
 
我用的是max ii ,  没有锁相环内部,   globle buffer 怎么加啊?、  会不会是我引脚没锁定的原因,如果我锁定的管脚是不是会好些。
此帖出自FPGA/CPLD论坛
 
 
 

回复

130

帖子

0

TA的资源

纯净的硅(高级)

9
 

global buffer

在help里面找一个叫 GLOBAL 的元件,例化到设计中,把计数器输出接到GLOBAL的输入上,把GLOBAL的输出接到寄存器时钟上就行了。  这和引脚锁定没关系。
此帖出自FPGA/CPLD论坛
 
 
 

回复

42

帖子

0

TA的资源

一粒金砂(初级)

10
 
HDL world兄:  谢谢你的回答啊。  但是我在help里面的LPM里面例化了global,还是没作用啊,那个警告还是有,而且仿真也还是错误。  我看它里面的说明,是不是例化global需要把某个文件放到目录下呢??
此帖出自FPGA/CPLD论坛
 
 
 

回复

130

帖子

0

TA的资源

纯净的硅(高级)

11
 

你把例化的代码贴出来

可能是你例化的不对。
此帖出自FPGA/CPLD论坛
 
 
 

回复

42

帖子

0

TA的资源

一粒金砂(初级)

12
 
恩,我贴出来哦, 是ateara 的maxii    麻烦你看一下是不是存在根本性的错误,就是说,完全不能这么写的。  谢谢哦。   我也不知道为什么了。
library ieee;
LIBRARY altera;
USE altera.altera_primitives_components.all;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;

entity AD_generate is
port( clk: in std_logic;
      rst: in std_logic;

      dout: out std_logic_vector(15 downto 0)
    );
end ad_generate;

architecture ver1 of ad_generate is
signal count:std_logic_vector(13 downto 0);
signal clk_48:std_logic;
type state is(r0,r1,g12,g11,g10,g9,g8,g7,g6,g5,g4,g3,g2,g1,g0,g0_1);
signal current_state,next_state:state;
component global

    port (

        a_in : in std_logic;

        a_out : out std_logic);

end component;
signal clk_state:std_logic;

begin
U1: global port map (a_in=>clk_48,a_out=>clk_state);

HZ24M:process(clk,rst)
begin
if (rst='0')
then count<=(others=>'0');
  elsif(clk'event and clk='1')
   then if (count<9999)
    then   count<=count+1;
   else count<=(others=>'0');
end if;
end if;
end process;

HZ48K:process( count)
begin
if(count<5000)
then clk_48<='1';
else clk_48<='0';
end if;
end process;

reg:process(clk_state,rst)
begin
if(rst='0') then current_state<=r0;
elsif(clk_state'event and clk_state='1') then
current_state<=next_state;
end if;
end process;

com:process( current_state)
begin
case current_state is
when r0 => next_state<=r1;
when r1 => next_state<=g12;
when g12 => next_state<=g11;
when g11 => next_state<=g10;
when g10 => next_state<=g9;
when g9 => next_state<=g8;
when g8 => next_state<=g7;
when g7 => next_state<=g6;
when g6 => next_state<=g5;
when g5 => next_state<=g4;
when g4 => next_state<=g3;
when g3 => next_state<=g2;
when g2 => next_state<=g1;
when g1 => next_state<=g0;
when g0 => next_state<=g0_1;
when g0_1 => next_state<=r0;
when others => next_state<=r0;
end case;

end process;

com1:process(current_state)
begin
case current_state is
when r0 => dout<="1111111011111111";
when r1 => dout<="1111110111111111";
when g12=> dout<="1111101111111111";
when g11=> dout<="1111011111111111";
when g10=> dout<="1110111111111111";
when g9 => dout<="1101111111111111";
when g8 => dout<="1011111111111111";
when g7 => dout<="0111111111111111";
when g6 => dout<="1111111111111110";
when g5 => dout<="1111111111111101";
when g4 => dout<="1111111111111011";
when g3 => dout<="1111111111110111";
when g2 => dout<="1111111111101111";
when g1 => dout<="1111111111011111";
when g0 => dout<="1111111110111111";
when g0_1=>dout<="1111111101111111";
when others=> dout<="1111111111111111";
end case;

end process;


end ver1;
此帖出自FPGA/CPLD论坛
 
 
 

回复

130

帖子

0

TA的资源

纯净的硅(高级)

13
 

再加一级寄存器

给计数器的输出端再加一级寄存器,估计就OK了。 从附件的图上可以看到生成的时钟信号的组合逻辑非常长,一定要用寄存器打一拍。 global的作用是把内部信号转到芯片的时钟网络上。如果成功,就不再会有timing的问题了。所以,你可以再试一下,并在布线时注意下global有没有起作用。 如果不起作用,就再设定一个fanout的约束。具体可以参考下help.

logic.jpg (1.02 MB, 下载次数: 0)

logic.jpg
此帖出自FPGA/CPLD论坛
 
 
 

回复

42

帖子

0

TA的资源

一粒金砂(初级)

14
 
谢谢哦:我在计数器输出加了一级寄存器,然后就没那个警告了, 我想问下:
1)你这个图形不是quartus中得到的吧,用其他的工具得到的嘛??
2) 在quartus11中只能用RTL  viewer 来看来看图形吗??  有没有其他的方法看图形呢。
3) 我怎么在布线的时候知道global起作用了没呢??  惭愧一下,我都是全编译加时序仿真的呵呵,哪些约束重要,要加,可以帮我解释解释吗?? tco,th,tsu,fmax这些参数怎么去设定了,现在都没什么概念。
4) fanout约束如何加呢??  看来得多看看书了。   
如果哪位高人有时间的话,可否帮我解答一下呵呵。  初学,问题比较弱智,谢谢大家了。
此帖出自FPGA/CPLD论坛
 
 
 

回复

42

帖子

0

TA的资源

一粒金砂(初级)

15
 
顶上去啊呵呵。
此帖出自FPGA/CPLD论坛
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表