编辑-可以';t推断寄存器,因为它';的行为与任何受支持的寄存器模型VHDL不匹配
这是我问的另一个问题的一个分支。我将更深入地解释我正在尝试做什么以及它不喜欢什么。这是一个学校项目,不需要遵循标准 我正在尝试制作SIMON游戏。现在,我想做的是使用一个电平开关盒,每个电平都应该更快(因此不同的分频器)。第一级应该是第一频率,LED的模式应该是亮起和消失。在我放入开关盒之前,第一层是独立的(没有第二层的东西),它像它应该的那样亮起来消失了。我还使用了编辑-可以';t推断寄存器,因为它';的行为与任何受支持的寄存器模型VHDL不匹配,vhdl,fpga,intel-fpga,Vhdl,Fpga,Intel Fpga,这是我问的另一个问题的一个分支。我将更深入地解释我正在尝试做什么以及它不喜欢什么。这是一个学校项目,不需要遵循标准 我正在尝试制作SIMON游戏。现在,我想做的是使用一个电平开关盒,每个电平都应该更快(因此不同的分频器)。第一级应该是第一频率,LED的模式应该是亮起和消失。在我放入开关盒之前,第一层是独立的(没有第二层的东西),它像它应该的那样亮起来消失了。我还使用了compare=0来比较输入和输出。(用户应该按照他们看到的灯光模式翻转开关)。这在第一个级别单独运行时起作用,但现在它位于开关盒
compare=0
来比较输入和输出。(用户应该按照他们看到的灯光模式翻转开关)。这在第一个级别单独运行时起作用,但现在它位于开关盒中,它不喜欢compare
。我不知道如何绕过这一点,以便将输出与输入进行比较
我得到的错误与以前类似:
错误(10821):FP处的HDL错误。vhd(75):无法推断“比较”的寄存器,因为其行为与任何支持的寄存器模型都不匹配
错误(10821):FP处的HDL错误。vhd(75):无法推断“计数[0]”的寄存器,因为其行为与任何支持的寄存器模型都不匹配
错误(10821):FP处的HDL错误。vhd(75):无法推断“计数[1]”的寄存器,因为其行为与任何支持的寄存器模型都不匹配
错误(10821):FP处的HDL错误。vhd(75):无法推断“计数[2]”的寄存器,因为其行为与任何支持的寄存器模型都不匹配
错误(10822):FP处的HDL错误。vhd(80):无法在此时钟边缘上实现分配寄存器
错误(10822):FP处的HDL错误。vhd(102):无法在此时钟边缘上实现分配寄存器
错误(12153):无法详细说明顶级用户层次结构
我也知道,它不喜欢上升沿(切换),但我需要它,以使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;
ieee库;
使用ieee.std_logic_1164.all;
使用ieee.numeric_std.all;
使用ieee.std_logic_unsigned.all;
实体FP是
港口(
时钟,复位:在标准逻辑中;
QF:输出标准逻辑向量(3到0);
检查BTN:在标准逻辑中;
开关:标准逻辑向量(3到0);
sel:标准逻辑向量(1到0);
分数:输出标准逻辑向量(6到0)
);
结束FP;
FP的体系结构行为是
信号时间_计数:整数:=0;
信号切换:标准逻辑;
信号切换1:std_逻辑;
信号计数:标准逻辑向量(2到0);
信号段:标准逻辑向量(3到0);
信号比较:整数范围0到1:=0;
类型状态_类型为(级别1、级别2);
信号电平:状态_型;
--信号输入:标准逻辑向量(3到0);
--信号sev:std_逻辑_向量(6到0);
开始
过程(时钟、复位、选择)
开始
如果(重置='0'),则
时间计数好吧。。。很难判断出什么是错误的,因为这个状态机是以错误的方式编写的。您应该在VHDL中查找有关FSM正确建模的参考资料。一个很好的例子是。
如果您使用Quartus,还可以查找Altera关于如何专门为其编译器建模FSM的描述
我现在只给你两个建议。首先,你不应该(或者也许你甚至不能)使用is 2
if rising_edge (clk)
签入一个进程。如果你的进程在时钟边缘是敏感的,在开始时写一次
第二件事是,若你们想用一个同步复位的进程来模拟FSM,那个么就把clk放在灵敏度列表上
问题和代码编辑后编辑:
好了,现在好多了。但还有几件事:
你的FSM仍然不像它应该的那样。再看一次我在上面给你的源代码中的例子,并对它进行编辑,使其与那里相似,或者使其成为一个流程FSM,如本例中的示例
打算!非常重要。在我对您的代码进行适当的编辑之前,我无法发现一些明显的错误。这让我想到
看看这些地方,在那里你可以给count赋值,特别是if语句。不管怎样,您都会指定相同的值“000”
与另一个信号seg类似。在这个过程中,你给它分配了一些值,然后在这个过程的末尾,有一个case语句,你给它分配了一些其他的值,使得之前的分配变得无关紧要
在进程中仅使用上升沿一次,仅用于时钟,并且仅在进程的最开始,或者在第一个进程中使用异步重置的方式。在第二个过程中,你们做了这三件事
在具有上升沿的顺序过程中,就像第一个一样,您不必在灵敏度列表中输入时钟以外的任何内容,如果它是异步的,则需要重置,就像您的情况一样
第二个过程中的灵敏度列表。这是一个并行的过程,所以你们应该把信号放在那个里,你们在一个过程中检查,并且可以在它之外改变。这不是比较的情况。但应该有信号:电平、选择和切换1
因为我仍然不确定你想要实现什么,我不会告诉你具体要做什么。根据以上几点修改你的代码,也许它就可以工作了。好吧。。。很难判断出什么是错误的,因为这个状态机是以错误的方式编写的。您应该在VHDL中查找有关FSM正确建模的参考资料。一个很好的例子是。
如果您使用Quartus,还可以查找Altera关于如何专门为其编译器建模FSM的描述
我现在只给你两个建议。首先,你不应该(或者也许你甚至不能)使用is 2
if rising_edge (clk)
签入一个进程。如果你的进程在时钟边缘是敏感的,在开始时写一次
第二件事是如果你