我在VHDL中写了一些代码,期望看到一个旋转开关并反馈给我它的位置 .
当它转动时,它将从转子拨盘读入greycode并将状态切换到相应的greycode状态 .
改变状态的行为告诉我转子被扭转的方式,所以我可以在电路后面的计数器模块上指示上升或下降状态 .
如果状态改变,它应该在 Mag
上触发一个脉冲,并在 up_dwn
上取消1或0 .
当我模拟它时,它不起作用 . 我在 Mag
上得到一个偶然的昙花一现但没有 up_dwn
的变化 .
我怀疑它被困在 START
状态 .
有人想看,告诉我我做错了什么?
[编辑:使用Quartus II版本9]
LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
ENTITY EncoderV2 IS
PORT(
CH_AB : IN STD_LOGIC_VECTOR (1 downto 0);
clk : IN STD_LOGIC;
nReset : IN STD_LOGIC;
up_dwn, Mag : OUT STD_LOGIC);
END EncoderV2;
ARCHITECTURE a OF EncoderV2 IS --
TYPE STATE_TYPE IS ( START, s00, s01, s11, s10);
SIGNAL state: STATE_TYPE;
BEGIN
PROCESS (clk, nReset)
BEGIN
IF nReset = '0' THEN -- asynch Reset to zero
state <= START;
ELSIF clk'EVENT AND clk = '1' THEN -- triggers on PGT
CASE state IS
WHEN START =>
IF CH_AB ="00" THEN
state <= s00;
Mag <='0';
ELSIF CH_AB="01" THEN
state <= s01;
Mag <='0';
ELSIF CH_AB= "11" THEN
state <= s11;
Mag <='0';
ELSIF CH_AB= "10" THEN
state <= s10;
Mag <='0';
ELSE state <= START;
END IF;
WHEN s00 => -- S10 <- S00 -> S01
IF CH_AB= "00" THEN
state <= s00;
Mag <='0';
ELSIF CH_AB= "10" THEN
state <= s10;
up_dwn <= '0';
Mag <='1';
ELSIF CH_AB= "01" THEN
state <= s01;
up_dwn <='1';
Mag <='1';
ELSE state <= START;
END IF;
WHEN s01 => -- S00 <- S01 -> S11
IF CH_AB= "01" THEN
state <= s01;
Mag <='0';
ELSIF CH_AB= "00" THEN
state <= s00;
up_dwn <= '0';
Mag <='1';
ELSIF CH_AB= "11" THEN
state <= s11;
up_dwn <='1';
Mag <='1';
ELSE state <= START;
END IF;
WHEN s11 => -- S01 <- S11 ->S10
IF CH_AB= "11" THEN
state <= s11;
Mag <='0';
ELSIF CH_AB= "01" THEN
state <= s01;
up_dwn <= '0';
Mag <='1';
ELSIF CH_AB= "10" THEN
state <= s10;
up_dwn <='1';
Mag <='1';
ELSE state <= START;
END IF;
WHEN s10 => -- S11 <- S10 -> S00
IF CH_AB= "10" THEN
state <= s10;
Mag <='0';
ELSIF CH_AB= "11" THEN
state <= s11;
up_dwn <= '0';
Mag <='1';
ELSIF CH_AB= "00" THEN
state <= s00;
up_dwn <='1';
Mag <='1';
ELSE state <= START;
END IF;
END CASE;
END IF;
END PROCESS;
END a;
1 回答
对我来说很好用...用Modelsim模拟
我用50,100和200 MHz模拟它 . 我唯一想知道的是你使用“IF .. nReset ='0'那么”..你确定吗?在我看到它并在我的刺激文件中更改它之前,花了我20分钟 .