我希望你能帮帮我!
我正在为 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 永远不会被驱动为低电平,因此会被修整,这意味着系统的其余部分都没有功能。该模块无法自行正确合成,但可以进行模拟。
对此问题的任何意见将不胜感激。
谢谢