我正在尝试编写一个能够检测到din信号上升沿的代码,并在此发生后将dout提高5个时钟周期。我在编译时继续遇到不同的错误,我不确定它们是什么意思。我认为我对VHDL中的一些概念缺乏基本的了解,但遗憾的是在线查看并没有帮助我。我仍然不知道该软件可接受哪些操作。
在我的代码中,我目前在第一个过程中有一个上升沿检测器,它将dout提升到逻辑高。第二个过程检查dout是否为高电平,同时从5开始向下计数0,从0开始向dout计数到逻辑低电平。
这不会编译并返回以下错误:
错误(10028):无法解析net_ext.vhd(31)中net“count [2]”的多个常量驱动程序
错误(10029):在rise_ext.vhd(17)的常量驱动程序
错误(10028):无法解析net“count [1]”的多个常量驱动程序在rise_ext.vhd(31)
错误(10028):无法解析网络“count [0]”的多个常量驱动程序在rise_ext.vhd(31)
错误(10028):无法在rise_ext.vhd(31)解析net“dout”的多个常量驱动程序
错误(10029):在rise_ext.vhd(19)
的常量驱动程序错误(12153):无法详细说明顶级用户层次结构
错误:Quartus II 32位分析&合成不成功。 7个错误,2个警告 错误:峰值虚拟内存:326兆字节 错误:处理已结束:2014年1月11日星期六13:13:38 错误:已用时间:00:00:04 错误:总CPU时间(在所有处理器上):00:00:02
错误(293001):Quartus II完全编译失败。 9个错误,2个警告
entity rise_ext is
port ( clk: in bit ;
resetN: in bit ;
din: in bit ;
count: buffer integer range 0 to 6 ;
dout: buffer bit ) ;
end rise_ext ;
architecture arc_rise_ext of rise_ext is
signal s1 , s2 : bit ;
begin
process ( resetN, clk )
begin
if resetN = '0' then
dout <= '0' ;
count <= 5 ;
elsif clk'event and clk = '1' then
s1 <= din ;
s2 <= s1 ;
dout <= not s1 and s2 ;
end if ;
end process ;
process ( clk, dout )
begin
if clk'event and clk = '1' then
if dout = '1' then
if count > 0 then
count <= count - 1 ;
else
dout <= '0' ;
count <= 5 ;
end if;
end if ;
end if ;
end process ;
end arc_rise_ext ;
任何帮助将不胜感激!
我将所有数据类型更改为std_logic并完成了代码,但仍然出现了这些错误......
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity rise_ext is
port ( clk: in std_logic ;
resetN: in std_logic ;
din: in std_logic ;
count: buffer integer range 0 to 6 ;
dout: buffer std_logic ) ;
end rise_ext ;
architecture arc_rise_ext of rise_ext is
signal s1 , s2 : std_logic ;
begin
process ( resetN, clk )
begin
if resetN = '0' then
dout <= '0' ;
count <= 6 ;
elsif rising_edge(clk) then
s1 <= din ;
s2 <= s1 ;
dout <= not s1 and s2 ;
end if ;
end process ;
process ( clk )
begin
if rising_edge(clk) then
if dout = '1' then
count <= 5 ;
end if ;
end if ;
end process ;
process ( clk )
begin
if rising_edge(clk) then
if count = 0 then
count <= 6 ;
dout <= '0' ;
else
count <= count - 1 ;
end if ;
end if ;
end process ;
end arc_rise_ext ;
答案 0 :(得分:6)
您在两个进程中都分配了dout
和count
。两者都没有解决的信号。
来自IEEE Std 1076-1993:
12.6.1司机
进程语句中的每个信号赋值语句都为某些标量信号定义了一组驱动程序。如果在该进程语句中至少有一个信号赋值语句并且该信号赋值语句的目标信号的最长静态前缀表示S或表示a,则在进程语句中存在用于给定标量信号S的单个驱动器。复合信号,其中S是子元素。 据说每个此类信号分配语句都与该驱动程序相关联。执行信号赋值语句仅影响关联的驱动程序。
这实际上意味着您要复制count
和dout
。
有很多方法可以模拟您想要的dout
和count
的行为。基于开始和结束事件在两个进程中分叉它们的操作不是其中之一。这将需要三个进程,一个用于制作事件,一个用于中断事件,一个用于时钟存储。您可能需要单独的事件来操作count
。
答案 1 :(得分:2)
您似乎对VHDL不熟悉,请牢记此规则:
您只能从一个进程驱动信号。
您需要重新排列逻辑,以便仅从一个进程驱动给定信号。不要试图解决这个问题。使用std_ulogic
类型,编译器会在很早的时候告诉你错误。
因此,在您的情况下,您需要将驱动count
的“重置”部分移动到进行count
递增的过程中。
现在,当您积累了一些经验时,您会发现有时候需要在一个信号上拥有多个驱动程序。在对芯片外部(I2C总线,三态存储器总线等)进行建模时使用。但不是“芯片内部”代码。