Electronics 版 (精华区)

发信人: dsp (*将远行*), 信区: Electronics
标  题: [合集]求救:vhdl中的一个错误!
发信站: 哈工大紫丁香 (2004年04月17日08:47:55 星期六), 站内信件


────────────────────────────────────────
 dennis (Flying Pig)                  于 Wed Apr 14 17:08:13 2004 说道:

我要做一个双时钟控制的加减计数器,程序如下:


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

entity counter is
port(
CU,CD:IN std_logic;
Q:INOUT std_logic_vector(3 downto 0);
TCU,TCD:OUT std_logic
);
end counter;

architecture behavior of counter is
begin
add_process:process(CU,CD)
begin
if CU'event and CU='1' then
if CD='1' then 
   if Q= "1111" then
    TCU<='1';
    Q<= "0000";
   else 
Q<= Q+1;
   end if;
  else 
null;
  end if;
end if;
end process add_process;

sub_process:process(CD,CU)
begin
if CD'event and CD='1' then
if CU='1' then
if Q= "0000" then
TCD<='1';
Q<= "1111";
else 
Q<=Q-1;
end if;
else 
null;
end if;
end if;

end process sub_process;


end behavior;

编译时出错:signal'Q'has mutiple sources
help on message:
Your VHDL Design File includes two sources attached to one signal. MAX+PLUS II
 only allows a single source for each signal.
请问该如何解决?
谢谢!

────────────────────────────────────────
 freebird (远&我的四分之一世纪)       于 Wed Apr 14 18:46:02 2004 说道:

将q放到一个process中,用if语句判断up/down.




【 在 dennis 的大作中提到: 】
: 我要做一个双时钟控制的加减计数器,程序如下:


: library ieee;
: use ieee.std_logic_1164.all;
: use ieee.std_logic_unsigned.all;

: entity counter is
: port(
: CU,CD:IN std_logic;
: Q:INOUT std_logic_vector(3 downto 0);
: TCU,TCD:OUT std_logic
: );
: end counter;

: architecture behavior of counter is
: begin
: add_process:process(CU,CD)
: begin
: if CU'event and CU='1' then
: (以下引言省略...)

────────────────────────────────────────
 windowwindow (window)                于 Wed Apr 14 19:32:31 2004 说道:

我的理解:
你在两个PROCESS中给Q赋值当然要出错,这两个进程是并发的,你让它听谁的话?

────────────────────────────────────────
 leafxu (慢慢变老)                    于 Wed Apr 14 20:23:06 2004 说道:

改成这样试试!
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

entity counter is
port(
CU,CD:IN std_logic;
Q:INOUT std_logic_vector(3 downto 0);
TCU,TCD:OUT std_logic
);
end counter;

architecture behavior of counter is
signal Q0:std_logic_vector(3 downto 0);
begin
add_process:process(CU,CD)
begin
if CU'event and CU='1' then
if CD='1' then 
   if Q0= "1111" then
    TCU<='1';
    Q0<= "0000";
   else 
Q0<= Q0+1;
   end if;
  else 
null;
  end if;
end if;
end process add_process;

sub_process:process(CD,CU)
begin
if CD'event and CD='1' then
if CU='1' then
if Q0= "0000" then
TCD<='1';
Q0<= "1111";
else 
Q0<=Q0-1;
end if;
else 
null;
end if;
end if;

end process sub_process;
Q<=Q0;

end behavior;

────────────────────────────────────────
 dennis (Flying Pig)                  于 Thu Apr 15 15:37:45 2004 说道:

可以说明白点吗,我不太能理解你说的,具体应该怎么做?谢谢!
【 在 freebird 的大作中提到: 】
: 将q放到一个process中,用if语句判断up/down.




: 【 在 dennis 的大作中提到: 】
: : 我要做一个双时钟控制的加减计数器,程序如下:
: : 
: : 
: : library ieee;
: : use ieee.std_logic_1164.all;
: : use ieee.std_logic_unsigned.all;
: : 
: : entity counter is
: : port(
: : CU,CD:IN std_logic;
: : Q:INOUT std_logic_vector(3 downto 0);
: : TCU,TCD:OUT std_logic
: : );
: : end counter;
: (以下引言省略...)

────────────────────────────────────────
 dennis (Flying Pig)                  于 Thu Apr 15 15:39:35 2004 说道:

