用vhdl语言时寄存器何时产生何时写入数据
use IEEE.STD_LOGIC_1164.ALL;
entity fenpin is
generic(pin : integer := 2);
port (clk , reset : in std_logic;
output : inout std_logic);
end fenpin;
architecture Behavioral of fenpin is
begin
process(clk , reset)
variable a : integer range 0 to pin;
begin
if(reset = '1') then
a := 0;
output <= '0';
elsif(clk ' event and clk = '1') then
a := a+1;
if(a = pin) then
a := 0;
output <= not output;
end if;
end if;
end process;
end Behavioral;
这是一个二分频的电路,单综合时会显示有a_1寄存器一直为0;当把pin改为3时便没有了警告;我想应该是在if判断是a=2没有写入寄存器而直接写入了a=0;所以一直为 00, 01 寄存器a_1 便一直为0。不知道我想的对不对所以想请大神们来说明一下原因并且赐教一下在什么情况下会产生寄存器和在什么情况下会向寄存器中写入数据。
建议你要先搞懂阻塞赋值与非阻塞赋值区别,阻塞赋值就是你用的:= 赋
值,是在这个时钟的上升沿直接变化的,非阻塞赋值是在下一个上升沿值
才发生变化,建议使用非阻塞赋值;还有就是一般使用signal,不使用变量。
根据你之前的程序这样就对了
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity fenpin is
generic(pin : integer := 1);
port (clk , reset : in std_logic;
output : inout std_logic);
end fenpin;
architecture Behavioral of fenpin is
signal a : integer range 0 to pin;
begin
process(clk , reset)
begin
if(reset = '1') then
a <= 0;
output <= '0';
elsif(clk ' event and clk = '1') then
if ( a < pin ) then
a <= a + 1;
else
a <= 0 ;
end if ;
if(a = pin) then
output <= not output;
else
output <= output ;
end if;
end if;
end process;
end Behavioral;