在VHDL中使用异步和同步复位的D锁存器

时间:2017-01-29 18:29:47

标签: vhdl

我必须实现一个D-latch,当aclrn = 0时跟随异步复位,当sclrn = 0时同步。实现应该能够遵循两种重置方法。

这是我在基于D-latches的VHDL中提出的(我只包括过程)。

 process(aclrn,clock)
 begin
 if (aclrn='0') then
 q <= '0';
 elsif (rising_edge(clock)) then
     if (sclrn='0') then
     q <= '0';
     else 
     q <= d;
 end if;
end if;
end process;

,其中

clock, d, aclrn, sclrn : in std_logic; q : out std_logic

我是否正确,该过程不需要将sclrn作为参数,但只需要aclrn和clock?还有其他不一致之处吗?

提前谢谢。

1 个答案:

答案 0 :(得分:2)

你说的是D-latch而是编码的触发器。你真的需要一个D-latch,或者你只是不小心使用闩锁而不是寄存器? 如果你真的需要一个触发器,你就做对了。 你把aclrn和时钟放在灵敏度列表中是正确的。您不需要将sclrn放在列表中,因为它是同步的。 具有正边沿时钟和同步集的触发器的Xilinx XST教程示例

architecture archi of registers_3 is
begin
    process (C)
    begin
        if (C'event and C='1') then
            if (S='1') then
                Q <= '1';
            else
                Q <= D;
            end if;
        end if;
    end process;
end archi; 

和具有正边沿时钟和异步复位的触发器的XST编码示例

architecture archi of registers_2 is
begin
    process (C, CLR)
    begin
        if (CLR = '1')then
            Q <= '0';
        elsif (C'event and C='1')then
            Q <= D;
        end if;
    end process;
end archi;

通过混合这两个你得到你的答案。我认为您的代码没有任何问题。最好的方法是知道你是否编码了你所要求的是模拟它。

如果需要锁存,请注意锁存器对电平而不是边缘敏感。这是具有正门和异步复位的LATCH的示例

 architecture archi of latches_2 is
    begin
        process (CLR, D, G)
        begin
            if (CLR='1') then
                Q <= '0';
            elsif (G='1') then
                Q <= D;
            end if;
        end process;
    end archi;