我正在尝试用VHDL为CPLD构建一个简单的脉冲发生器。我有一系列简单的 if 语句,它们应根据连接到模块的总线的输入状态执行某些任务。
entity pulse_gen is
Port ( CLK : in STD_LOGIC;
pulse_sel_in : in STD_LOGIC_VECTOR (2 downto 0);
pulse_r : in STD_LOGIC;
pulse_s : inout STD_LOGIC);
end pulse_gen;
architecture Behavioral of pulse_gen is
signal pulse_sel: std_logic_vector (2 downto 0);
signal pulse_count: integer;
signal pulse_length: integer range 0 to 100;
signal pulse_a: std_logic;
begin
pulse_sel <= pulse_sel_in;
pulse: process(CLK) is
begin
if(pulse_sel > "000" and pulse_a = '0') then
pulse_s <= '1';
pulse_a <= '1';
end if;
if(pulse_a = '1' and pulse_count < pulse_length) then
pulse_count <= pulse_count + 1;
end if;
if(pulse_a = '1' and pulse_count = pulse_length) then
pulse_s <= '0';
pulse_a <= '0';
pulse_count <= 0;
end if;
end process;
set_max: process(CLK) is
begin
if (CLK'event) then
case pulse_sel is
when "001" => pulse_length <= 1;
when "010" => pulse_length <= 10;
when "011" => pulse_length <= 100;
when others => null;
end case;
end if;
end process;
end Behavioral;
在iSim中运行此模块时,强制_pulse_s_总线除了000以外的任何内容都应该触发脉冲过程中的第一个if语句。但是,在模拟中,_pulse_a_信号永远不会设置为逻辑高。现在我花了几个小时以不同的方式编写这个模块,但我完全不知道为什么不会发生这种情况。我对VHDL比较陌生,所以我想知道是否存在某种语法或程序错误,我只是完全缺失。有什么想法吗?
答案 0 :(得分:2)
信号的初始值为“U”。等于'1'或等于'0'的条件都不是有效的,因此不会分配新值。
答案 1 :(得分:2)
@Philippe是正确的。定义信号时,需要将pulse_a分配给某个值0或1。添加:signal pulse_a:std_logic:='0';它会起作用。
你说你在iSim中强迫它低。好吧猜怎么着?当你强行降低时,它会保持低位!所以你的代码将无法改变它!
编辑:您还应该将pulse_count分配给某个初始值。