0

我是西班牙用户,是 VHDL 编程的新手,我试图用 CASE 制作机器状态但不工作。然后我决定使用 ELSIF 指令,它的所有工作都很完美,但状态 0010 它不工作我不知道为什么它是一个非常简单的程序,但不明白为什么你不工作,请原谅我的英语不好,但我会尽力而为谢谢我接下来展示程序:

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

--definimos identidad de la interfaz
entity interfaz is 
port(
    sen:in std_logic_vector(3 downto 0);--entrada de sensor bus de 4 bits
    clk:in std_logic;
    mda, mdr, mia, mir:out std_logic);--mdr,mda=motor derecho retroceso,avance == mia,mir=motor izquiero avance,retroceso
end interfaz;
--comenzando arquitectura de interfaz
architecture behavior of interfaz is
----------------------------------------------------
--Instruccion con herramienta elseif
process
begin
wait until clk'event and clk='1';
if (sen=(0000)) then --alto
mda<='0'; 
mdr<='0'; 
mia<='0'; 
mir<='0';
elsif (sen=(0001)) then --retroceso
mda<='0';
mdr<='1';
mia<='0';
mir<='1';
elsif (sen=0010) then --avance
mda<='1';
mdr<='0';
mia<='1';
mir<='0';
elsif (sen=(0100)) then --izquierda
mda<='0';
mdr<='1';
mia<='1';
mir<='0';
elsif (sen=(1000)) then --derecha
mda<='1';
mdr<='0';
mia<='0';
mir<='1';
end if;

end process;
end behavior;
4

1 回答 1

2

sen=0010看起来像是与sen一个 4 位向量进行比较,但实际上是与十进制值 0010 = 10 = 10 进行比较,因为缺少 ""周围的0010值。通过添加来解决这个问题"",比如 "0010".

VHDL 基本上是强类型的,但添加了允许在和use ieee.std_logic_unsigned.all;之间进行比较的函数,因此问题通过了语法检查。std_logic_vectorinteger

还:

  • begin通过在 之前添加来修复语法错误process,因为这是必需的architecture
  • 考虑使用 ifrising_edge(clk)而不是wait until clk'event and clk='1'
  • 考虑重写case
于 2014-02-14T05:56:13.550 回答