VHDL FSM多驱动网Q连接到常量驱动程序,其他驱动程序被忽略,我的代码有什么问题?



此代码是一个FSM,它是一台摩尔机器

Alyssa p.Hacker有一只蜗牛顺着胶带往下爬上面有1和0。蜗牛每当最后两个微笑它爬过的数字是01.设计Moore和Mealy蜗牛大脑的FSM。

代码显示在下方

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity simpfsm is
Port ( A : in STD_LOGIC;
clk : in STD_LOGIC;
r   : in STD_LOGIC;
Y : out STD_LOGIC);
end simpfsm;

architecture Behavioral of simpfsm is
type state_type is (SA,SB,SC);
signal state,next_state:state_type;
begin
SYNC_PROC:process(clk)
begin
if(clk'event and clk='1') then
if(r='1') then
next_state <= SA; -- removed trailing grave accent
else
state <= next_state;
end if;
end if;
end process;
OUTPUT_DECODE:process(state)
begin
case (state) is
when SA =>
Y <= '0';
when SB =>
Y <= '0';
when SC =>
Y <= '1';
when others =>
Y <= '0';
end case;
end process;
NEXT_STATE_DECODE:process(state,A)
begin
next_state <= state;
case (state) is
when SA =>
if(A='0') then
next_state <= SB;
end if;
when SB =>
if(A='1') then
next_state <= SC;
end if;
when SC =>
if(A='0') then
next_state <= SB;
elsif(A='1') then
next_state <= SA;
end if;
when others =>
next_state <= SA;                       --"if not state then begin with SA"
end case;
end process;
end Behavioral;  -- removed trailing grave accent

错误为[XSIM 43-3249]文件D:/Users/93434/project_4/project_4.srcs/sources_1/new/A_11_fsm.vhd,第22行。未解决的信号"next_state"是乘驱动的。

state_type不是已解析的子类型。在细化过程中识别后,在模型执行之前的加载过程中检测到多个驱动程序。

IEEE Std 1076-2008

14.5报表部分的细化
14.5.5其他并发报表

所有其他并发语句要么是流程语句,要么是存在等效流程语句的语句。流程说明的细化过程如下:

a)详细阐述了流程声明部分
b)流程说明所需的驱动程序已确定。

6.4.2.3信号声明

。。。如果在详细描述之后,一个信号有多个来源,而它不是一个已解析的信号,那么这就是一个错误。。。

进程SYNC_PROC和NEXT_STATE_DECODE 中有next_state的驱动程序

14.7模型的执行
14.7.2驱动

流程语句中的每个信号赋值语句都为某些标量信号定义了一组驱动程序。对于过程语句中的给定标量信号S,存在单个驱动器,条件是该过程语句中至少有一个信号分配语句,并且该信号分配语句的目标信号的最长静态前缀表示S或表示S是其子元素的复合信号。每个这样的信号分配语句被认为与该驾驶员相关联。信号分配语句的执行仅影响相关的驱动器。

state_type是枚举类型,是标量类型:

5.2标量类型
5.2.1通用

标量类型包括枚举类型整数类型物理类型点类型

解决方案似乎是在SYNC_PROC中重置state,而不是next_state

如果你去掉两个无关的重音符号(",15.2字符集),你的代码将是一个最小、完整和可验证的例子,尽管Tricky表达了怀疑。我从您的代码示例中删除了它们,之后您的代码在处理SYNC_PROC:的更改后进行了分析和阐述

if(r='1') then
state <= SA;  -- WAS next_state

(请注意,条件(此处r="1")周围的括号是多余的。在VHDL中,已知条件是具有BOOLEAN值的表达式。)

如果你的模拟器允许使用顶级端口执行,它会报告多个驱动程序。对于那些没有的模拟器,你需要一个实例化simpfsm:的测试台

14.2设计层次的细化

实现可以允许,但不是必须允许,位于设计层次结构根的设计实体具有泛型和端口。如果一个实现允许这些顶级接口对象,它可能会以实现定义的方式限制它们允许的形式(即,是否允许它们是接口类型、子程序、包或对象),以及在接口对象的情况下,限制它们允许的类型和模式。

正如您可能了解到的,这代表了在没有测试台或依赖脚本驱动的交互式模拟器的情况下检测错误的可移植性问题。在信号分配目标改变之前,可以用ghdl证明错误:

ghdl-r simpfsm
用于信号:.simpfsm(行为).next_state
./simpfsm:错误:未解析信号的多个来源
/simpfsm:错误:细化过程中的错误

将详细的设计规范加载到内存中被推迟到基于编译器的VHDL模拟器中的"程序"执行:

14.2设计层次的细化

设计层次结构的细化完成如下:

在详细阐述流程语句(请参阅14.5.5)过程中确定的驱动程序已创建
--由与流程语句驱动的每个标量信号相关联的默认值定义的初始事务被插入到相应的驱动程序中。

next_statestate都具有state_type'LEFT(SA)的默认值。

6.4.2.3信号申报

在没有显式默认表达式的情况下,为标量子类型的信号或复合信号的每个标量子元素假设隐式默认值,每个标量子单元本身就是标量子类型。标量子类型T的信号的隐式默认值被定义为由T’LEFT给出的值。

这意味着当每个网络都被识别时,在精化的加载部分会检测到多个驱动程序:

14.7.3.4信号更新

net是驱动程序、信号(包括端口和隐含信号)、转换函数和分辨率函数的集合,这些函数共同决定了网络上每个信号的有效值和驱动值。

我们在精化的这一部分中看到(此处加载)发生在执行过程中(ghdl的-r命令):

14.2设计层次的细化

设计层次结构的细化创建了一个由网络互连的过程集合;然后可以执行这个过程和网络的集合来模拟设计的行为。

Tricky的怀疑在一定程度上是有效的,严重的口音会在分析过程中导致错误,而您提供的错误会在详细说明过程中发生。通过首先调查您报告的错误,可以假设它们是转录错误。

Next_stat在SYNC_PROC 的重置中被驱动

next_state<=SA;

并且还在NEXT_ STATE_。您不能从两个进程驱动它。

你也有一个额外的"没有充分理由"。这是真正的代码吗?

最新更新