Mealy机器1011检测器的VHDL实现
我为Mealy machine编写了一个VHDL程序,可以检测模式1011,如下所示:Mealy机器1011检测器的VHDL实现,vhdl,Vhdl,我为Mealy machine编写了一个VHDL程序,可以检测模式1011,如下所示: LIBRARY ieee; USE ieee.std_logic_1164.all; ENTITY mealy_detector_1011 IS PORT( rst_n : IN STD_LOGIC; clk : IN STD_LOGIC; data : IN STD_LOGIC; result : OUT STD_
LIBRARY ieee;
USE ieee.std_logic_1164.all;
ENTITY mealy_detector_1011 IS
PORT(
rst_n : IN STD_LOGIC;
clk : IN STD_LOGIC;
data : IN STD_LOGIC;
result : OUT STD_LOGIC);
END ENTITY;
ARCHITECTURE beh OF mealy_detector_1011 IS
TYPE state IS (IDLE, GOT1, GOT10, GOT101);
SIGNAL current_state : state;
SIGNAL next_state : state;
BEGIN
REG: PROCESS(clk, rst_n)
BEGIN
IF rst_n = '0' THEN
current_state <= IDLE;
ELSIF rising_edge(clk) THEN
current_state <= next_state;
END IF;
END PROCESS REG;
NEXTSTATE: PROCESS(data, current_state)
BEGIN
CASE current_state IS
WHEN IDLE =>
IF data = '1' THEN
next_state <= GOT1;
ELSE next_state <= IDLE;
END IF;
WHEN GOT1 =>
IF data = '0' THEN
next_state <= GOT10;
ELSE next_state <= GOT1;
END IF;
WHEN GOT10 =>
IF data = '1' THEN
next_state <= GOT101;
ELSE next_state <= IDLE;
END IF;
WHEN GOT101 =>
IF data = '1' THEN
next_state <= GOT1;
ELSE
next_state <= GOT10;
END IF;
WHEN OTHERS => NULL;
END CASE;
END PROCESS NEXTSTATE;
result <= '1' WHEN (current_state = GOT101 and data = '1') ELSE '0';
END beh;
但是,我的模拟结果不正确。你能帮我解决这个问题吗?非常感谢。
您只需将Mealy输出写入流程的transition if-then-else分支
NEXTSTATE: PROCESS(data, current_state)
BEGIN
-- default assignments
next_state <= state; -- so your code won't create latches
result <= '0'; -- result is always 0, except of transition GOT101 to GOT1
CASE current_state IS
WHEN IDLE =>
IF data = '1' THEN
next_state <= GOT1;
ELSE next_state <= IDLE;
END IF;
WHEN GOT1 =>
IF data = '0' THEN
next_state <= GOT10;
ELSE next_state <= GOT1;
END IF;
WHEN GOT10 =>
IF data = '1' THEN
next_state <= GOT101;
ELSE next_state <= IDLE;
END IF;
WHEN GOT101 =>
IF data = '1' THEN
result <= '1';
next_state <= GOT1;
ELSE
next_state <= GOT10;
END IF;
WHEN OTHERS => NULL;
END CASE;
END PROCESS NEXTSTATE;
NEXTSTATE:进程(数据、当前状态)
开始
--默认分配
下一个状态你会不断从那些似乎认为结果有问题的人那里得到答案
问题在于数据
与时钟
不同步。到处都有转换,mealy输出正在做它应该做的事情
这是一个组合输出,不应该用作时钟。它可用作在clk
上运行的寄存器的启用或输入
这里有一个测试台,供我们这些没有Modelsim的人使用:
library ieee;
use ieee.std_logic_1164.all;
entity mealy_1011_tb is
end entity;
architecture foo of mealy_1011_tb is
signal rst_n: std_logic := '0';
signal clk: std_logic := '1';
signal data: std_logic := '0';
signal result: std_logic;
begin
DUT:
entity work.mealy_detector_1011
port map (
rst_n => rst_n,
clk => clk,
data => data,
result => result
);
CLOCK:
process
begin
wait for 50 ns;
clk <= not clk;
if Now > 799 ns then
wait;
end if;
end process;
STIMULUS:
process
begin
wait for 10 ns;
rst_n <= '1';
wait for 70 ns;
data <= '1'; -- 80 ns
wait for 100 ns;
data <= '0'; -- 180 ns
wait for 50 ns;
data <= '1'; -- 230 ns
wait for 100 ns;
data <= '0'; -- 330 ns
wait for 140 ns;
data <= '1'; -- 470 ns
wait for 60 ns;
data <= '0'; -- 530 ns
wait for 40 ns;
data <= '1'; -- 570 ns
wait for 50 ns;
data <= '0'; -- 620 ns
wait;
end process;
end architecture;
ieee库;
使用ieee.std_logic_1164.all;
实体mealy_1011_tb为
终端实体;
mealy_1011_tb的架构是
信号rst_n:std_逻辑:='0';
信号时钟:标准逻辑:='1';
信号数据:标准逻辑:='0';
信号结果:std_逻辑;
开始
DUT:
实体工作.mealy_探测器_1011
港口地图(
rst\u n=>rst\u n,
时钟=>clk,
数据=>数据,
结果=>result
);
时钟:
过程
开始
等待50纳秒;
时钟799纳秒
等待
如果结束;
结束过程;
刺激:
过程
开始
等待10纳秒;
首先,我将提供一个试验台。模拟您的过程。它会得到同样的答案。不需要对下一个状态进行默认分配。为了证明这一点,请将其他案例注释掉。注意下一个\u状态
被分配到每个位置。(state
在案例陈述中有完整的覆盖范围,每个if和else都有一个分配到next_state
)@DavidKoontz抱歉,我错过了其他人的行。当然,下一个州你能给我你的密码吗?我的英语不好。我不能清楚地理解你的评论。你能帮助我吗?非常感谢你!
library ieee;
use ieee.std_logic_1164.all;
entity mealy_1011_tb is
end entity;
architecture foo of mealy_1011_tb is
signal rst_n: std_logic := '0';
signal clk: std_logic := '1';
signal data: std_logic := '0';
signal result: std_logic;
begin
DUT:
entity work.mealy_detector_1011
port map (
rst_n => rst_n,
clk => clk,
data => data,
result => result
);
CLOCK:
process
begin
wait for 50 ns;
clk <= not clk;
if Now > 799 ns then
wait;
end if;
end process;
STIMULUS:
process
begin
wait for 10 ns;
rst_n <= '1';
wait for 70 ns;
data <= '1'; -- 80 ns
wait for 100 ns;
data <= '0'; -- 180 ns
wait for 50 ns;
data <= '1'; -- 230 ns
wait for 100 ns;
data <= '0'; -- 330 ns
wait for 140 ns;
data <= '1'; -- 470 ns
wait for 60 ns;
data <= '0'; -- 530 ns
wait for 40 ns;
data <= '1'; -- 570 ns
wait for 50 ns;
data <= '0'; -- 620 ns
wait;
end process;
end architecture;