哦,明白了,实际上我做的这个里面两种情况是不可能同时发生的,应该怎么改呢?有建
议吗?谢谢!
【 在 windowwindow 的大作中提到: 】
: 我的理解:
: 你在两个PROCESS中给Q赋值当然要出错,这两个进程是并发的,你让它听谁的话?

────────────────────────────────────────
 dennis (Flying Pig)                  于 Thu Apr 15 15:50:10 2004 说道:

谢谢先!可是这个程序编译时也出同样错误:signal'Q0'has multiple sources
怎么改呢?有什么建议吗?
【 在 leafxu 的大作中提到: 】
: 改成这样试试!
: library ieee;
: use ieee.std_logic_1164.all;
: use ieee.std_logic_unsigned.all;

: entity counter is
: port(
: CU,CD:IN std_logic;
: Q:INOUT std_logic_vector(3 downto 0);
: TCU,TCD:OUT std_logic
: );
: end counter;

: architecture behavior of counter is
: signal Q0:std_logic_vector(3 downto 0);
: begin
: add_process:process(CU,CD)
: begin
: if CU'event and CU='1' then
:  if CD='1' then 
: (以下引言省略...)

────────────────────────────────────────
 leafxu (慢慢变老)                    于 Thu Apr 15 15:54:37 2004 说道:


你用什么控制加减呢?如果加个控制信号应该容易点

────────────────────────────────────────
 dennis (Flying Pig)                  于 Thu Apr 15 16:33:14 2004 说道:

两个时钟的上升沿分别对应加减计数。
【 在 leafxu 的大作中提到: 】

: 你用什么控制加减呢?如果加个控制信号应该容易点

────────────────────────────────────────
 leafxu (慢慢变老)                    于 Thu Apr 15 17:43:59 2004 说道:

这是不可能同时实现的,毕竟你输出的只是一个Q,一会加一会减,当然会冲突
如果说这是个两用的还行,你可以控制是加还是减,
比如加个使能oe,当oe为1时加,为0时减
【 在 dennis 的大作中提到: 】
: 两个时钟的上升沿分别对应加减计数。

────────────────────────────────────────
 Anthonyly (小飞飞)                   于 Thu Apr 15 21:47:17 2004 说道:

可以试试用一个process,定义一个变量的方法试试,用信号我感觉是行不通的。
【 在 raincold 的大作中提到: 】

────────────────────────────────────────
 faye (*真水无香*)                    于 Fri Apr 16 16:11:29 2004 说道:

虽然你设了两个进程,但是因为两个进程的敏感表完全一致,所以一旦一个进程触发了,

另一个也会触发。当两个进程同时触发时,都会应用到Q变量,一个家,一个减,这是造成

错误的原因。
这个Q是否你是关心的输出,如果不关心,把它放到结构体中,分别用Q1应用到加子函数中
,Q2应用到减子函数中,就好了
如果你的设计还需要关心当前计数的位置,因为你不能用一组参量表示家和减计数,建议

修改设计,或者增加标志位(当前是加or减),或者增加另一组输出
【 在 dennis 的大作中提到: 】
: 我要做一个双时钟控制的加减计数器,程序如下:


: library ieee;
: use ieee.std_logic_1164.all;
: use ieee.std_logic_unsigned.all;

: entity counter is
: port(
: CU,CD:IN std_logic;
: Q:INOUT std_logic_vector(3 downto 0);
: TCU,TCD:OUT std_logic
: );
: end counter;

: architecture behavior of counter is
: begin
: add_process:process(CU,CD)
: begin
: if CU'event and CU='1' then
: (以下引言省略...)

────────────────────────────────────────
 pfox (p狐狸)                         于 Fri Apr 16 17:10:48 2004 说道:

你可以再加一个clk信号作为同步
加减信号做成标志位
整个流程类似于状态机,每个状态都要察看标志位
例如加标志位上一状态为‘0’,现有状态为‘1’,那么就执行加一操作


【 在 dennis 的大作中提到: 】
: 哦,明白了,实际上我做的这个里面两种情况是不可能同时发生的,应该怎么改呢?..
: 议吗?谢谢!
: 【 在 windowwindow 的大作中提到: 】
: : 我的理解:
: : 你在两个PROCESS中给Q赋值当然要出错,这两个进程是并发的,你让它听谁的话?

────────────────────────────────────────
[百宝箱] [返回首页] [上级目录] [根目录] [返回顶部] [刷新] [返回]
Powered by KBS BBS 2.0 (http://dev.kcn.cn)
页面执行时间:2.742毫秒