【问题标题】:Edit - Can't Infer Register Because It's Behavior Does Not Match Any Supported Register Model VHDL编辑 - 无法推断寄存器,因为它的行为与任何支持的寄存器模型 VHDL 都不匹配
【发布时间】:2017-04-16 17:43:22
【问题描述】:

这是我提出的另一个问题的一个分支。我将更深入地解释我正在尝试做什么以及它不喜欢什么。这是一个学校项目,不需要遵循标准。

我正在尝试制作 SIMON 游戏。现在,我想要做的是使用一个开关盒来控制级别,并且每个级别都应该更快(因此不同的分频器)。第一级应该是第一个频率,LED 的图案应该点亮和消失。在我放入开关盒之前,第一级是单独的(没有第二级的东西),它像应该的那样亮起来又消失了。我还使用了compare = 0 来比较输出和输入。 (用户应该按照他们看到的光模式打开开关)。这在第一级单独存在时有效,但现在它在开关盒中,它不喜欢compare。我不确定如何解决这个问题以便将输出与输入进行比较。

我得到的错误与以前相似:

错误 (10821):FP.vhd(75) 处的 HDL 错误:无法推断“比较”的寄存器,因为它的行为与任何支持的寄存器模型都不匹配

错误 (10821):FP.vhd(75) 处的 HDL 错误:无法推断“count[0]”的寄存器,因为它的行为与任何支持的寄存器模型都不匹配

错误 (10821):FP.vhd(75) 处的 HDL 错误:无法推断“count[1]”的寄存器,因为它的行为与任何支持的寄存器模型都不匹配

错误 (10821):FP.vhd(75) 处的 HDL 错误:无法推断“count[2]”的寄存器,因为它的行为与任何支持的寄存器模型都不匹配

错误 (10822):FP.vhd(80) 处的 HDL 错误:无法在此时钟沿实现分配寄存器

错误 (10822):FP.vhd(102) 处的 HDL 错误:无法在此时钟沿实现分配寄存器

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

我也知道它不喜欢rising_edge(toggle),但我需要它才能使 LED 图案亮起和消失。

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
use ieee.std_logic_unsigned.all;

entity FP is
    port(
    clk, reset : in std_logic;
    QF : out std_logic_vector (3 downto 0);
    checkbtn : in std_logic;
    Switch : in std_logic_vector(3 downto 0);
    sel : in std_logic_vector (1 downto 0);
    score : out std_logic_vector (6 downto 0)

    );
end FP;

architecture behavior of FP is

signal time_count: integer:=0;
signal toggle : std_logic;
signal toggle1 : std_logic;
signal count : std_logic_vector (2 downto 0);
signal seg : std_logic_vector (3 downto 0);
signal compare : integer range 0 to 1:=0;
type STATE_TYPE is (level1, level2);
signal level : STATE_TYPE;    
--signal input : std_logic_vector (3 downto 0);
--signal sev : std_logic_vector (6 downto 0);
begin

process (clk, reset, sel)
    begin
        if (reset = '0') then
            time_count <= 0;
            toggle <= '0';
        elsif rising_edge (clk) then
            case sel is
            when "00" =>
                if (time_count = 1249999) then
                        toggle <= not toggle;
                        time_count <= 0;
                    else
                        time_count <= time_count+1;
                    end if;            
            when "01" =>
                if (time_count = 2499999) then
                    toggle1 <= not toggle1;
                    time_count <= 0;
                else
                    time_count <= time_count+1;
                    end if;
            when "10" =>
                if (time_count = 4999999) then
                    toggle <= not toggle;
                    time_count <= 0;
                else
                    time_count <= time_count+1;
                    end if;
            when "11" =>
                if (time_count = 12499999) then
                    toggle <= not toggle;
                    time_count <= 0;
                else
                    time_count <= time_count+1;
                end if;
            end case;
        end if;
    end process;



Process (toggle, compare, switch)
    begin                

    case level is
    when level1 =>
        if sel = "00" then
            count <= "001"; 
            seg <= "1000";
        elsif (rising_edge (toggle)) then
            count <= "001";
            compare <= 0;
            if (count = "001") then
                count <= "000";
            else
            count <= "000";
            end if;
        end if;

        if (switch = "1000") and (compare = 0) and (checkbtn <= '0') then
            score <= "1111001";
            level <= level2;
        else
            score <= "1000000";
            level <= level1;
        end if;

    when level2 =>
        if sel = "01" then
            count <= "010";
            seg <= "0100";
        elsif (rising_edge (toggle1)) then
            count <= "010";
            compare <= 1;
            if (count = "010") then
                count <= "000";
            else
            count <= "000";
            end if;
        end if;

        if (switch = "0100") and (compare = 1) and (checkbtn <= '0') then
            score <= "0100100";
        else
            score <= "1000000";
            level <= level1;
        end if;
    end case;


    case count is
        when "000"=>seg<="0000";
        when "001"=>seg<="1000";
        when "010"=>seg<="0100";
        when "011"=>seg<="0110";
        when "100"=>seg<="0011";
        when others=>seg<="0000";
    end case;    
