0

我希望你能帮帮我!

我正在为 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 时钟从模拟 ADC 中获取数据,方法是生成一个 8MHz 的数据时钟。时钟分频信号是一个将时钟速度降低到 16KHz 的计数器,它在每次计数结束时将芯片选择驱动为低电平,然后在为一个样本检索到所有数据后将其驱动为高电平。

根据综合工具,CS 永远不会被驱动为低电平,因此会被修整,这意味着系统的其余部分都没有功能。该模块无法自行正确合成,但可以进行模拟。

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

谢谢

4

1 回答 1

3

你声明

signal clkDivide : Integer range 1 to 500;

然后检查

if clkDivide = 1000 then

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

于 2013-04-22T09:02:58.707 回答