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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Простой вопрос про pwm на verilog, Поиск не работает на слово pwm
Аматер
сообщение Apr 20 2010, 09:32
Сообщение #1


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

Группа: Участник
Сообщений: 95
Регистрация: 3-01-10
Из: Рождественно
Пользователь №: 54 616



Учусь работать с FPGA на verilog. Схемотехнически получается, а на verilog нет. Почему то простейший шим не работает
Код
module pwm_10(clk, pwm_in, pwm_out);
input clk;
input [9:0] pwm_in;
output reg pwm_out;

reg [9:0] pwm_ramp;

always @(posedge clk)
begin
    pwm_ramp <= pwm_ramp + 1'b1;
    pwm_out <= (pwm_in>pwm_ramp);
end
endmodule

То есть работал, а после изменений в другом месте перестал. Вместо этого поставил схемотехнику и все заработало. Ничего не понимаю. Подскажите пожалуйста.
Может что почитать еще подкинете ? dmilyukov сабака googlemail.com

Сообщение отредактировал Аматер - Apr 20 2010, 09:35
Go to the top of the page
 
+Quote Post
des00
сообщение Apr 20 2010, 09:45
Сообщение #2


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

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



Цитата(Аматер @ Apr 20 2010, 03:47) *
То есть работал, а после изменений в другом месте перестал. Вместо этого поставил схемотехнику и все заработало. Ничего не понимаю. Подскажите пожалуйста.

в этом месте ошибок нет, смотрите линии управления шимом.

ЗЫ. по хорошему смену кода шим надо синхронизовать с моментом перехода счетчика через 0


--------------------
Go to the top of the page
 
+Quote Post
Аматер
сообщение Apr 20 2010, 09:56
Сообщение #3


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

Группа: Участник
Сообщений: 95
Регистрация: 3-01-10
Из: Рождественно
Пользователь №: 54 616



Цитата(des00 @ Apr 20 2010, 13:00) *
в этом месте ошибок нет, смотрите линии управления шимом.

ЗЫ. по хорошему смену кода шим надо синхронизовать с моментом перехода счетчика через 0

Ну синхронизировать это дополнительные ресурсы, а у меня и так циклон забился на 80%.
На счет управления тоже понять не могу - когда поставил схемотехнический блок управление не менял, а заработало. Управление кстати вот так выглядит
Код
module m_reg(adr,data_in,clk,rd,wr,cs,data_out,m_adr,m_data,m_wr,m_pwm);
    input[3:0] adr;
    input[15:0] data_in;
    input clk;
    input rd;
    input wr;
    input cs;
    output reg[15:0] data_out;
    output reg[15:0] m_adr;
    output reg[15:0] m_data;
    output reg m_wr;
    output reg[15:0] m_pwm;

    reg m_wr_1;
    
always @ (posedge clk)

if (cs==1) begin
    if (adr==0 && rd==1) begin
        data_out <= 16'd1; // version number
    end else if (adr==2 && rd==1) begin // Adr
        data_out <= m_adr;
    end else if (adr==2 && wr==1) begin
        m_adr <= data_in;
    end else if (adr==4 && rd==1) begin // Write reg
        data_out <= m_data;
    end else if (adr==4 && wr==1) begin
        m_data <= data_in;
        m_wr_1 <= 1'b1;
        m_wr <= m_wr_1;
    end else if (adr==5 && rd==1) begin // Pwm
        data_out <= m_pwm;
    end else if (adr==5 && wr==1) begin
        m_pwm <= data_in;
    end else begin
        data_out <= 16'b0;
        m_wr_1 <= 1'b0;
        m_wr <= m_wr_1;
    end
end

endmodule

Все модули у меня схемотехнически объеденены. Использую Quartus 9.1.

Сообщение отредактировал Аматер - Apr 20 2010, 09:58
Go to the top of the page
 
+Quote Post
des00
сообщение Apr 20 2010, 10:01
Сообщение #4


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

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



Цитата(Аматер @ Apr 20 2010, 04:11) *
Ну синхронизировать это дополнительные ресурсы, а у меня и так циклон забился на 80%.

