Значит переработал я апнот333 - чтоб его в свю систему интегрировать - как оказалось не всё там так просто да и не работает он как должно быть - то есть при записи начальных данных - секундный интервал (50MHz тикалка на борде), быть в 0 - пол секунды потом в 1 - пол секунды -> имеем - сначала выход установлен в
0 (где то пол секунды как и должно быть) , потом в
1 и всё (проверяю светодиодом на лапе , потому как осцила под рукой нету) - далее светодиод горит и не тухнет - то есть отрабатывается 1 цикл - а дальше - глухо..
В дебуге проверял - значения по адресам записываются правильные..
Проверял несколько раз - логика враппера и PWM - вроде правильная .. Но вот почему не работает...
Значит такой глобальный смысл
 Р В Р’ВВВВВВВзображенРСвЂВВВВВВР В Р’Вµ СѓРСВВВВВВВеньшено
(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;
Буду очень признателен если кто подскажет где наплужил.
А то сам проверял - вроде всё верно ....