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

 
 
3 страниц V  < 1 2 3  
Reply to this topicStart new topic
vetal
сообщение Jun 22 2008, 18:30
Сообщение #31


Гуру
******

Группа: Модераторы
Сообщений: 2 095
Регистрация: 27-08-04
Из: Россия, СПб
Пользователь №: 553



Цитата(Kuzmi4 @ Jun 22 2008, 20:40) *
2 vetal -
Что-то не понял я ваших манипуляций

Почему 6*16 == 8*16 ??
Но даже в таком случае - это 16 байт , а в мапе существует 32 байта для этого компонента.
crying.gif

6 и 8 - это в пересчете на линии адреса равны.

По адресации я уже сказал - 32 битный доступ к регистрам. Если регистр 16 бит, то это не говорит что он занимает 2 байта в адресном пространстве. Он может занимать и 4, и 8 (для 64 битного мастера) и.т.д.
Такое решение дает упрощение дешифраторов в шине.
Go to the top of the page
 
+Quote Post
Kuzmi4
сообщение Jun 23 2008, 06:43
Сообщение #32


Гуру
******

Группа: Свой
Сообщений: 3 304
Регистрация: 13-02-07
Из: 55°55′5″ 37°52′16″
Пользователь №: 25 329



Что - то чем дальше в лес тем толще партизаны...
Не ясно всё же к чему относятся те 20 лишних байт в адресном пространстве..

Пока накопал an333 - буду смотреть... smile3046.gif
Go to the top of the page
 
+Quote Post
Kuzmi4
сообщение Jun 23 2008, 13:34
Сообщение #33


Гуру
******

Группа: Свой
Сообщений: 3 304
Регистрация: 13-02-07
Из: 55°55′5″ 37°52′16″
Пользователь №: 25 329



Значит сваял я тут свою периферийку по an333 - мдя - сильно отличается процесс от того, что описан в апноте..
Значит что имеется
 Р В Р’ Р’ Р’ Р’ Р’ Р’ Р’˜Р В·Р С•бражение уменьшено
Прикрепленное изображение
(15.14 килобайт)

тобто есть 3 32-х битных регистра

В RTL-е показало вот это:
 Р В Р’ Р’ Р’ Р’ Р’ Р’ Р’˜Р В·Р С•бражение уменьшено
Прикрепленное изображение
(7.17 килобайт)

Внутренности своей периферии проверил - всё как должно быть.

В итоге в мапе получил вот что :
 Р В Р’ Р’ Р’ Р’ Р’ Р’ Р’˜Р В·Р С•бражение уменьшено
Прикрепленное изображение
(16.25 килобайт)

Как видно из приведённых рисунков - должно было быть 3х4 байта,а в результате в мапе - 16 байт...

В принипе есть идейка - разрядность адреса у меня - [1..0] - тобто 0,1,2,3 - юзается 3 но есть 4 элемента. То есть получается система просто добавила есчё 1-н 32-х битный регистр чтоб был полный набор - 00,01,10,11 для шины адреса ?
То есть получается система довалила сама 1 слово в мапу памяти для своего внутреннего удобства ??
Если да - то какие есчё сюрпризы могут подстерегать ?
Go to the top of the page
 
+Quote Post
vetal
сообщение Jun 23 2008, 17:01
Сообщение #34


Гуру
******

Группа: Модераторы
Сообщений: 2 095
Регистрация: 27-08-04
Из: Россия, СПб
Пользователь №: 553



Цитата
В принипе есть идейка - разрядность адреса у меня - [1..0] - тобто 0,1,2,3 - юзается 3 но есть 4 элемента. То есть получается система просто добавила есчё 1-н 32-х битный регистр чтоб был полный набор - 00,01,10,11 для шины адреса ?
То есть получается система довалила сама 1 слово в мапу памяти для своего внутреннего удобства ??
Если да - то какие есчё сюрпризы могут подстерегать ?

рекомендую нарисовать ручками(на мультиплексорах) схему, которую вы пытаетесь реализовать и попытаться разобраться самому.

Если вы выделили 2 линии адреса, то сколько в выделенном вами адресном пространстве может поместиться полноразрядных(data_len-1 .. 0) регистров? И сколько это будет байт? И что по вашему должен отобразить sopc_builder для заданных вами условий?
Go to the top of the page
 
+Quote Post
Kuzmi4
сообщение Jun 24 2008, 07:37
Сообщение #35


