【问题标题】:XADC testbench vivado simulation - analog signal problemsXADC 测试台 vivado 仿真 - 模拟信号问题
【发布时间】:2019-01-20 11:40:56
【问题描述】:

一旦 UART_RXD_PIN 设置为“1”,我已经完成了将数据从 XADC 传递到其他组件的项目。我正在为这个项目使用 BASYS3 板。现在是时候创建模拟模拟信号并将其传递给 4 个不同 xadc 引脚的测试平台了。

我已经尝试了几个示例(在互联网上),但是他们使用的是 VERILOG 而不是 VHDL,并且 XADC 不像我的项目那样用作组件。我创建了“supermain.vhdl”,其中 top_main 是组件,因此 vivado 可能会为自己模拟 XADC,但它不起作用。

这是我的代码:

entity top_main is
    Port (
        CLK              : IN  STD_LOGIC;   
        UART_TXD_pin     : IN  STD_LOGIC;
        UART_RXD_pin     : OUT STD_LOGIC
    );  
end top_main;

architecture Behavioral of top_main is

    -- COMPONENTS --
-- XADC --
COMPONENT XADC_block_input
PORT (
    di_in               : IN  STD_LOGIC_VECTOR(15 DOWNTO 0);
    daddr_in            : IN  STD_LOGIC_VECTOR(6 DOWNTO 0);
    den_in              : IN  STD_LOGIC;
    dwe_in              : IN  STD_LOGIC;
    drdy_out            : OUT STD_LOGIC;
    do_out              : OUT STD_LOGIC_VECTOR(15 DOWNTO 0);
    dclk_in             : IN  STD_LOGIC;
    vp_in               : IN  STD_LOGIC;
    vn_in               : IN  STD_LOGIC;
    reset_in            : IN  STD_LOGIC;
    ------------------------------------    
    vauxp6              : IN  STD_LOGIC;
    vauxn6              : IN  STD_LOGIC;
    vauxp7              : IN  STD_LOGIC;
    vauxn7              : IN  STD_LOGIC;
    vauxp14             : IN  STD_LOGIC;
    vauxn14             : IN  STD_LOGIC;
    vauxp15             : IN  STD_LOGIC;
    vauxn15             : IN  STD_LOGIC;
    ------------------------------------    
    channel_out         : OUT STD_LOGIC_VECTOR(4 DOWNTO 0);
    eoc_out             : OUT STD_LOGIC;
    alarm_out           : OUT STD_LOGIC;
    eos_out             : OUT STD_LOGIC;
    busy_out            : OUT STD_LOGIC
);
END COMPONENT;








type    pmod_addresses is array (0 to 3) of std_logic_vector(6 downto 0); 
constant adress_pmod        : pmod_addresses :=("0010110","0010111","0011110","0011111");   -- 6/7/14/15 -> PORTS XADC --
signal  DataValid           : STD_LOGIC;                                                    -- DATA IN VALID
signal  DataReady           : STD_LOGIC;                                                    -- DATA READY (FOR FFT)
signal  index               : INTEGER := 0;                                                 -- INDEX FOR ADC
signal  DataOut             : STD_LOGIC_VECTOR(15 DOWNTO 0);                                -- DATA ADC OUT
signal  nr_adc              : STD_LOGIC_VECTOR(6 downto 0) := adress_pmod(0);   

    -- PORT MAPS --
-- ADC --
XADC_PORT_MAP: XADC_block_input
PORT MAP (
    di_in       => X"0000",
    daddr_in    => nr_adc,
    den_in      => DataValid,
    dwe_in      => '0',
    drdy_out    => DataReady,
    do_out      => DataOut,
    dclk_in     => CLK_128MHz,
    vp_in       => '0',
    vn_in       => '0',
    reset_in    => MASTER_RESET, 
    ------------------------------------    
    vauxp6      => ADC_6P_J3,
    vauxn6      => ADC_6N_K3,
    vauxp7      => ADC_7P_M2,
    vauxn7      => ADC_7N_M1,
    vauxp14     => ADC_14P_L3,
    vauxn14     => ADC_14N_M3,
    vauxp15     => ADC_15P_N2,
    vauxn15     => ADC_15N_N1,
    ------------------------------------    
    channel_out => open,
    eoc_out     => DataValid,
    alarm_out   => open,
    eos_out     => open,
    busy_out    => open
);

-- ADC DATA FORWARDING --
p_XADC_PORT_ADDRESING: process(CLK_128MHz)
begin
    if(rising_edge(CLK_128MHz)) then
        if(DataReady = '1') then       
            case nr_adc is
                when adress_pmod(0) =>   
                    XADC_1_FIR_1 <= DataOut ;
                when adress_pmod(1) =>   
                    XADC_2_FIR_2 <= DataOut ;
                when adress_pmod(2) =>   
                    XADC_3_FIR_3 <= DataOut ;
                when adress_pmod(3) =>   
                    XADC_4_FIR_4 <= DataOut ;
                when others =>
                    XADC_1_FIR_1 <= (others=>'0'); 
                    XADC_2_FIR_2 <= (others=>'0'); 
                    XADC_3_FIR_3 <= (others=>'0'); 
                    XADC_4_FIR_4 <= (others=>'0'); 
                end case;
            if index = 0 then
                index <= 1;
            else 
                index <= 0;
            end if;
            nr_adc  <= adress_pmod(index);
        end if;
    end if;