на 10 триггеров для захвата pwm_in вам хватит, сигнал переноса со счетчика используйте как сигнал захвата %)

Цитата
На счет управления тоже понять не могу - когда поставил схемотехнический блок управление не менял, а заработало. Управление кстати вот так выглядит

еще раз говорю, в коде pwm10 ошибки нет, ошибка где-то в другом месте.


--------------------
Go to the top of the page
 
+Quote Post
lexus.mephi
сообщение Apr 20 2010, 10:43
Сообщение #5


Местный
***

Группа: Свой
Сообщений: 268
Регистрация: 24-09-05
Пользователь №: 8 903



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


--------------------
Мои сайты:www.systemverilog.ru
Go to the top of the page
 
+Quote Post
Putnik
сообщение Apr 20 2010, 12:36
Сообщение #6


Местный
***

Группа: Свой
Сообщений: 214
Регистрация: 4-09-07
Из: Зеленоград
Пользователь №: 30 272



Цитата(des00 @ Apr 20 2010, 14:00) *
в этом месте ошибок нет, смотрите линии управления шимом.

ЗЫ. по хорошему смену кода шим надо синхронизовать с моментом перехода счетчика через 0

Счетчик через ноль вообще не переходит, по коду он будет в иксах, разве это не ошибка?

Шимами не занимался, но по-моему должно быть типа
CODE
-----
always @(posedge clk)
if(reset) pwm_ramp <= 0;
else begin
pwm_ramp <= pwm_ramp + 1'b1;
pwm_out <= (pwm_in>pwm_ramp);
end
endmodule

где ресет сделать от клока на dll или dcm, что там в циклоне есть


--------------------
за Навального!
Go to the top of the page
 
+Quote Post
des00
сообщение Apr 20 2010, 12:47
Сообщение #7


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

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



Цитата(Putnik @ Apr 20 2010, 06:51) *
Счетчик через ноль вообще не переходит, по коду он будет в иксах, разве это не ошибка?
где ресет сделать от клока на dll или dcm, что там в циклоне есть

Это вам моделсим с альдеком сказали? Ошибку в ваших утверждениях сами найдете? smile.gif


--------------------
Go to the top of the page
 
+Quote Post
Аматер
сообщение Apr 20 2010, 12:48
Сообщение #8


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

Группа: Участник
Сообщений: 95
Регистрация: 3-01-10
Из: Рождественно
Пользователь №: 54 616



Прошу прощения, у меня заработало. К сожалению не понял почему.
Еще есть проблемы с частотами, разбираюсь, может из за этого?

А через 0 счетчик переходит, почему нет? Сброс может тоже надо делать, но наверное необязательно.
Go to the top of the page
 
+Quote Post
des00
сообщение Apr 20 2010, 12:49
Сообщение #9


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

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



Цитата(Аматер @ Apr 20 2010, 07:03) *
Прошу прощения, у меня заработало. К сожалению не понял почему.

ИМХО ломается что-то в задании кода шима, где-то есть не учтенная асинхра, при пересборке времянка чуть изменилась и все заработало.

Цитата
А через 0 счетчик переходит, почему нет? Сброс может тоже надо делать, но наверное необязательно.

Бинго, в вашем случае начальное состояние счетчика монописуально %)


--------------------
Go to the top of the page
 
+Quote Post
bogaev_roman
сообщение Apr 20 2010, 12:50
Сообщение #10


Профессионал
*****

Группа: Свой
Сообщений: 1 088
Регистрация: 20-10-09
Из: Химки
Пользователь №: 53 082



Цитата
Счетчик через ноль вообще не переходит, по коду он будет в иксах, разве это не ошибка?

Это на моделировании X будет (и то если где-то есть обратная связь), а в железе все равно работать должно, на триггерах будут вполне конкретные значения.
Тут похоже какие-то временные ошибки, если замена RTL описания на схемотехнический модуль дает неправильную работу (тем более если плисина забита на 80%). Интересно на временные отчеты посмотреть и вообще, что значит не работает (в железке не работает или на моделировани конкретный модуль)?
Go to the top of the page
 
+Quote Post
Putnik
сообщение Apr 20 2010, 12:57
Сообщение #11