Гуру
******

Группа: Свой
Сообщений: 3 304
Регистрация: 13-02-07
Из: 55°55′5″ 37°52′16″
Пользователь №: 25 329



2 vetal - Спасибо, потихоньку начинаю понимать.
Я выделил для адреса -> [1:0] -> то есть возможных элемента 4 и у меня 32-х битные регистры (4 байта ), соответсвенно полная мапа будет 4х4байта - он то не знает что я не юзаю самый верхний -> 11 - адресс - я то ему это сказать не могу - получается мои проблемы - юзаю или не юзаю его - в физике адреса он то заложен...
Теперь вроде всё становится на свои места.
smile.gif

PS
Достал я всё таки альтеровский саппорт - выдали мне они секретную тайну - каГ устроен UART - я так понял - абы я отвязался со своими тупыми smile.gif вопросами. Вот мапа
 Р В Р’ Р’ Р’ Р’ Р’ Р’ Р’˜Р В·Р С•бражение уменьшено
Прикрепленное изображение
(9.84 килобайт)

Тобто всё тоже стало на свои места
yeah.gif
Go to the top of the page
 
+Quote Post
Kuzmi4
сообщение Jun 24 2008, 13:53
Сообщение #36


Гуру
******

Группа: Свой
Сообщений: 3 304
Регистрация: 13-02-07
Из: 55°55′5″ 37°52′16″
Пользователь №: 25 329



Значит переработал я апнот333 - чтоб его в свю систему интегрировать - как оказалось не всё там так просто да и не работает он как должно быть - то есть при записи начальных данных - секундный интервал (50MHz тикалка на борде), быть в 0 - пол секунды потом в 1 - пол секунды -> имеем - сначала выход установлен в 0 (где то пол секунды как и должно быть) , потом в 1 и всё (проверяю светодиодом на лапе , потому как осцила под рукой нету) - далее светодиод горит и не тухнет - то есть отрабатывается 1 цикл - а дальше - глухо..
В дебуге проверял - значения по адресам записываются правильные..
Проверял несколько раз - логика враппера и PWM - вроде правильная .. Но вот почему не работает... sad.gif
Значит такой глобальный смысл
 Р В Р’ Р’ Р’ Р’ Р’ Р’ Р’˜Р В·Р С•бражение уменьшено
Прикрепленное изображение
(5.66 килобайт)

Верхняя картинка - это то , что написано в апноте - нижняя - то что есть в действительности на лапе PWM в моей переработанной реализации..
Симуляция именно самого PWM - показывает , что он при стабильных значениях на входах - выход генерит постоянно - как и должно быть по сути..

Значит собственно wrapper девайса для avalon memory-mapped slave device:
Код
-- Adress decode
clock_divide_reg_selected <=  ( not address(1) ) and ( not address(0) );    --address 00
duty_cycle_reg_selected <= ( not address(1) ) and  address(0);        --address 01
enable_reg_selected       <=  address(1) and ( not address(0) );    --address 10
--Determination - if a vaild transaction was initiated
valid_write <= chip_select and write_signal;
valid_read  <= chip_select and read_signal;
--Determination - if a write occurred to a specific address
write_to_clock_divide <= valid_write and clock_divide_reg_selected;
--write_to_duty_cycle   <= valid_write and duty_cycle_reg_selected;
--write_to_enable       <= valid_write and enable_reg_selected;
--Determination - if a read occurred to a specific address
read_to_clock_divide <= valid_read and clock_divide_reg_selected;
read_to_duty_cycle   <= valid_read and duty_cycle_reg_selected;
read_to_enable       <= valid_read and enable_reg_selected;
--Determination - which byte lane to write
clk_div_en3 <= valid_write and write_to_clock_divide and byte_enable(3);
clk_div_en2 <= valid_write and write_to_clock_divide and byte_enable(2);
clk_div_en1 <= valid_write and write_to_clock_divide and byte_enable(1);
clk_div_en0 <= valid_write and write_to_clock_divide and byte_enable(0);

duty_cyc_en3 <= valid_write and duty_cycle_reg_selected and byte_enable(3);
duty_cyc_en2 <= valid_write and duty_cycle_reg_selected and byte_enable(2);
duty_cyc_en1 <= valid_write and duty_cycle_reg_selected and byte_enable(1);
duty_cyc_en0 <= valid_write and duty_cycle_reg_selected and byte_enable(0);

