【发布时间】:2017-06-27 08:45:02
【问题描述】:
我正在创建一个架构来使用带有 L297 控制器的 FPGA 板来驱动步进电机。所以为了改变速度,我创建了一个时钟分频器来改变 L297 的时钟频率。时钟分频器工作得很好。我的问题是我创建了多个时钟输出,其中一个将使用板上的按钮选择,所以当我将这些信号连接到 MUX 时,输出在时钟输入信号方面并不完全正确,但它工作正常与 STD_LOGIC。 这是我用于 MUX 的代码
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
use IEEE.NUMERIC_STD.ALL;
entity TEST_MUX is
Port ( A : in STD_LOGIC;
B : in STD_LOGIC;
C : in STD_LOGIC;
D : in STD_LOGIC;
E : in STD_LOGIC;
choice_select : in STD_LOGIC;
choice_valid : in STD_LOGIC;
choice_reset : in STD_LOGIC;
Choice : out STD_LOGIC);
end TEST_MUX;
architecture Behavioral of TEST_MUX is
signal count : integer := 0;
signal S_out : STD_LOGIC ;
begin
process ( choice_select , choice_valid, choice_reset,A,B,C,D,E)
begin
if (choice_reset = '0') THEN
count <=0;
S_out <= 'Z';
else
if (choice_select'event) and (choice_select ='1') THEN
count <= count + 1;
if (choice_valid = '1') THEN
case count is
when 1=> S_out<=A ;
when 2=> S_out<=B ;
when 3=> S_out<=C ;
when 4=> S_out<=D;
when 5=> S_out<=E ;
when others => S_out <= 'Z';
end case;
end if;
end if;
end if;
end process;
Choice<=S_out;
end Behavioral;
以下是输入为 STD_LOGIC 时的正确模拟结果: enter image description here
这里输入强制为时钟: enter image description here 谢谢你的帮助
【问题讨论】:
-
真是一团糟。我建议您尝试将您现在拥有的流程的组合部分和顺序部分分开。还要避免使用 ieee.std_arith。请改用 ieee.numeric_std。最重要的是不要同时使用两者。
-
你的意思是把组合部分和顺序部分分开。 if 和 case 语句不应该在进程内
-
你为什么在你的代码中使用
'Z'= tristate?这在内部 FPGA 信号上不受支持。另外:我希望您知道您需要将时钟域同步器放在外部输入(按钮)上才能使用它们?否则,它们将通过违反建立和保持时间来搞砸内部逻辑
标签: switch-statement vhdl clock switching mux