реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Несовпадает результат моделирования с реальной работой
seldim
сообщение Jul 11 2012, 04:33
Сообщение #1


Частый гость
**

Группа: Участник
Сообщений: 96
Регистрация: 2-04-12
Из: Саратов
Пользователь №: 71 142



Есть самодельная отладочная плата с циклоном 4 к которому подключен лан контроллер. Пытаюсь произвести запись в конфигурационные регистры. Шина 16 разрядов, 8 разрядов адрес, сигналы CS, WR, RD. Написал VHDL код который, при нажатии на первую кнопку на отладочной плате, должен выдать сигнал CS, WR, подать соответствующие адреса и данные. Квеста сим код проглатила графики красивые все работает как нужно. Загружаю код в реальную железку и вижу что код не работает. Не формируется даже сигнал CS. Частота CLK_20_MHz_72 опущена до 1 МГц. RTL вроде нормальный. Выходные линии протестировал пробными сигналами не засажены. Если сможете подсказать в чем ошибка и вообще покритикуйте буду признателен.
Код
LIBRARY ieee;    

    use IEEE.Std_logic_1164.all;                
    use IEEE.Std_logic_unsigned.all;
    use IEEE.std_logic_arith.all;
    use IEEE.numeric_std.all;


ENTITY LAN_drv IS        
    
    PORT    
        (
            RESET                  : in    std_logic;
            CLK_20_MHz_72      : in    std_logic;
            Bt_IN                  : in    std_logic_vector (7 downto 0);
            
            ADR_OUT                : out    std_logic_vector (7 downto 0);
            DATA_LAN1_INOUT    : inout    std_logic_vector (15 downto 0);
            WR_LAN1_OUT            : out    std_logic;
            RD_LAN1_OUT            : out    std_logic;
            CS_LAN1_OUT            : out    std_logic

        );
    END LAN_drv;

ARCHITECTURE arhitektura OF LAN_drv IS
signal         ADR_LO_TX_CFG            : std_logic_vector(7 downto 0):= X"70";
signal         ADR_HI_TX_CFG            : std_logic_vector(7 downto 0):= X"71";
signal         ADR_LO_GPIO_CFG        : std_logic_vector(7 downto 0):= X"88";
signal         ADR_HI_GPIO_CFG        : std_logic_vector(7 downto 0):= X"89";
signal         LO_WORD_TX_CFG        : std_logic_vector (15 downto 0):= X"0003";
signal         HI_WORD_TX_CFG        : std_logic_vector (15 downto 0):= X"0000";
signal         LO_WORD_GPIO_CFG    : std_logic_vector (15 downto 0):= X"0000";
signal         HI_WORD_GPIO_CFG    : std_logic_vector (15 downto 0):= X"7000";

signal         BUF_DATA_OUT        : std_logic_vector (15 downto 0);
signal         BUF_ADR_OUT            : std_logic_vector (7 downto 0);
signal         sel                    : std_logic_vector (1 downto 0);

signal         CS_LAN1                : std_logic := '1';
signal         WR_LAN1                : std_logic := '1';
signal         RD_LAN1                : std_logic := '1';

signal         WR_RD_count            : integer range 0 to 3;
signal         count_bit            : std_logic_vector (3 downto 0);

    BEGIN
SEL(1 downto 0) <= BT_IN(1 downto 0);
CS_LAN1_OUT <= CS_LAN1;
WR_LAN1_OUT <= WR_LAN1;
RD_LAN1_OUT <= RD_LAN1;
ADR_OUT <= BUF_ADR_OUT;
DATA_LAN1_INOUT <= BUF_DATA_OUT when WR_LAN1 = '0' else "ZZZZZZZZZZZZZZZZ";

        PROCESS (CLK_20_MHz_72, WR_RD_count, SEL, RESET)
            BEGIN
                if WR_RD_count = 2 or RESET = '0' then CS_LAN1 <= '1';
                elsif CLK_20_MHz_72'EVENT and CLK_20_MHz_72 = '1' THEN
                    if SEL /= "11" and WR_RD_count = 0 then CS_LAN1 <= '0';
                    end if;
                end if;
            END PROCESS;