enable_en0   <= valid_write and enable_reg_selected and byte_enable(0);

-----------------------------------------------------------------------
-- Read Data Bus Mux
-----------------------------------------------------------------------
Read_process:    process (read_to_clock_divide, read_to_duty_cycle, read_to_enable )
                begin
                --================================================================================
=======================================================
                    if (read_to_clock_divide='1') then
                        read_data <= clock_divide_register;
                    elsif (read_to_duty_cycle='1') then
                        read_data <= duty_cycle_register;
                    elsif (read_to_enable='1') then
                        read_data <= "0000000000000000000000000000000" & enable_register;
                    else
                        read_data <= "00000000000000000000000000000000"; -- if nothing selected - ZEROs out
                    end if;
                --================================================================================
=======================================================    
                end process;
-----------------------------------------------------------------------
-- Write to clock_divide Register
-----------------------------------------------------------------------
WR_CLK_DIVIDE:    process (clk, resetn)
                begin
                    if (resetn='0') then
                        clock_divide_register <= "00000000000000000000000000000000";
                    elsif (rising_edge(clk)) then
                        --++++++++++++++++++++++++
                            if(clk_div_en3='1') then
                                clock_divide_register(31 downto 24) <= write_data(31 downto 24);     
                            else         
                                clock_divide_register(31 downto 24) <= clock_divide_register(31 downto 24);  
                            end if;
                            if(clk_div_en2='1') then
                                clock_divide_register(23 downto 16) <= write_data(23 downto 16);     
                            else
                                clock_divide_register(23 downto 16) <= clock_divide_register(23 downto 16);    
                            end if;
                            if(clk_div_en1='1') then
                                clock_divide_register(15 downto 8) <= write_data(15 downto 8);     
                            else
                                clock_divide_register(15 downto 8) <= clock_divide_register(15 downto 8);
                            end if;
                            if(clk_div_en0='1') then
                                clock_divide_register(7 downto 0) <= write_data(7 downto 0);
                            else
                                clock_divide_register(7 downto 0) <= clock_divide_register(7 downto 0);
                            end if;
                        --++++++++++++++++++++++++
                    end if;
                end process;
-----------------------------------------------------------------------
-- Write to duty_cycle Register
-----------------------------------------------------------------------
WR_DC_REGISTER:    process (clk, resetn)    
                begin
                    if (resetn='0') then
                        duty_cycle_register <= "00000000000000000000000000000000";
                    elsif (rising_edge(clk)) then
                        --++++++++++++++++++++++++
                            if(duty_cyc_en3='1') then
                                duty_cycle_register(31 downto 24) <= write_data(31 downto 24);     
                            else         
                                duty_cycle_register(31 downto 24) <= duty_cycle_register(31 downto 24);  
                            end if;
                            if(duty_cyc_en2='1') then
                                duty_cycle_register(23 downto 16) <= write_data(23 downto 16);     
                            else
                                duty_cycle_register(23 downto 16) <= duty_cycle_register(23 downto 16);    
                            end if;
                            if(duty_cyc_en1='1') then
                                duty_cycle_register(15 downto 8) <= write_data(15 downto 8);     
                            else
                                duty_cycle_register(15 downto 8) <= duty_cycle_register(15 downto 8);
                            end if;
                            if(duty_cyc_en0='1') then
                                duty_cycle_register(7 downto 0) <= write_data(7 downto 0);
                            else
                                duty_cycle_register(7 downto 0) <= duty_cycle_register(7 downto 0);
                            end if;
                    end if;
                end process;
-----------------------------------------------------------------------
-- Write to Enable Register
-----------------------------------------------------------------------
WR_TO_EN:        process (clk, resetn)
                begin
                    if (resetn='0') then
                        enable_register <= '0';
                    elsif (rising_edge(clk)) then
                        if(enable_en0='1') then
                            enable_register <= write_data(0);
                        else
                            enable_register <= enable_register;
                        end if;
                    end if;
                end process;
-----------------------------------------------------------------------
-- Assigning Input to Output
--assign register values to register file outputs to the PWM
pwm_clock_divide <= clock_divide_register;
pwm_duty_cycle   <= duty_cycle_register;
pwm_enable       <= enable_register;