end process;


QF <= seg;
end behavior;

再次提前致谢!

【问题讨论】:

  • 我在之前的编辑中修复了你的布局,但你恢复了它......我不知道你为什么这样做,但这是在浪费我的时间......
  • 我编辑了我的问题,因为它之前略有不同。我写了另一个问题,但我被要求编辑我的旧问题,所以我这样做了。对不起
  • 哦,可以发表评论了:) 所以我编辑了你的帖子。拥有正确预期的代码非常重要。我很快就会对我的答案进行编辑。

标签: vhdl fpga intel-fpga


【解决方案1】:

嗯...很难说哪里出了问题,因为这个状态机的写法是错误的。您应该寻找有关在 VHDL 中正确建模 FSM 的参考资料。一个很好的例子是here。 如果您使用 Quartus,您还可以查找 Altera 关于如何专门为他们的编译器建模 FSM 的描述。

我现在只给你两个建议。首先是你不应该(或者甚至你不能)使用两个

if rising_edge (clk)

签入一个进程。如果您的进程应该在时钟边缘敏感,请在开始时编写一次。

第二件事是,如果你想用一个同步重置的进程对 FSM 建模,那么只需将 clk 放在敏感度列表中。

问题和代码编辑后编辑:

好的,现在好多了。但还有几件事:

  1. 您的 FSM 仍未达到应有的水平。再次查看我在上面给您的源代码中的示例,然后将其编辑为像那里一样,或者使其成为一个进程 FSM,就像在这个 link 中的示例一样。
  2. 打算!很重要。在我在您的代码中做出适当的意图之前,我无法发现一些明显的错误。这让我...
  3. 查看您为计数赋值的位置,尤其是 if 语句。无论如何,您分配相同的值“000”。
  4. 与另一个信号类似的故事 - 段。您在此过程中为其分配了一些值,然后在此过程结束时有一个 case 语句,您在其中为其分配了一些其他值,从而使之前的分配变得无关紧要。
  5. 在进程中仅使用一次rising_edge,仅用于时钟,并且仅在进程开始时使用,或者以您在第一个进程中所做的方式使用异步重置。在第二个过程中,您完成了所有这三件事。
  6. 在使用rising_edge 的顺序过程中,就像第一个一样,除了时钟之外,您不必将任何其他内容放入敏感度列表中,如果它是异步的,则重新设置,就像您的情况一样。
  7. 第二个进程中的敏感度列表。这是并行过程,所以你应该放在那里你签入一个进程的信号,并且可以在它之外改变。这不是比较的情况。但应该有信号:level、sel 和 toggle1。

由于我仍然不确定您要实现什么目标,因此我不会告诉您具体要做什么。根据以上几点修复您的代码,然后它可能会起作用。

【讨论】:

  • 谢谢!我有 2 个时钟的唯一原因是因为我想在每个级别更改计数器的速度。我已将时钟移到 FSM 外部,但它仍然不喜欢它,但我会尝试修复状态机。再次感谢
  • 如果这个答案让您满意,请采纳。谢谢:)如果您在修机后仍然有问题,请用新代码修改您的问题,我会看看它。
  • 我知道如何构建一个基本的 FSM,但为了让它的“SIMON”方面工作,我需要不同级别的不同时钟,我不确定如何处理。我需要下一个案例有一个不同的段,因为我希望下一个级别有一个新的 LED 模式。另外,我需要一些方法来打开和关闭灯,这就是切换的用途,所以我不确定如何让它打开然后自动关闭。不确定这是否有意义,但请告诉我!
  • 如果您尝试以错误的方式对 FSM 进行建模,它将无法正常工作。这是肯定的。我无法为您提供更多帮助,因为我仍然不明白您要达到什么目的。更好地描述你的输入、输出和信号,并详细描述你想要做什么(我知道西蒙游戏是什么,但不知道这与我在你的代码中看到的内容有什么联系)
猜你喜欢
  • 1970-01-01
  • 2020-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-25
  • 1970-01-01
相关资源
最近更新 更多