VHDL дизайн - создание цикла if во втором процессе не работает - PullRequest
0 голосов
/ 14 марта 2019

Я написал схему 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;

Я использую решетку с алмазом и machx03l evk

Ответы [ 2 ]

1 голос
/ 20 марта 2019

В Lattice Diamond, прежде всего, посмотрите на анализатор списка соединений (значок и изображение показаны ниже)

Lattice Netlist Analyzer

Убедитесь, что синтезированныйлогика верна.Если анализатор списка соединений показывает правильную логику, то вам нужно верить, что это то, что будет синтезировано.Тогда вы устранили свою неопределенность, и сомнений больше нет.

Действительно ли это показывает, что вы соединяетесь с землей, или это показывает правильную предполагаемую логику для синтеза?

Если это показывает, что это правильно, то ваша проблема может быть только из-за вашего внешнего оборудования или ваших настроек вывода.Пожалуйста, проверьте:

  1. Настройки вывода (красный прямоугольник ниже)
  2. Режим вытягивания соответствует вашему внешнему миру (фиолетовый цвет выделен ниже)
  3. Мощность привода (красный выделен внизу)
  4. Проверьте, куда пойдет ваш вывод.Какова ваша нагрузка?Это влияет на то, что вы ведете?

enter image description here

Вы упомянули, что вы контролировали сигналы с помощью оптического прицела, это анализатор решетки?или настоящий осциллограф?

Если он использует Lattice Logic Analyzer, где вы создаете экземпляр анализатора в качестве логического блока внутри FPGA, то единственная другая причина, о которой я могу подумать, это то, что ваши часы не работают должным образом.

При использовании осциллографа все еще может быть проблема, которую можно правдоподобно объяснить вышеуказанными симптомами и потенциальными проблемами

0 голосов
/ 07 апреля 2019

В конце концов, мой код был верным, но поскольку machx03l допускает только ограниченное программирование флэш-памяти (по сравнению с платой machx03lf), я использую интерфейс программирования флэш-памяти SPI. Использование этого интерфейса - это боль - много раз мне приходилось делать «Фон, прошивать, стирать, проверять» при программировании платы. В других случаях IDE жалуется, что у меня появляется ошибка «CHECK_ID», и в этом случае я прибегаю к использованию метода «Flash, erase, verify». Если последнее работает, а доска ничего не делает, всегда делайте первое, и оно должно работать, если вы уверены в их коде.

...