Местный
***

Группа: Свой
Сообщений: 214
Регистрация: 4-09-07
Из: Зеленоград
Пользователь №: 30 272



ушел от реальности в моделированиеsmile.gif

в железе, конечно, не иксы будут, а неизвестное значение при старте счетчика, что в такой схеме не важно


--------------------
за Навального!
Go to the top of the page
 
+Quote Post
Аматер
сообщение Apr 20 2010, 13:17
Сообщение #12


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

Группа: Участник
Сообщений: 95
Регистрация: 3-01-10
Из: Рождественно
Пользователь №: 54 616



Цитата(bogaev_roman @ Apr 20 2010, 16:05) *
Это на моделировании X будет (и то если где-то есть обратная связь), а в железе все равно работать должно, на триггерах будут вполне конкретные значения.
Тут похоже какие-то временные ошибки, если замена RTL описания на схемотехнический модуль дает неправильную работу (тем более если плисина забита на 80%). Интересно на временные отчеты посмотреть и вообще, что значит не работает (в железке не работает или на моделировани конкретный модуль)?

Не понимаю что значит временные описания посмотреть?
Вот это что ли?
create_clock -name {IN_50MHz} -period 20.000 -waveform { 0.000 10.000 } [get_ports {IN_50MHz}]
derive_pll_clocks -create_base_clocks
derive_clock_uncertainty
set_false_path -from [get_clocks *] -through [get_pins {DAC1_CLK~output|i DAC1_CLK~output|... короче ко всем пинам, потому что внешнии интрефейсы все сразу клочатся 100МГц.
внутренний клок 100 мгц, еще несколько есть в т.ч. 200(или 120), 20, 6
А не работало на железке - на выходе 0 и все. Заработало кстати на другой железке, потому что первую пришлось коллеге для опытов отдать, со старым проверенным решением в схемотехнике - надо было срочно чтобы работало, вот и воткнул старый блок. после прыганья с бубном.

Клоки кстати хорошии обещает -
Fmax 111 МГц для основных клоков
Fmax 238 МГц для небольшого кусочка который должен до 200 MHz работать.
но ругается на непонятно на что

-0.390 inst1|altpll_component|auto_generated|pll1|clk[1] aom:inst6|aom_out:inst12|lpm_ff:lpm_ff_component|dffs[5] inst1|altpll_component|auto_generated|pll1|clk[1] inst1|altpll_component|auto_generated|pll1|clk[2] 0.001 3.782 4.134

На картинке как раз изголения чтобы на выходе получить сигнал с частотой 200 мгц - сигнал асинхронного сброса это как раз вторая частота clk[2] от pll сдвинутая на 180 градусов относительно тактирующей clk[1]

Сообщение отредактировал Аматер - Apr 20 2010, 13:32
Эскизы прикрепленных изображений
Прикрепленное изображение
 
Go to the top of the page
 
+Quote Post
des00
сообщение Apr 20 2010, 13:40
Сообщение #13


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

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



Цитата(Аматер @ Apr 20 2010, 07:32) *
Вот это что ли?

ну и каша, вываливайте весь код + sdc файл


--------------------
Go to the top of the page
 
+Quote Post
bogaev_roman
сообщение Apr 20 2010, 13:42
Сообщение #14


Профессионал
*****

Группа: Свой
Сообщений: 1 088
Регистрация: 20-10-09
Из: Химки
Пользователь №: 53 082



Цитата
-0.390 inst1|altpll_component|auto_generated|pll1|clk[1] aom:inst6|aom_out:inst12|lpm_ff:lpm_ff_component|dffs[5] inst1|altpll_component|auto_generated|pll1|clk[1] inst1|altpll_component|auto_generated|pll1|clk[2] 0.001 3.782 4.134

На это я так понимаю у Вас слэк отрицательный? И при том, что обе тактовые частоты выше требуемых. Ну похоже сбой на из-за асинхронности при переходе сигнала от одной частоты к другой...
Цитата
Не понимаю что значит временные описания посмотреть?

После временного анализа запустить TimeQuest Analizer и жмякнуть на строчке Top Failing Path (извините за кривость написания, точно не помню как пишется). Если вылезут красные пути, то возможны сбои ну и нужно каждый путь внимательнот просмотреть.
Цитата
А не работало на железке - на выходе 0 и все.

Ну это похоже, что вообще тактовая частота на триггеры не подавалась, либо разрешающий сигнал не преребросился в единицу (может кстати имеено из-за того, что где-то что-то не успело переключиться).

Цитата
На картинке как раз изголения чтобы на выходе получить сигнал с частотой 200 мгц - сигнал асинхронного сброса это как раз вторая частота clk[2] от pll сдвинутая на 180 градусов относительно тактирующей clk[1]

Вот эта вот фраза вообще не очень понятна...
Go to the top of the page
 
+Quote Post
Аматер
сообщение Apr 20 2010, 13:53
Сообщение #15


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

Группа: Участник
Сообщений: 95
Регистрация: 3-01-10
Из: Рождественно
Пользователь №: 54 616



Цитата(des00 @ Apr 20 2010, 16:55) *
ну и каша, вываливайте весь код + sdc файл

Не получается загрузить файл проекта - "Неудачная загрузка. Вам запрещено загружать такой тип файлов" *.sdc тоже.
Исходник sdc без коментариев:
Код
set_time_format -unit ns -decimal_places 3
create_clock -name {IN_50MHz} -period 20.000 -waveform { 0.000 10.000 } [get_ports {IN_50MHz}]
derive_pll_clocks -create_base_clocks
derive_clock_uncertainty
set_clock_groups -asynchronous -group [get_clocks {altera_reserved_tck}]
set_false_path  -from  [get_clocks {inst1|altpll_component|auto_generated|pll1|clk[0]}]  -to  [get_clocks {inst1|altpll_component|auto_generated|pll1|clk[2]}]
set_false_path  -from  [get_clocks {inst1|altpll_component|auto_generated|pll1|clk[2]}]  -to  [get_clocks {inst1|altpll_component|auto_generated|pll1|clk[0]}]
set_false_path  -from  [get_clocks {inst1|altpll_component|auto_generated|pll1|clk[0]}]  -to  [get_clocks {inst1|altpll_component|auto_generated|pll1|clk[1]}]
set_false_path  -from  [get_clocks {inst1|altpll_component|auto_generated|pll1|clk[1]}]  -to  [get_clocks {inst1|altpll_component|auto_generated|pll1|clk[0]}]
set_false_path -to [get_keepers {*altera_std_synchronizer:*|din_s1}]
set_false_path -from [get_keepers {*nios_cpu:the_nios_cpu|nios_cpu_nios2_oci:the_nios_cpu_nios2_oci|nios_cpu_nios2
_oci_break:the_nios_cpu_nios2_oci_break|break_readreg*}] -to [get_keepers {*nios_cpu:the_nios_cpu|nios_cpu_nios2_oci:the_nios_cpu_nios2_oci|nios_cpu_jtag_
debug_module_wrapper:the_nios_cpu_jtag_debug_module_wrapper|nios_cpu_jtag_debug_
m
odule_tck:the_nios_cpu_jtag_debug_module_tck|*sr*}]
set_false_path -from [get_keepers {*nios_cpu:the_nios_cpu|nios_cpu_nios2_oci:the_nios_cpu_nios2_oci|nios_cpu_nios2
_oci_debug:the_nios_cpu_nios2_oci_debug|*resetlatch}] -to [get_keepers {*nios_cpu:the_nios_cpu|nios_cpu_nios2_oci:the_nios_cpu_nios2_oci|nios_cpu_jtag_
debug_module_wrapper:the_nios_cpu_jtag_debug_module_wrapper|nios_cpu_jtag_debug_
m
odule_tck:the_nios_cpu_jtag_debug_module_tck|*sr[33]}]
set_false_path -from [get_keepers {*nios_cpu:the_nios_cpu|nios_cpu_nios2_oci:the_nios_cpu_nios2_oci|nios_cpu_nios2
_oci_debug:the_nios_cpu_nios2_oci_debug|monitor_ready}] -to [get_keepers {*nios_cpu:the_nios_cpu|nios_cpu_nios2_oci:the_nios_cpu_nios2_oci|nios_cpu_jtag_
debug_module_wrapper:the_nios_cpu_jtag_debug_module_wrapper|nios_cpu_jtag_debug_
m
odule_tck:the_nios_cpu_jtag_debug_module_tck|*sr[0]}]
set_false_path -from [get_keepers {*nios_cpu:the_nios_cpu|nios_cpu_nios2_oci:the_nios_cpu_nios2_oci|nios_cpu_nios2
_oci_debug:the_nios_cpu_nios2_oci_debug|monitor_error}] -to [get_keepers {*nios_cpu:the_nios_cpu|nios_cpu_nios2_oci:the_nios_cpu_nios2_oci|nios_cpu_jtag_
debug_module_wrapper:the_nios_cpu_jtag_debug_module_wrapper|nios_cpu_jtag_debug_
m
odule_tck:the_nios_cpu_jtag_debug_module_tck|*sr[34]}]
set_false_path -from [get_keepers {*nios_cpu:the_nios_cpu|nios_cpu_nios2_oci:the_nios_cpu_nios2_oci|nios_cpu_nios2
_ocimem:the_nios_cpu_nios2_ocimem|*MonDReg*}] -to [get_keepers {*nios_cpu:the_nios_cpu|nios_cpu_nios2_oci:the_nios_cpu_nios2_oci|nios_cpu_jtag_
debug_module_wrapper:the_nios_cpu_jtag_debug_module_wrapper|nios_cpu_jtag_debug_
m
odule_tck:the_nios_cpu_jtag_debug_module_tck|*sr*}]
set_false_path -from [get_keepers {*nios_cpu:the_nios_cpu|nios_cpu_nios2_oci:the_nios_cpu_nios2_oci|nios_cpu_jtag_
debug_module_wrapper:the_nios_cpu_jtag_debug_module_wrapper|nios_cpu_jtag_debug_
m
odule_tck:the_nios_cpu_jtag_debug_module_tck|*sr*}] -to [get_keepers {*nios_cpu:the_nios_cpu|nios_cpu_nios2_oci:the_nios_cpu_nios2_oci|nios_cpu_jtag_
debug_module_wrapper:the_nios_cpu_jtag_debug_module_wrapper|nios_cpu_jtag_debug_
m
odule_sysclk:the_nios_cpu_jtag_debug_module_sysclk|*jdo*}]
set_false_path -from [get_keepers {sld_hub:*|irf_reg*}] -to [get_keepers {*nios_cpu:the_nios_cpu|nios_cpu_nios2_oci:the_nios_cpu_nios2_oci|nios_cpu_jtag_
debug_module_wrapper:the_nios_cpu_jtag_debug_module_wrapper|nios_cpu_jtag_debug_
m
odule_sysclk:the_nios_cpu_jtag_debug_module_sysclk|ir*}]
set_false_path -from [get_keepers {sld_hub:*|sld_shadow_jsm:shadow_jsm|state[1]}] -to [get_keepers {*nios_cpu:the_nios_cpu|nios_cpu_nios2_oci:the_nios_cpu_nios2_oci|nios_cpu_nios2
_oci_debug:the_nios_cpu_nios2_oci_debug|monitor_go}]
set_false_path -from [get_clocks {inst1|altpll_component|auto_generated|pll1|clk[3]}] -to [get_pins {dc_sync1~output|i dc_sync1~output|o dc_sync2~output|i dc_sync2~output|o}]






"На картинке как раз изголения чтобы на выходе получить сигнал с частотой 200 мгц - сигнал асинхронного сброса это как раз вторая частота clk[2] от pll сдвинутая на 180 градусов относительно тактирующей clk[1]

Вот эта вот фраза вообще не очень понятна... "

На выход мне надо давать сигнал модулированный радиочастотой - 200 Мгц. То есть 5нс значени, 5 нс 0. Чтобы такой сигнал получить на выход поставил триггер с асинхронным сбросом. Что может не есть хорошо, но деватся некуда.

Сообщение отредактировал Аматер - Apr 20 2010, 13:54
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 15th June 2024 - 03:04
Рейтинг@Mail.ru


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