我正在尝试编写一个代码来检测din信号的上升沿,并在此发生后将dout提高5个时钟周期.我在编译时继续遇到不同的错误,我不确定它们是什么意思.我认为我对VHDL中的一些概念缺乏基本的了解,但遗憾的是在线查看并没有帮助我.我仍然不知道软件可以接受哪些操作.
在我的代码中,我目前在第一个进程中有一个上升沿检测器,它将dout提升到逻辑高.第二个过程检查dout是否为高电平,同时从5开始向下计数0,从0开始向下计数从逻辑低电平开始.
这不会编译并返回以下错误:
错误(10028):无法解析net_ext.vhd(31)中net"count [2]"的多个常量驱动程序
错误(10029):在rise_ext.vhd上的常量驱动程序(17)
错误(10028):无法解析网络"count [1]"的多个常量驱动程序在rise_ext.vhd(31)
错误(10028):无法在rise_ext.vhd(31)解析net"count [0]"的多个常量驱动程序
错误(10028):无法在rise_ext.vhd解析net"dout"的多个常量驱动程序(31)
错误(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 ;
Run Code Online (Sandbox Code Playgroud)
任何帮助将不胜感激!
我将所有数据类型更改为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 ;
Run Code Online (Sandbox Code Playgroud)
您拥有dout并count分配了两个流程.两者都没有解决的信号.
来自IEEE Std 1076-1993:
12.6.1司机
进程语句中的每个信号赋值语句都为某些标量信号定义了一组驱动程序.如果在该进程语句中至少有一个信号赋值语句并且该信号赋值语句的目标信号的最长静态前缀表示S或表示a,则在进程语句中存在用于给定标量信号S的单个驱动器.复合信号,其中S是子元素.据说每个这样的信号分配语句与该驱动器相关联.执行信号赋值语句仅影响关联的驱动程序.
这实际上意味着你要复制count和dout.
有很多种方法,以行为建模dout和count你的愿望.基于开始和结束事件在两个进程中分叉它们的操作不是其中之一.这将需要三个进程,一个用于制作事件,一个用于中断事件,一个用于时钟存储.您可能需要单独的事件来进行操作count.
当您似乎对 VHDL 不太熟悉时,请记住以下规则:
您只能从一个进程驱动一个信号。
您需要重新安排逻辑,以便给定信号仅由一个进程驱动。不要试图解决这个问题。使用std_ulogic类型,编译器会在你很早就犯错时告诉你。
因此,在您的情况下,您需要将驱动器的“重置”部分移动count到进行 递增的过程中count。
现在,当您积累了一些经验后,您会发现有时需要在单个信号上使用多个驱动程序。这在对芯片外部(I2C 总线、三态存储器总线等)进行建模时使用。但不适用于“芯片内部”代码。