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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
12
返回列表 发新帖
楼主: dsj11521

Can't resolve multiple constant drivers

[复制链接]
发表于 2009-1-11 19:48:04 | 显示全部楼层

解决方法

同一信号不能在不同得进程中赋值的解决办法
源程序:library ieee;
use ieee.std_logic_1164.all;
entity counter is
port(y,clk0:in std_logic;
    s1 :out std_logic);
end counter;
architecture rtl of counter is
signal en:std_logic;
begin
process(clk0)
variable i:integer;
begin
if(clk0'event and clk0='1')then
if(en='1')then
if(i=20)then
i:=0;
en<='0';
s1<=y;
else
s1<='0';
i:=i+1;
end if;
end if;
end if;
end process;
process(y)
begin
if(y'event and y='1')then
en<='1';
end if;
end process;
end rtl;
实现的功能:在输入y上升沿时计数,计数期间输出低电平,当计数到20个clk后计数结束,完后输出y的波形

出现的错误:Error (10028): Can't resolve multiple constant drivers for net "en" at test.vhd(30)


错误分析:误用Process经常会引起输出多驱动源的发生,即在两个以上的进程内对同一信号赋值操作。以下程序就出现了这类情况:

⑴ Proc_a: process(clk)

⑵ begin

⑶ if clk’event and clk=’1’ then

⑷ Dout<=Din_A;

⑸ end if

⑹ end process;;



⑻ Proc_b:process(sel_en)

⑼ begin

⑽ if sel_en=’1’ then

⑾ Dout<=Din_B;

⑿ end if;

⒀ end process;

进程Proc_a和Proc_b中都出现了对Dout的赋值语句,设计者原本的想法是,只要合理控制好clk和sel_en输入,使其不发生冲突,即clk上升沿时sel_en不为’1’;sel_en为’1’时,不出现clk的上升沿,这样Proc_a,Proc_b两个进程就不会发生冲突。但综合时,综合工具会将所有可能情况全部罗列进去,包括第⑶行和第⑽行同时成立的情况,此时对于Dout就有Din_A和Din_B两个输入驱动,Dout不知接收哪一个,因此该程序无法综合,改正的方法是只要将两个进程合并成一个即可

正确的程序:library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

entity test is
port(y,clk0: in std_logic;
    s1: out std_logic;
    debug_a: out std_logic);
end test;
architecture rtl of test is
signal en:std_logic;
signal i: integer range 0 to 30;--整形数据一定要指定范围,否则有意想不到的问题
signal temp:std_logic;
begin
process(clk0)

begin
if(clk0'event and clk0='1')then
   if(en='1')then
      if(i=20)then
         i<=0;
         s1<=y;
         debug_a<='1';
         temp<='1';
      else
         s1<='0';
         i<=i+1;
         debug_a<='0';
         temp<='0';
      end if;
   elsif (temp='1')  then
      s1<=y;temp<='0';
   else   s1<=y;
   end if;
end if;
end process;

process(y,temp)
begin
if (temp='1') then
    en<='0';
   
elsif  (y'event and y='1') then
    en<='1';           

end if;
end process;
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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


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

GMT+8, 2024-12-27 19:13 , Processed in 0.014491 second(s), 8 queries , Gzip On, Redis On.

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