USB论坛
直播中

戚歆敦

8年用户 1070经验值
私信 关注
[问答]

AN65974在vivado 2018.2中进行仿真时, 无法获取输出数据信号是怎么回事?

大家好,
我已经尝试过 AN65974 指南 pdf 并下载了 FPGA rtl vhdl 文件夹的示例。 我做了一些配置,例如输入图像和相关信号。 在 vivado 2018.2 中进行仿真时, 我无法获取输出数据信号。
最诚挚的问候。
这是我的测试台代码;
-- 在线自动生成Testbench
- 在https://vhdl.lapinoo.net
-- 生成日期:2024 年 12 月 3 日 18:19:26 UTC
图书馆IEEE ;
使用IEEE .std_logic_1164.all;
实体 tb_slaveFIFO2b_fpga_top 是
结束tb_slaveFIFO2b_fpga_top;
tb_slaveFIFO2b_fpga_top 的架构 tb 是
组件 slaveFIFO2b_fpga_top
端口(reset_in_n:在 std_logic 中;
clk:在std_logic中;
clk_out:输出std_logic;
slcs:输出std_logic;
fdata:输入输出std_logic_vector(15向下到0);
faddr:输出 std_logic_vector(从 1 到 0);
slrd:输出std_logic;
sloe:输出std_logic;
slwr:输出std_logic;
输入图像:在std_logic_vector中(15向下到0);
flaga:在 std_logic 中;
flagb:在 std_logic 中;
flagc:在 std_logic 中;
flagd:在 std_logic 中;
pktend:输出std_logic;
重置:输出std_logic;
mode_p:在 std_logic_vector 中(2 向下到 0));
结束组件;
信号reset_in_n:std_logic;
信号clk:std_logic;
信号clk_out:std_logic;
信号slcs:std_logic;
信号 fdata:std_logic_vector(15 向下到 0);
信号 faddr:std_logic_vector(1 向下到 0);
信号slrd:std_logic;
信号sloe:std_logic;
信号slwr:std_logic;
信号输入图像:std_logic_vector(15向下到0);
信号标志:std_logic;
信号flagb:std_logic;
信号标志c:std_logic;
信号标志:std_logic;
信号 pktend:std_logic;
信号复位:std_logic;
信号mode_p:std_logic_vector(2向下到0);
常数 TbPeriod : 时间 := 100 ns; -- 编辑在此处输入正确的时间
信号 TbClock: std_logic:='0';
信号 TbSimEnded : std_logic := '0';
开始
待处理:slaveFIFO2b_fpga_top
端口映射(reset_in_n => reset_in_n,
clk => 时钟,
clk_out => clk_out,
slcs => slcs,
fdata => fdata,
faddr => faddr,
slrd => slrd,
黑刺李 => 黑刺李,
slwr => slwr,
输入图像 => 输入图像,
弗拉加 => 弗拉加,
flagb => flagb,
flagc => flagc,
flagd => flagd,
pktend => pktend,
重置 => 重置,
模式_p => 模式_p);
-- 时钟生成
当 TbSimEnded /= '1' 时,TbClock <= TbPeriod/2 之后不是 TbClock,否则为 '0';
-- 编辑:检查 clk 是否确实是你的时钟信号
clk <= Tb时钟;
刺激:过程
变量i:整数:=0;
开始

while i < 10000 循环

i:=i+1;

-- 编辑根据需要调整初始化
输入图像<=(其他=>'1');
标志<='1';
flagb<='1';
flagc <= '1';
标志<='1';
mode_p <= (其他 => '1');

-- 复位生成
-- 编辑:检查 reset_in_n 是否真的是你的重置信号
重置_in_n<='1';
等待10纳秒;
重置_in_n<='0';
等待10纳秒;

-- 编辑在此处添加刺激
等待10 * TbPeriod;

-- 停止时钟并终止模拟
TbSim结束<='1';

