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毫秒