end process p_XADC_PORT_ADDRESING;

这里是超级主要的,只有实体和测试台代码。

entity supermain is
     Port (
    CLK              : IN  STD_LOGIC;    
    UART_TXD_pin     : IN  STD_LOGIC;
    UART_RXD_pin     : OUT STD_LOGIC
);

end supermain;

architecture Behavioral of supermain is

component top_main
    Port (
        CLK              : IN  STD_LOGIC;   
        UART_TXD_pin     : IN  STD_LOGIC;
        UART_RXD_pin     : OUT STD_LOGIC
    );  
end component;

begin

symulacja : top_main
  PORT MAP (
    CLK                 => CLK,
    UART_TXD_pin        => UART_TXD_pin,
    UART_RXD_pin        => UART_RXD_pin
    );  



    end Behavioral;


    entity supermain_tb is
end;

architecture bench of supermain_tb is

  component supermain
       Port (
      CLK              : IN  STD_LOGIC;    
      UART_TXD_pin     : IN  STD_LOGIC;
      UART_RXD_pin     : OUT STD_LOGIC
  );
  end component;

  signal CLK: STD_LOGIC;
  signal UART_TXD_pin: STD_LOGIC;
  signal UART_RXD_pin: STD_LOGIC ;

  constant clock_period: time := 1 ms;
  signal stop_the_clock: boolean;


begin

  uut: supermain port map ( CLK          => CLK,
                            UART_TXD_pin => UART_TXD_pin,
                            UART_RXD_pin => UART_RXD_pin );

  stimulus: process
  begin
   UART_TXD_pin <= '1' after 100 ns, '0' after 100 ns;
    -- Put initialisation code here


    -- Put test bench stimulus code here
    wait;
  end process;

  clocking: process
  begin
    while not stop_the_clock loop
      CLK <= '0', '1' after clock_period / 2;
      wait for clock_period;
    end loop;
    wait;
  end process;

end;

您能告诉我如何在测试台中模拟模拟信号吗?因为现在它甚至没有

【问题讨论】:

  • 我只看到XADC_block_input 组件上的数字输入端口。 (STD_LOGIC/STD_LOGIC_VECTOR) 它无法接受模拟信号。
  • 我的问题是如何生成模拟信号..
  • 为什么要生成模拟信号?您有一个数字设计,其中没有任何部分进行 A/D 转换(即外部芯片)。你有没有在这里展示的芯片型号?
  • 数据路径为:XADC - FIR FILTER - FFT - FIFO - SERIALIZER - RS - MATLAB。一旦我使用 matlab 将数据发送到电路板(uart TX 引脚),xadc 就会开始转换来自麦克风的数据,我需要模拟这些数据以测试整个项目。在这种情况下,我可以模拟 Sinus 并将其传递给 xadc pmod 引脚。我在下面的“答案”中包含了视频,其中指出我无法将模拟数据传递给电路板。现在我只需要模拟模拟信号。

标签: vhdl xilinx vivado


【解决方案1】:

您可以将模拟信号连接到该型号。

你不知道如何生成模拟信号也没关系,因为即使如果你可以生成模拟信号,模型也无法接受.

例如,要模拟模拟信号,您可以使用 real 类型的信号。
但是为了接受这样的模拟信号,模型需要real 类型的输入端口。

我怀疑选择了 STD_LOGIC 端口类型,因为综合工具不会接受“真实”类型的端口。所以在这方面,模型是有缺陷的。解决方案是有两个模型:一个用于仿真,一个用于综合。

【讨论】:

  • 我想你不知道 vivado 如何使用 IP CORE XADC 以及创建了哪些端口。这是我的项目的视频,它不“接受”来自信号发生器的模拟信号。 imgur.com/a/nndar8s 端口和上面一样所以是STD_LOGIC类型
  • 我只看到 16 个数字输出。 (16 个 LED)
  • 视频中的项目使用 2 个端口 (vaux5 / vaux7) - 检查数据表。来自 xadc 的帧是 12 位数据和 4 位“注意”,我从中将 8 传递给 xadc(一个来自 vaux5,第二个来自 vaux7)
【解决方案2】:

要模拟模拟输入,您需要使用模拟刺激文件。

在 UG480 http://www.xilinx.com/support/documentation/user_guides/ug480_7Series_XADC.pdf 中有一个示例,包括 Stimulus 文件和测试台。

SIM_MONITOR_FILE => "design.txt" -- 模拟仿真数据文件名

您还可以在 Vivado 语言模板中查看激励文件示例 Vivado Language Template

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-10
    • 2010-10-11
    相关资源
    最近更新 更多