0

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

在下面显示的代码中,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;
4

2 回答 2

0

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

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

在那之前,如果您读取信号(在同一进程或任何其他进程中),您将保证读取相同的(起始)值。

于 2012-10-26T14:41:51.330 回答
0

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

PROCESS (CompIn, Clock)

这个敏感列表可能会导致一些我不知道的事情,因为我CompIn在你的代码中看不到信号了。如果你想要它是一个寄存器,请在这个列表上只放clockor setorreset信号(或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;

请不要将此分配放在此循环中。即使您为其分配无限时间,此过程也仅在时钟上升沿时运行。

    END LOOP;

    DigitalOutFinal <= OutTemp;

END IF;
END PROCESS;

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

于 2012-10-26T09:05:37.700 回答