WR_LAN1 <= CS_LAN1 or CLK_20_MHz_72;

        PROCESS (WR_LAN1, SEL)
            BEGIN
                if SEL = "11" then WR_RD_count <= 0;
                elsif WR_LAN1'EVENT and WR_LAN1 = '1' THEN
                    WR_RD_count <= WR_RD_count + 1;
                end if;
            END PROCESS;            

        PROCESS (CLK_20_MHz_72, WR_RD_count, SEL)
            BEGIN
                if CLK_20_MHz_72'EVENT and CLK_20_MHz_72 = '0' THEN
                        case SEL is
                            when "10" =>
                                if WR_RD_count = 0 Then BUF_ADR_OUT <= ADR_LO_TX_CFG; BUF_DATA_OUT <= LO_WORD_TX_CFG;
                                    else BUF_ADR_OUT <= ADR_HI_TX_CFG; BUF_DATA_OUT <= HI_WORD_TX_CFG;
                                end if;
                            
                            when "01" =>
                                if WR_RD_count = 0 Then BUF_ADR_OUT <= ADR_LO_GPIO_CFG; BUF_DATA_OUT <= LO_WORD_GPIO_CFG;
                                    else BUF_ADR_OUT <= ADR_HI_GPIO_CFG; BUF_DATA_OUT <= HI_WORD_GPIO_CFG;
                                end if;
                            
                            when others => BUF_DATA_OUT <= X"0000"; BUF_ADR_OUT <=X"00";
                        end case;
                end if;
            END PROCESS;

            
END arhitektura;
Go to the top of the page
 
+Quote Post
des00
сообщение Jul 11 2012, 04:49
Сообщение #2


Вечный ламер
******

Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453



Цитата(seldim @ Jul 10 2012, 22:33) *
Не формируется даже сигнал CS.

85% что ноги не правильно подцеплены, 10% начальной инициализации нет


--------------------
Go to the top of the page
 
+Quote Post
seldim
сообщение Jul 11 2012, 05:59
Сообщение #3


Частый гость
**

Группа: Участник
Сообщений: 96
Регистрация: 2-04-12
Из: Саратов
Пользователь №: 71 142



Ноги правильно раставил проверял клоками. Насчет инициализации возможно. Сигнал тап показывает что WR_RD_count стоит все время в значении 2 хотя кнопка не нажата. А ненажатая кнопка и reset должны счетчик сбросить. Это меня в тупик ставит

Выявил следующее не работают асинхронный сброс и асинхронная установка в 1. Причины неясны RTL навид правильный но цепи сброса и установки почемуто не работают.
Go to the top of the page
 
+Quote Post
Мур
сообщение Jul 11 2012, 06:01
Сообщение #4


Знающий
****

Группа: Свой
Сообщений: 815
Регистрация: 7-06-06
Из: Харьков
Пользователь №: 17 847



Внимательно отнеситесь к Ресету. Откуда он и завязка на РLL есть(по готовности)?
Go to the top of the page
 
+Quote Post
seldim
сообщение Jul 11 2012, 06:24
Сообщение #5


Частый гость
**

Группа: Участник
Сообщений: 96
Регистрация: 2-04-12
Из: Саратов
Пользователь №: 71 142



Все проблема решилась. Сам виноват. По кнопкам в ПЛИС стоял обработчик с антидребезгом который уровни инвертировал. Ну естественно что на входе Сигнал тап показывал точто я хотел а на тригеры приходили инверсные сигналы и ничего не работало. Вывод - Нельзя ходить в отпуск.
Go to the top of the page
 
+Quote Post
dsmv
сообщение Jul 11 2012, 08:34
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 451
Регистрация: 6-09-05
Из: Москва
Пользователь №: 8 284



Цитата(seldim @ Jul 11 2012, 09:24) *
Вывод - Нельзя ходить в отпуск.

Категорически не согласен! laughing.gif


Go to the top of the page
 
+Quote Post
Timmy
сообщение Jul 11 2012, 19:11
Сообщение #7


Знающий
****

Группа: Участник
Сообщений: 835
Регистрация: 9-08-08
Из: Санкт-Петербург
Пользователь №: 39 515



Цитата(seldim @ Jul 11 2012, 10:24) *
Все проблема решилась. Сам виноват. По кнопкам в ПЛИС стоял обработчик с антидребезгом который уровни инвертировал. Ну естественно что на входе Сигнал тап показывал точто я хотел а на тригеры приходили инверсные сигналы и ничего не работало. Вывод - Нельзя ходить в отпуск.

Правильный вывод - инверсные сигналы должны содержать суффикс "N" в своём имени, или что-нибудь в этом роде.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 13th July 2025 - 13:17
Рейтинг@Mail.ru


Страница сгенерированна за 0.01408 секунд с 7
ELECTRONIX ©2004-2016