我希望你能帮助我!
我正在为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从不被驱动为低,因此被修整,这意味着系统的其余部分都不起作用。该模块本身无法正确合成,但它确实模拟。
对此问题的任何意见都将不胜感激。
由于
答案 0 :(得分:3)
你宣布
signal clkDivide : Integer range 1 to 500;
然后检查
if clkDivide = 1000 then
综合工具可能会为clkDivide
实例化一个9位寄存器,该寄存器永远不会达到1000.尝试将整数范围更改为0到1024或类似。