VHDL - 为什么这个信号永远不会降低?

时间:2013-04-22 08:56:00

标签: vhdl synthesis adc

我希望你能帮助我!

我正在为Spartan 3E原型板编写一个程序,它将计算正弦输入信号的频率。由于我选择使用的ADC问题,我决定在内部生成此信号,模拟ADC的输入。我现在的问题在于负责从模拟ADC中检索数据的模块。

完整系统按预期模拟,但是,在合成时会生成大量警告。这些都追溯到我的芯片选择信号,该信号应该被驱动为大约16KHz的低电平。奇怪的是,综合工具没有产生警告,只是芯片选择一直很高的信息。

这是在综合时生成的信息:

Xst:2679 - Register <int_CS> in unit <DataRetrieval> has a constant value of 1 during circuit operation. The register is replaced by logic.

这是有问题的模块:

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.NUMERIC_STD.ALL;

entity DataRetrieval is
Port ( Reset : in  STD_LOGIC;
 C16MHz : in  STD_LOGIC;
       D_in : in  STD_LOGIC;
       CS : out  STD_LOGIC;
       D_clk : out  STD_LOGIC;
       Sample : out STD_LOGIC_VECTOR(7 downto 0));
end DataRetrieval;

architecture Behavioral of DataRetrieval is

signal bit_counter : Integer range 0 to 15;
signal D_reg : STD_LOGIC_VECTOR(15 downto 0);
signal clkDivide : Integer range 1 to 500;
signal int_CS : STD_LOGIC;
signal int_D_clk : STD_LOGIC;
signal edgeBit : STD_LOGIC;

begin

process (Reset, C16MHz, D_in, bit_counter, clkDivide, int_CS, edgeBit, int_D_clk)
begin
    if Reset = '1' then 
        clkDivide <= 1;
        bit_counter <= 15;
        D_reg <= (others => '0');
        Sample <= (others => '0');
        int_CS <= '1';
        edgeBit <= '0';
        int_D_clk <= '0';
    elsif rising_edge(C16MHz) then
        clkDivide <= clkDivide + 1;
        int_D_clk <= not int_D_clk;--8MHz data clock
        if clkDivide = 1000 then
            D_reg <= (others => '0');
            bit_counter <= 15;
            clkDivide <= 1;
            int_CS <= '0'; -- CS driven low here in order to allow time for conversion
        else
            if int_CS = '0' then
                if bit_counter = 0 then
                    D_reg(bit_counter) <= D_in;
                    int_CS <= '1';--disables ADC
                    Sample <= D_reg(11 downto 4);
                else
                    if edgeBit = '0' then
                        edgeBit <= '1';
                        D_reg(bit_counter) <= D_in;
                        bit_counter <= bit_counter - 1;
                    else
                        edgeBit <= '0';
                    end if;
                end if;
            end if;
        end if;
    end if;
end process;

 CS <= int_CS;
 D_clk <= int_D_clk;

end Behavioral;

该模块使用16MHz时钟通过生成8MHz的数据时钟从模拟ADC获取数据。时钟分频信号是一个计数器,它将时钟速度降低到16KHz,在每次计数结束时驱动芯片选择为低电平,然后在为一个采样检索所有数据后将其驱动为高电平。

根据综合工具,CS从不被驱动为低,因此被修整,这意味着系统的其余部分都不起作用。该模块本身无法正确合成,但它确实模拟。

对此问题的任何意见都将不胜感激。

由于

1 个答案:

答案 0 :(得分:3)

你宣布

signal clkDivide : Integer range 1 to 500;

然后检查

if clkDivide = 1000 then

综合工具可能会为clkDivide实例化一个9位寄存器,该寄存器永远不会达到1000.尝试将整数范围更改为0到1024或类似。