结束循环;
等待;
结束进程;
结束结核病;
——一些模拟器需要下面的配置块。 通常无需编辑。
tb_slaveFIFO2b_fpga_top 的配置 cfg_tb_slaveFIFO2b_fpga_top 是
结核病
結束;
结束cfg_tb_slaveFIFO2b_fpga_top;

回帖(1)

刘燕

2025-5-14 18:16:01

针对在Vivado仿真中无法获取AN65974示例输出数据的问题,以下是逐步排查和解决方案:




1. 检查时钟和复位信号




  • 时钟信号:


    clk <= not clk after 10 ns; -- 假设主频为50MHz(周期20ns)

    确保时钟周期与设计需求匹配,且信号持续翻转。




  • 复位信号:


    reset_in_n <= '0', '1' after 100 ns; -- 复位在100ns后释放

    确认复位信号在仿真初期有效(低电平),并在合理时间后释放,避免模块始终处于复位状态。






2. 验证输入激励时序




  • 关键控制信号示例:


    -- 模拟FLAGA(FIFO可写标志)在复位后有效
    flagd <= '0', '1' after 200 ns; -- 根据手册要求设置FLAGA为高

    根据AN65974时序图,确保FLAGA/FLAGB在正确时间点变化,指示FIFO状态。




  • 写操作触发:


    process
    begin
    wait until reset_in_n = '1'; -- 等待复位完成
    wait until rising_edge(clk);
    slwr_n <= '0'; -- 启动写操作
    -- 提供数据到data_io...
    wait until flagd = '1'; -- 等待FIFO准备好
    slwr_n <= '1'; -- 结束写操作
    end process;

    确保控制信号(如SLWRFIFOADR)在正确的时钟边沿变化,并符合建立/保持时间。






3. 处理双向数据总线



  • 使用中间信号驱动data_io
    signal data_out : std_logic_vector(31 downto 0);
    signal data_dir : std_logic; -- 方向控制
    data_io <= data_out when data_dir = '1' else (others => 'Z');

    根据操作阶段(读/写)切换方向,避免总线冲突。





4. 检查测试台完整性




  • 补充必要信号初始化:


    sloe_n <= '1'; -- 初始禁用输出使能
    pktend_n <= '1'; -- 初始无包结束

    确保所有输入端口均有合理初始值,避免未定义行为。




  • 增加仿真时间:
    某些操作可能需要较长时间(如DMA传输)。在xsim中延长仿真运行时间:


    run all -- 或指定足够长的时长,如run 1ms





5. 调试与波形分析




  • 添加内部信号监视:
    在测试台中显式导出关键内部信号(如状态机、计数器):


    -- 在元件声明中添加调试端口(需修改设计代码)
    debug_state : out std_logic_vector(3 downto 0)

    或直接在Vivado波形窗口中添加模块内部信号。




  • 典型问题定位:



    • 检查current_state是否进入预期的传输状态。

    • 确认data_io在写周期是否有有效数据输出,方向控制是否正确。






6. 参考官方测试台对比




  • 下载AN65974官方测试台:
    从Cypress/Infineon官网获取参考测试台,对比信号时序(如SLCSFIFOADR的切换时机)。




  • 示例修正片段:


    -- 官方示例可能包含特定延时
    flagd <= '1' after 500 ns; -- 延迟500ns后允许写入





7. 其他注意事项




  • Vivado仿真设置:



    • 确认仿真模式为“行为仿真”(Behavioral)。

    • 检查是否包含所有必要文件(如VHDL库、IP核)。




  • 代码版本兼容性:



    • 确保示例代码支持Vivado 2018.2,部分旧代码可能需要语法调整。






总结步骤:  



  1. 确保时钟复位正确。  

  2. 按手册时序模拟FLAG信号。  

  3. 检查测试台激励是否覆盖所有操作阶段。  

  4. 通过波形分析定位信号异常点。  

  5. 对比官方测试台修正差异。


若问题仍未解决,建议提供仿真波形截图及模块关键信号状态(如复位后的第一个100ns),以便进一步分析。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分