VHDL - 逐次逼近寄存器

时间:2012-10-26 04:51:39

标签: vhdl

我有一个关于VHDL代码的问题,我试图为ADC的逐次逼近寄存器编写代码。

在下面显示的代码中,DigitalOutTemp会在整个for循环中不断更新吗?或者它只会在流程结束时收到OutTemp的价值?

我想我可能有错误的逻辑,但我想要做的是让DigitalOutTemp通过数模转换器然后进入我正在测量的模拟信号的比较器。然后,比较器将反馈到寄存器中。

LIBRARY ieee;
USE     ieee.std_logic_1164.all;

ENTITY SARegister IS
PORT (
    Comparator, Clock                     : IN std_logic;
    DigitalOutFinal, DigitalOutTemp   : OUT std_logic_vector (13 downto 0)
);
END;

ARCHITECTURE Behavioural OF SARegister IS
BEGIN

PROCESS (CompIn, Clock)
    VARIABLE OutTemp : std_logic_vector (13 downto 0);
BEGIN
    IF (rising_edge(Clock)) THEN
        OutTemp := "10000000000000";

        FOR i IN 13 downto 0 LOOP

            IF (Comparator = '0') THEN
                OutTemp(i) := '0';
            END IF;

            IF (i > 0) THEN
                OutTemp(i - 1) := '1';
            END IF;

            DigitalOutTemp <= OutTemp;

        END LOOP;

        DigitalOutFinal <= OutTemp;

    END IF;

END PROCESS;
END;

2 个答案:

答案 0 :(得分:0)

我不清楚你的转换,你的代码太奇怪了。但我会指出你的代码有什么问题。 这不是答案因为评论是两个写的狭窄。希望能让你的代码更好。

PROCESS (CompIn, Clock)

这个敏感列表可能会导致我不知道的事情,因为我在代码中看不到CompIn信号。如果您想要它是一个寄存器,请在此列表中放置clocksetreset信号(或enable时钟门控。

VARIABLE OutTemp : std_logic_vector (13 downto 0);
BEGIN
    IF (rising_edge(Clock)) THEN
    OutTemp := "10000000000000";

    FOR i IN 13 downto 0 LOOP

        IF (Comparator = '0') THEN
            OutTemp(i) := '0';
        END IF;

        IF (i > 0) THEN
            OutTemp(i - 1) := '1';
        END IF;

两个if不会导致更好的结果,因为第二个会先覆盖。我确定OutTemp在此之后获得所有1111..11(偶数循环)。

        DigitalOutTemp <= OutTemp;

请不要将此分配放在此循环中。即使你给它分配无限时间,这个过程只在age_eadge of clock时运行。

    END LOOP;

    DigitalOutFinal <= OutTemp;

END IF;
END PROCESS;

我可以确定您的代码无法编译,因为缺少CompIn。即使您添加了CompIn,结果DigitalOut...也始终为1111...1(全部)。

答案 1 :(得分:0)

  

在下面显示的代码中,DigitalOutTemp将不断更新   整个for循环?或者它只会收到OutTemp的价值   在流程结束时?

每次您写入DigitalOutTemp时,信号都会获得计划更新的新值 。但是,更新不会发生在当前增量周期结束之前(即触发所有进程完成后)。

在此之前,如果您读取信号(在同一过程或任何其他过程中),您可以保证读取相同(起始)值。