Собсно PWM
Код
--PWM Counter Process
    process (clk,resetn)
    begin
    --********************************************************************
    if (rising_edge(clk)) then
    --====================================================================
        if (resetn = '0') then
            counter <= "00000000000000000000000000000000";
        else
            if (pwm_enable='1') then
                if ( counter >= clock_divide ) then
                    counter <= "00000000000000000000000000000000";
                else
                    counter <= counter + 1;
                end if;
            end if;
        end if;
    --====================================================================
    end if;
    --********************************************************************
    end process;
--//////////////////////////////////////////////////////////////////////////////
--PWM Comparitor
    process (clk,resetn)
    begin
    --********************************************************************
    if (rising_edge(clk)) then
    --====================================================================    
    if (resetn='0') then
            tmp_pwm_out <= '0';
    else
            if (pwm_enable='1') then
                if ( counter >= duty_cycle ) then
                    tmp_pwm_out <= '1';
                else
                    tmp_pwm_out <= tmp_pwm_out;
                end if;
            end if;            
    end if;
    --====================================================================    
    end if;    
    --********************************************************************
    end process;
--route signal
pwm_out <= tmp_pwm_out;

Буду очень признателен если кто подскажет где наплужил. crying.gif
А то сам проверял - вроде всё верно ....
help.gif
Go to the top of the page
 
+Quote Post
Postoroniy_V
сообщение Jun 25 2008, 03:07
Сообщение #37


МедвеД Инженер I
****

Группа: Свой
Сообщений: 816
Регистрация: 21-10-04
Пользователь №: 951



Цитата(Kuzmi4 @ Jun 24 2008, 22:53) *
Значит переработал я апнот333 - чтоб его в свю систему интегрировать - как оказалось не всё там так просто да и не работает он как должно быть - то есть при записи начальных данных - секундный интервал (50MHz тикалка на борде), быть в 0 - пол секунды потом в 1 - пол секунды -> имеем - сначала выход установлен в 0 (где то пол секунды как и должно быть) , потом в 1 и всё (проверяю светодиодом на лапе , потому как осцила под рукой нету) - далее светодиод горит и не тухнет - то есть отрабатывается 1 цикл - а дальше - глухо..
......
Верхняя картинка - это то , что написано в апноте - нижняя - то что есть в действительности на лапе PWM в моей переработанной реализации..
Симуляция именно самого PWM - показывает , что он при стабильных значениях на входах - выход генерит постоянно - как и должно быть по сути..

Значит собственно wrapper девайса для avalon memory-mapped slave device:
...........

Собсно PWM
Код
...............
--PWM Comparitor
    process (clk,resetn)
    begin
    --********************************************************************
    if (rising_edge(clk)) then
    --====================================================================    
    if (resetn='0') then
            tmp_pwm_out <= '0';
    else
            if (pwm_enable='1') then
                if ( counter >= duty_cycle ) then
                    tmp_pwm_out <= '1';
                else
                    tmp_pwm_out <= tmp_pwm_out;--tmp_pwm_out <= '0';??????????????????????????????????????????????
                end if;
            end if;            
    end if;
    --====================================================================    
    end if;    
    --********************************************************************
    end process;
--route signal
pwm_out <= tmp_pwm_out;

Буду очень признателен если кто подскажет где наплужил. crying.gif
А то сам проверял - вроде всё верно ....
help.gif

Очень и очень мне лениво ковырятся в вашем коде
но вот не ясно почему компаритор не сбрасывает в 0 -tmp_pwm_out; ????
с таким компаритором код и будет работать так как вы описали.
может сначала родной аппнот запустить? без глубокой переработки...а потом уже совершенствовать под себя?
или я что не понимаю 07.gif


--------------------
Cogito ergo sum
Go to the top of the page
 
+Quote Post
Kuzmi4
сообщение Jun 25 2008, 08:59
Сообщение #38


Гуру
******

Группа: Свой
Сообщений: 3 304
Регистрация: 13-02-07
Из: 55°55′5″ 37°52′16″
Пользователь №: 25 329



2 Postoroniy_V - большой a14.gif .
При создании почему то больше уделил внимания авалоновской части и почему то из вида упустил именно это.
Завтыкал просто конструкцию
Код
            if (counter == 0)
                pwm_out <= 0;
            else
                pwm_out <= pwm_out;
            end

Это else для
Код
        if (counter >= duty_cycle)begin
            pwm_out <= 1'b1;
        end

Есчё раз дЯкую!
Go to the top of the page
 
