VHDL:ADC接口代码不适用于fpga套件,可提供良好的仿真结果

时间:2014-07-23 19:22:11

标签: vhdl

我在FPGA套件上运行我的第一个VHDL代码。我是一个简单的外部ADC(AD574A),它与FPGA套件接口。我在下面粘贴的代码看起来在模拟中给出了很好的结果,但在套件中没有任何东西可以正常工作。代码中的第一个进程(进程(clk))将时钟频率降低了有限的时间。并且生成的低频方波用于驱动第二过程(PROCESS(rst,clk_out))。 clk_out被定义为程序中的缓冲区。亲切地告诉我,如果使用不同时钟源驱动两个进程的过程是否正确?我知道这就是问题所在,因为虽然这两个部分模拟正确,但在套件中第一个过程有效,第二个过程没有。

library IEEE;    
use IEEE.STD_LOGIC_1164.ALL;    
use IEEE.STD_LOGIC_ARITH.ALL;    
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity newADC is    
port ( clk: in std_logic;    
       rst: in std_logic;    
       R_C: buffer std_logic;  
       clk_out : buffer  STD_LOGIC;     
       STS: in std_logic;
       data: in std_logic_vector(4 downto 0);
       data_out: out std_logic_vector(4 downto 0)
     );
end newADC;

architecture Behavioral of newADC is        
    signal temp: std_logic_vector(4 downto 0):=(others => '0');
    signal i: integer range 0 to 2:=0;
    signal j: integer range 0 to 10:=0;
    TYPE state IS (reading, converting);
    SIGNAL pr_state, nx_state: state;
    begin
    ----------------reduce clock frequency-------------------------
        PROCESS (clk)
        VARIABLE count_clk : INTEGER RANGE 0 TO 10;
        BEGIN
            IF (clk'EVENT AND clk='1') THEN
                count_clk := count_clk + 1;
                IF (count_clk = 7 ) THEN                  -------- clk_out time period=  
                    clk_out <= NOT clk_out;                -------- clk*count*2
                    count_clk := 0;                        -------- board 'clk' is 40MHz/25ns time period
                END IF;
            END IF;
        END PROCESS;
----- Synchronous section: ----------------------------------------------
        PROCESS (rst, clk_out)      
        BEGIN
            IF (rst='1') THEN
                pr_state <= reading;
            ELSIF (clk_out'EVENT AND clk_out='1') THEN
                pr_state <= nx_state;
            END IF;
        END PROCESS;
---------- Cmbinational section: ------------------------------------------
        PROCESS (clk_out,STS,data,pr_state)         
        BEGIN
            CASE pr_state IS
                    WHEN reading =>
                    temp <= data;                   
                    case i is
                        when 0=> R_C <= '1';
                        when 1=> R_C <= '0';
                        when 2=> R_C <= '1';
                    end case;   
                    i <= i+1;
                    if (i = 3)then
                        i <= 0;
                    end if;             
                    IF (STS='1') THEN nx_state <= converting;
                    ELSE nx_state <= reading;
                    END IF;
                WHEN converting =>                  
                    R_C <= '1';
                    IF (STS='0') THEN nx_state <= reading;
                    ELSE nx_state <= converting;
                    END IF;
            END CASE;
        data_out <= temp;
        END PROCESS;
---------------------------------------------------------------------------
end Behavioral;

期待这项急需的帮助 - By-Tapabrata Sen

2 个答案:

答案 0 :(得分:0)

首先,要充分关注时钟。当您更熟悉硬件设计时,可以使用多个时钟。

使用时钟启用,我也希望同步复位。

   PROCESS (clk)
    VARIABLE count_clk : INTEGER RANGE 0 TO 10;
    BEGIN
        IF (clk'EVENT AND clk='1') THEN
            count_clk := count_clk + 1;
            clk_en <= '0';
            IF (count_clk = 7 ) THEN                  -------- clk_out time period=  
                clk_en <= '1';                -------- clk*count*2
                count_clk := 0;                        -------- 
            END IF;
        END IF;
    END PROCESS;
    PROCESS (clk)      
    BEGIN
        IF (rising_edge(clk)) THEN
            IF (rst='1') THEN
                pr_state <= reading;
            ELSIF (clk_en='1') THEN;
                pr_state <= nx_state;
            END IF
        END IF;
    END PROCESS;

最后一个过程中的敏感度列表也是错误的,所有对过程的更改输入都必须是敏感列表的一部分,并且clk_out不应该在那里

答案 1 :(得分:0)

i不在组合部分流程的敏感性列表中。 clk_out似乎没有必要写入敏感列表中。

ipr_state的转换时递增,并且可能容易受到组合/路径延迟的影响,您可能希望使用clk_out计时。每当敏感度列表中的任何信号发生事件时,i都会递增,基本上是clk_out的两个边,datapr_state中的任何变化。这可能是模拟和实施性能差异的原因。

R_C是AD754A Read_Convert,它可能行为不端。在综合期间,您应该至少看到一条关于i计数器如何计时的警告消息。如果我不得不在没有看到你的综合报告的情况下冒险,我敢打赌R_C是静态的('1')。如果您有示波器,请查看AD754A发生的情况。

您的VHDL设计规范可能存在其他问题,j未在任何地方分配,您有两个不需要的使用条款:

-- use ieee.std_logic_arith.all;
-- use ieee.std_logic_unsigned.all;

在你声称纯粹是组合的过程中增加i计数器似乎是违反直觉的。单独的流程或在评论中删除声明可能已经成熟。

我没有尝试使用i计数器修复程序运行“修补”版本。它需要一个测试平台来确定你认为可以开始的东西。

数据表随时可供有兴趣的人使用,请参阅AD574A (Rev. B)数据表。