错误(10028):Can';无法解析网络的多个常量驱动程序。。。VHDL错误

错误(10028):Can';无法解析网络的多个常量驱动程序。。。VHDL错误,vhdl,Vhdl,我正在尝试编写一个代码,它将检测din信号的上升沿,并在这之后将dout上升5个时钟周期。在编译过程中,我不断地遇到不同的错误,我不知道它们是什么意思。我想我对VHDL中的一些概念缺乏基本的理解,但遗憾的是,我在网上看了看,对我帮助不大。我仍然不知道软件可以接受哪些操作 在我的代码中,我目前在第一个进程中有一个上升沿检测器,它将dout提升到逻辑高。第二个过程检查dout是否为高,因此从5倒计时到0,并在0时将dout设置为逻辑低 这不会编译并返回以下错误: 错误(10028):无法解析rise

我正在尝试编写一个代码,它将检测din信号的上升沿,并在这之后将dout上升5个时钟周期。在编译过程中,我不断地遇到不同的错误,我不知道它们是什么意思。我想我对VHDL中的一些概念缺乏基本的理解,但遗憾的是,我在网上看了看,对我帮助不大。我仍然不知道软件可以接受哪些操作

在我的代码中,我目前在第一个进程中有一个上升沿检测器,它将dout提升到逻辑高。第二个过程检查dout是否为高,因此从5倒计时到0,并在0时将dout设置为逻辑低

这不会编译并返回以下错误:

错误(10028):无法解析rise\u ext.vhd(31)处净“计数[2]”的多个常量驱动程序

错误(10029):上升时的恒定驱动器外部vhd(17)

错误(10028):无法解析rise_ext.vhd(31)处净“计数[1]”的多个常量驱动程序

错误(10028):无法解析rise_ext.vhd(31)处净“计数[0]”的多个常量驱动程序

错误(10028):无法解析rise_ext.vhd(31)处网络“dout”的多个常量驱动程序

错误(10029):上升时的恒定驱动器外部vhd(19)

错误(12153):无法详细说明顶级用户层次结构

错误:Quartus II 32位分析与合成失败。7个错误,2个警告 错误:峰值虚拟内存:326 MB 错误:处理结束: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 ;
实体上升\外部为
端口(时钟:以位为单位;
重置n:以位为单位;
din:以位表示;
计数:缓冲区整数范围0到6;
dout:缓冲位);
端部上升;
建筑弧形上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升上升
信号s1、s2:位;
开始
过程(重置、时钟)
开始
如果resetN='0',则

dout您在这两个过程中都分配了
dout
count
。两者都不是已解析的信号

根据IEEE标准1076-1993:

12.6.1司机

process语句中的每个信号分配语句都为某些标量信号定义了一组驱动程序。处理语句中给定标量信号S有一个驱动程序,前提是该处理语句中至少有一个信号分配语句,并且该信号分配语句的目标信号的最长静态前缀表示或表示S是其子元素的复合信号每个这样的信号分配语句都被称为与该驱动程序关联。信号分配语句的执行只影响相关的驱动程序。

这实质上意味着您正在复制
count
dout


有很多方法可以模拟你想要的
dout
count
的行为。基于开始和结束事件将其操作分为两个过程不是其中之一。这将需要三个过程,一个用于生成事件,一个用于中断事件,一个用于时钟存储。您可能需要单独的事件来操作
计数

,因为您似乎对VHDL不熟悉,请记住以下规则:

您只能驱动来自一个进程的信号

您需要重新安排逻辑,以便只从一个进程驱动给定的信号。不要试图回避这个问题。使用
std\u ulogic
类型,编译器会在您很早就出错时告诉您

因此,在您的情况下,您需要将驱动
count
的“重置”部分移动到执行
count
递增的过程中



现在,当你积累了一些经验后,你会发现有时你需要在一个信号上有多个司机。这在对芯片外部(I2C总线、三态存储器总线等)建模时使用。但不适用于“芯片内部”代码。

模拟是否正确?从这些错误我猜不是…有没有可能它将正确模拟而不是编译?我可以用multisim检查…检查-不能用multisim模拟为什么不能用multisim模拟?所以你说类型应该是Std_Logic_1164?@user34920不,你需要组合两个时钟进程,以便在一个进程中分配这两个信号。试着想象一下,在编写代码时,将为代码合成什么样的硬件,你就会明白为什么需要更改它。不。查找错误消息:。简单地更改类型并不能解决问题,您将得到未知信息。您希望从一个进程(或一个并发信号分配语句)驱动这些信号。我不能用两个进程来解决这个问题吗?我以为其中一个是din的上升沿检测器,将设置dout,另一个是计数器,从5倒计时到0,0将清除dout。我知道查找Quartus错误消息可能会很痛苦,您显然无法按错误编号索引进行搜索,但需要了解错误。Quartus在内部将整数
count
作为数组类型,这并没有帮助。参见IEEE标准1076-1993 12.6.1驱动程序、12.6.4信号值传播和4.3.1.2信号声明。
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 ;