+Quote Post
Kuzmi4
сообщение Jun 27 2008, 07:38
Сообщение #39


Гуру
******

Группа: Свой
Сообщений: 3 304
Регистрация: 13-02-07
Из: 55°55′5″ 37°52′16″
Пользователь №: 25 329



Тут появился вопросик касательно INOUT бита - ну на пример как биты прерываний в UART например - выставляется в 1 когда назрело прерывание и ручками сбрасывается в 0 -> то есть записывается туда 0 руками. Как такое можно реализовать ? 1111493779.gif
Пока более менее нормального варианта не придумал smile3046.gif
Go to the top of the page
 
+Quote Post
Kuzmi4
сообщение Jun 28 2008, 21:47
Сообщение #40


Гуру
******

Группа: Свой
Сообщений: 3 304
Регистрация: 13-02-07
Из: 55°55′5″ 37°52′16″
Пользователь №: 25 329



В обсчем поборол я этот вопрос - сврганил там 2 шины на чтение и на запись - на запись там - хитрая реализация - чтоб или 0 или 1 выставлять в флажках.
В обсчем получил шим с своим интерруптом smile.gif
Go to the top of the page
 
+Quote Post
Mozart
сообщение Aug 6 2008, 13:01
Сообщение #41


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

Группа: Свой
Сообщений: 154
Регистрация: 16-08-07
Из: Москва
Пользователь №: 29 829



насколько я понял при помощи вот этого сигнала "slave_address" можно обращаться к внутренним регистрам компонента к примеру (писал на верилоге)
Код
always @(posedge clk)
    begin
        if (slave_write == 1'b1)
        begin
            case (slave_address)
                    1'b0 :
                    begin
                        control_register1 <= slave_writedata;
                    end
                    1'b1 :
                    begin
                        control_register2 <= slave_writedata;
                    end
            endcase
        end
    end

ну в зависимости от синала slave_write, slave_read, можно записывать или читать из компонента.
при помощи таких примерно макросов
Код
#ifndef    _altera_avalon_test2_regs_
#define    _altera_avalon_test2_regs_

#include    <io.h>

#define IOADDR_test_CNTR1(base)            __IO_CALC_ADDRESS_NATIVE(base, test_CNTR1_REGISTER_OFFSET)
#define IORD_test_CNTR1(base)              IORD_32DIRECT(base, test_CNTR1_REGISTER_OFFSET)
#define IOWR_test_CNTR1(base, data)        IOWR_32DIRECT(base, test_CNTR1_REGISTER_OFFSET, data)

#define IOADDR_test_CNTR2(base)            __IO_CALC_ADDRESS_NATIVE(base, test_CNTR2_REGISTER_OFFSET)
#define IORD_test_CNTR2(base)              IORD_32DIRECT(base, test_CNTR2_REGISTER_OFFSET)
#define IOWR_test_CNTR2(base, data)        IOWR_32DIRECT(base, test_CNTR2_REGISTER_OFFSET, data)


#define    test_CNTR1_REGISTER_OFFSET 0
#define    test_CNTR2_REGISTER_OFFSET 1


#endif /*_altera_avalon_test2_regs_*/

написал тестовую программку очень тестовую
Код
    IOWR_test_CNTR1(TEST2_INST_BASE, 21);
    IOWR_test_CNTR2(TEST2_INST_BASE, 19);
    
    temp1 = IORD_test_CNTR1(TEST2_INST_BASE);
    temp2 = IORD_test_CNTR2(TEST2_INST_BASE);
    
    IOWR_test_CNTR1(TEST2_INST_BASE, 16);
    IOWR_test_CNTR2(TEST2_INST_BASE, 14);
    
    temp1 = IORD_test_CNTR1(TEST2_INST_BASE);
    temp2 = IORD_test_CNTR2(TEST2_INST_BASE);

и при чтении temp1 и temp2 = я вычитываю сначало 19, потом 14...
что ещё надо "курить" чтобы правильно сделать??

з.ы. верилоговский файл я приложил

//------------------------------------------------------------------
всё разобрался... напутал с адресацией...

Сообщение отредактировал Mozart - Aug 6 2008, 13:54
Прикрепленные файлы
Прикрепленный файл  test.rar ( 387 байт ) Кол-во скачиваний: 26
 


--------------------
все косяки, даже о которых не знает сам разработчик, - мои
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 20th June 2025 - 22:28
Рейтинг@Mail.ru


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