在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 5069|回复: 12

[讨论] 大家来看看这两段小程序有什么差别

[复制链接]
发表于 2011-3-23 09:05:53 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
1.
signal cnt : integer range 0 to 8;
elsif clk'event and clk = '1' then
   if cnt = 8 then
      cnt <= 0;
      led <= '1';
   else
      cnt <= cnt + 1;
      led <= '0';
   end if;
end if;
2.
signal cnt : integer range 0 to 7;
elsif clk'event and clk = '1' then
   if cnt = 7 then
      cnt <= cnt + 1;
      led <= '1';
   else
      cnt <= cnt + 1;
      led <= '0';
   end if;
end if;

我有两个问题:
1.程序2中我定义cnt的范围是0-7,当cnt=7时执行cnt=cnt+1代码时,会产生溢出,针对这个溢出,FPGA内部是如何操作的呢,是不理睬还是怎样呢?
2.时序仿真后,程序1比程序2多了一个时钟的空闲操作,如果要实现精确的计数,是不是移位寄存器的方法更适合呢?

希望大家踊跃发言。
 楼主| 发表于 2011-3-23 09:28:21 | 显示全部楼层
自己顶一下!!!
发表于 2011-3-23 09:45:51 | 显示全部楼层
你这是软件思维。硬件是2进制,只有0和1跳转,你想想7+1该怎么翻转?
计数器没必要用int,用std_logic_vector
 楼主| 发表于 2011-3-23 10:37:15 | 显示全部楼层
回复 3# falloutmx


   7+1=1000,我的疑问是我定义的是3位寄存器,那这个进位的‘1’是丢失了吗?FPGA内部对这个进位会是怎样的一种操作呢?
非常感谢你的参与。
发表于 2011-3-23 10:53:34 | 显示全部楼层
LZ可以把整个程序都贴上来么??我想仿真一下,谢谢!!
发表于 2011-3-23 11:09:13 | 显示全部楼层
表面上你用的是integer,其实在芯片内部还是将其转换为二进制来实现。
建议你的程序这么改:
signal cnt : integer range 0 to 7;
elsif clk'event and clk = '1' then
   if cnt = 7 then
      cnt <= 0;
      led <= '1';
   else
      cnt <= cnt + 1;
      led <= '0';
   end if;
end if;
 楼主| 发表于 2011-3-23 11:20:20 | 显示全部楼层
回复 5# lllccc123


    好的。
1。
entity test is
port(
     clk : in std_logic;
     nrst : in std_logic;
     led : out std_logic
     );
end test;

architecture RTL of test is

signal cnt : integer range 0 to 7;

begin
process(clk,nrst)
begin
if nrst = '0' then
   cnt <= 0;
   led <= '0';
elsif clk'event and clk = '1' then
   if cnt = 7 then
      led <= '1';
      cnt <= cnt + 1;
   else
      cnt <= cnt + 1;
      led <= '0';
   end if;
end if;
end process;

end RTL;


2.
entity test is
port(
     clk : in std_logic;
     nrst : in std_logic;
     led : out std_logic
     );
end test;

architecture RTL of test is

signal cnt : integer range 0 to 8;

begin
process(clk,nrst)
begin
if nrst = '0' then
   cnt <= 0;
   led <= '0';
elsif clk'event and clk = '1' then
   if cnt = 8 then
      led <= '1';
      cnt <= 0;
   else
      cnt <= cnt + 1;
      led <= '0';
   end if;
end if;
end process;

end RTL;
 楼主| 发表于 2011-3-23 11:29:57 | 显示全部楼层
回复 6# zhangtaozt


    signal cnt : integer range 0 to 7;
elsif clk'event and clk = '1' then
   if cnt = 7 then
      cnt <= 0;
      led <= '1';
   else
      cnt <= cnt + 1;
      led <= '0';
   end if;
end if;

原来应该是这样,呵呵,仿真结果和
  if cnt = 7 then
      cnt <= cnt + 1;
      led <= '1';
是一样的,但是肯定是上面一种写法好,但是我还是想知道如果采用下面一种写法,FPGA内部逻辑实现是不是有可能出错呢?
呵呵,一点疑惑,万分感谢!
发表于 2011-3-23 13:34:27 | 显示全部楼层
回复 4# enderborns


你用的是integer,怎么会是3位寄存器呢?理解上有偏差吧。如果你用integer定义的cnt,来执行这两个程序,第二个就是比第一个多一个时钟周期的计数;如果你是定义的4位寄存器,效果同前;如果是3位寄存器,那么第2段代码7过后就是0了,不会出现8的情况,而且可能也会报错,说cnt的位数不匹配,具体是不是能报错,你编译看看吧。
发表于 2011-3-23 13:41:50 | 显示全部楼层
不会出错。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-11-22 03:14 , Processed in 0.036524 second(s), 9 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表