|
Простой вопрос про pwm на verilog, Поиск не работает на слово pwm |
|
|
|
Apr 20 2010, 09:32
|
Частый гость
Группа: Участник
Сообщений: 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
|
|
|
|
|
Apr 20 2010, 09:56
|
Частый гость
Группа: Участник
Сообщений: 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
|
|
|
|
|
Apr 20 2010, 10:01
|
Вечный ламер
Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453
|
Цитата(Аматер @ Apr 20 2010, 04:11) Ну синхронизировать это дополнительные ресурсы, а у меня и так циклон забился на 80%. на 10 триггеров для захвата pwm_in вам хватит, сигнал переноса со счетчика используйте как сигнал захвата %) Цитата На счет управления тоже понять не могу - когда поставил схемотехнический блок управление не менял, а заработало. Управление кстати вот так выглядит еще раз говорю, в коде pwm10 ошибки нет, ошибка где-то в другом месте.
--------------------
|
|
|
|
|
Apr 20 2010, 12:36
|
Местный
Группа: Свой
Сообщений: 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, что там в циклоне есть
--------------------
за Навального!
|
|
|
|
|
Apr 20 2010, 12:49
|
Вечный ламер
Группа: Модераторы
Сообщений: 7 248
Регистрация: 18-03-05
Из: Томск
Пользователь №: 3 453
|
Цитата(Аматер @ Apr 20 2010, 07:03) Прошу прощения, у меня заработало. К сожалению не понял почему. ИМХО ломается что-то в задании кода шима, где-то есть не учтенная асинхра, при пересборке времянка чуть изменилась и все заработало. Цитата А через 0 счетчик переходит, почему нет? Сброс может тоже надо делать, но наверное необязательно. Бинго, в вашем случае начальное состояние счетчика монописуально %)
--------------------
|
|
|
|
|
Apr 20 2010, 12:50
|
Профессионал
Группа: Свой
Сообщений: 1 088
Регистрация: 20-10-09
Из: Химки
Пользователь №: 53 082
|
Цитата Счетчик через ноль вообще не переходит, по коду он будет в иксах, разве это не ошибка? Это на моделировании X будет (и то если где-то есть обратная связь), а в железе все равно работать должно, на триггерах будут вполне конкретные значения. Тут похоже какие-то временные ошибки, если замена RTL описания на схемотехнический модуль дает неправильную работу (тем более если плисина забита на 80%). Интересно на временные отчеты посмотреть и вообще, что значит не работает (в железке не работает или на моделировани конкретный модуль)?
|
|
|
|
|
Apr 20 2010, 12:57
|
Местный
Группа: Свой
Сообщений: 214
Регистрация: 4-09-07
Из: Зеленоград
Пользователь №: 30 272
|
ушел от реальности в моделирование в железе, конечно, не иксы будут, а неизвестное значение при старте счетчика, что в такой схеме не важно
--------------------
за Навального!
|
|
|
|
|
Apr 20 2010, 13:17
|
Частый гость
Группа: Участник
Сообщений: 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
Эскизы прикрепленных изображений
|
|
|
|
|
Apr 20 2010, 13:42
|
Профессионал
Группа: Свой
Сообщений: 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] Вот эта вот фраза вообще не очень понятна...
|
|
|
|
|
Apr 20 2010, 13:53
|
Частый гость
Группа: Участник
Сообщений: 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
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|