0

我编写了一个 VHDL 设计,将时钟频率减半并将这个“数据时钟”输出到 sclk 引脚。我还有一个名为“sda”的数据引脚,我想从中发送数据。以下代码工作正常。我看到 sclk 和 sda 的时钟信号被永久设置为高电平。启用附加到一个按钮。

library  ieee;
use  ieee.std_logic_1164.all;
use  ieee.std_logic_unsigned.all;

-- For Main Clock --
library machXO3l;
use machXO3l.all;
--------------------

entity top is
    -- entity's pin out.
     port(
            enable  : in std_logic;
            sda     : out std_logic     := '0';
            sclk    : out std_logic     := '0'  
         );
end entity;

architecture top_behav of top is
    signal temp_sclk    :   std_logic   := '0';
    signal clk          :   std_logic;
    signal temp_sda     :   std_logic   := '1';
    signal stdby        :   std_logic   := '0';

    component OSCH
    -- Component description that is being used within the entity.
    -- synthesis translate_off
        generic (NOM_FREQ: string := "24.18");

    -- synthesis translate_on
        port(
                STDBY   : in std_logic;
                OSC     : out std_logic
            );
    end component;

attribute NOM_FREQ : string;
attribute NOM_FREQ of OSCinst0 : label is "24.18";

begin

    OSCinst0: OSCH
    -- synthesis translate_off
    generic map( NOM_FREQ => "24.18" )

    -- synthesis translate_on
    -- mapping the OSCH component to our entity pin out.
    port map(  
                OSC     => clk,
                STDBY   => stdby
             );

    -- DATA CLOCK GENERATION
    sclk_p : process(clk, enable)
    begin
        if (enable = '0') then
            temp_sclk   <= '0';
        elsif (clk'event and clk = '1') then
            temp_sclk <= NOT temp_sclk;
        end if;
    end process;
    sclk    <= temp_sclk;   

    sda <= temp_sda;
end top_behav;

问题是当我在架构中创建以下进程时,两条线都永久设置为 0。我不明白为什么。模拟工作正常。我能够综合我的代码并将其编程到 FPGA 上。但是当使用示波器监控引脚时,它们只是设置为低。

sda_p : process(clk, enable)
begin
    if (enable = '0') then
        temp_sda <= '0';
    else
        temp_sda <= '1';
    end if;
end process;

以下工作也很好:

sda_p : process(clk, enable)
begin
    temp_sda <= '1';
end process;

我正在使用 lattice diamond 和 machx03l evk

4

2 回答 2

1

在 Lattice Diamond 中,首先看一下网表分析器(图标和图片如下所示)

格网表分析仪

检查综合逻辑是否正确。如果网表分析器显示正确的逻辑,那么您需要相信这就是将要合成的内容。然后你消除了你的不确定性,不再有任何怀疑。

它是否确实表明您正在接地,或者它是否显示了要合成的正确预期逻辑?

如果它显示它是正确的,那么您的问题只能是因为您的外部硬件或您的输出设置。请检查:

  1. 输出设置(下图红框)
  2. 拉模式与您的外部世界相匹配(下面的紫色突出显示)
  3. 驱动强度(下面的红色突出显示)
  4. 检查您的引脚输出的去向。你的负载是多少?它会影响你驾驶的东西吗?

在此处输入图像描述

您提到您使用示波器监控信号,是莱迪思逻辑分析仪吗?还是真正的示波器?

如果它使用莱迪思逻辑分析仪,您将分析仪实例化为 FPGA 内的逻辑块,那么我能想到的唯一其他原因是您的时钟无法正常工作。

如果使用示波器,仍然可能存在问题,可以通过上述症状和潜在问题合理解释

于 2019-03-20T08:04:10.577 回答
0

最后,我的代码是正确的,但由于 machx03l 只允许有限的 RAM 闪存编程(与 machx03lf 板相比),我使用的是 SPI 闪存编程接口。使用这个接口很痛苦——很多时候,在对电路板进行编程时,我必须继续执行“背景、闪存、擦除、验证”。其他时候 IDE 抱怨我有一个 'CHECK_ID' 错误,在这种情况下我求助于使用'Flash,erase,verify' 方法。如果后者确实有效而董事会什么也不做,那么总是做前者并且它应该有效,因为人们对他们的代码有信心。

于 2019-04-07T11:13:28.510 回答