我有一个关于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;
答案 0 :(得分:0)
我不清楚你的转换,你的代码太奇怪了。但我会指出你的代码有什么问题。 这不是答案因为评论是两个写的狭窄。希望能让你的代码更好。
PROCESS (CompIn, Clock)
这个敏感列表可能会导致我不知道的事情,因为我在代码中看不到CompIn
信号。如果您想要它是一个寄存器,请在此列表中放置clock
或set
或reset
信号(或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时,信号都会获得计划更新的新值 。但是,更新不会发生在当前增量周期结束之前(即触发所有进程完成后)。
在此之前,如果您读取信号(在同一过程或任何其他过程中),您可以保证读取相同(起始)值。