From c00b34fd868a78a9bde48f0e565c1cb057d4fde1 Mon Sep 17 00:00:00 2001 From: RamonSerafim <64420659+RamonSerafim@users.noreply.github.com> Date: Tue, 10 Sep 2024 15:56:36 -0300 Subject: [PATCH] =?UTF-8?q?Complemento=20para=20perif=C3=A9rico=20SPWM=20(?= =?UTF-8?q?#74)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Add files via upload * Delete peripherals/spwm/testbench_spwm.vdh.vhd * Add files via upload * Complementando periférico SPWM * Complementando periférico SPWM * Complementando periférico SPWM * Complementando periférico SPWM --- peripherals/spwm/README.md | 52 +- peripherals/spwm/sine_values.txt | 102 ++ peripherals/spwm/sint/de10_lite/de10_lite.qsf | 3 +- peripherals/spwm/sint/de10_lite/de10_lite.vhd | 33 +- peripherals/spwm/spwm.vhd | 193 +++- peripherals/spwm/spwm_example_unipolar.png | Bin 0 -> 70556 bytes peripherals/spwm/table_sine.mif | 1025 +++++++++++++++++ peripherals/spwm/table_sine_offset.mif | 1025 +++++++++++++++++ peripherals/spwm/tb_spwm.do | 5 +- peripherals/spwm/tb_spwm.vhd | 37 +- software/spwm/Makefile | 2 +- software/spwm/main_spwm.c | 18 +- 12 files changed, 2446 insertions(+), 49 deletions(-) create mode 100644 peripherals/spwm/spwm_example_unipolar.png create mode 100644 peripherals/spwm/table_sine.mif create mode 100644 peripherals/spwm/table_sine_offset.mif diff --git a/peripherals/spwm/README.md b/peripherals/spwm/README.md index b814a8be..352706e9 100644 --- a/peripherals/spwm/README.md +++ b/peripherals/spwm/README.md @@ -9,7 +9,15 @@ Implementação de um componente VHDL gerador de PWM senoidal a partir da compar - `reset`: sinal de reset do periférico, deve ser conectado ao barramento do `reset` do _core_. -- `sine_spwm`: Saída do pwm senoidal gerado pelo hardware +- `sel_modulation`: Seleciona qual modulação será apresentada na saída. + +- `sine_spwm1`: Saída 1 do pwm senoidal gerado pelo hardware. + +- `sine_spwm2`: Saída 2 do pwm senoidal gerado pelo hardware. + +- `sine_spwm3`: Saída 3 do pwm senoidal gerado pelo hardware. + +- `sine_spwm4`: Saída 4 do pwm senoidal gerado pelo hardware. ## Funcionamento @@ -19,14 +27,48 @@ Os valores da portadora são atualizados a partir de uma tabela de valores da se O valor da moduladora segue a lógica de uma onda triangular de acordo com o valor de contagem máxima e uma variável de fator de multiplicação para que possa ser implementada modulação de amplitude. -É feita a comparaçao entre portadora e moduladora e o sinal pwm é gerado na saída sine_spwm. Observe abaixo a lógica implementada e o exemplo simulado via PSIM. +É feita a comparaçao entre portadora e moduladora e o sinal pwm é gerado nas saídas sine_spwm. É possível selecionar qual modulação será escolhida, Bipolar ou Unipolar. + +Observe abaixo a lógica implementada e o exemplo simulado via PSIM. + +## Modulação Bipolar -- sine_spwm = 1 quando Vseno > Vtriangular -- sine_spwm = 0 quando Vseno < Vtriangular +- sine_spwm1 = 1 quando Vseno > Vtriangular +- sine_spwm1 = 0 quando Vseno < Vtriangular

+Em uma aplicação para inversores monofásicos utilizamos 4 chaves, precisamos apenas de 1 sinal comparado com a tabela e seu complementar. A disposição das chaves ficam exemplificados abaixo: + + +- Chave 1 = Chave 3 = sine_spwm1 = sine_spwm3 +- Chave 2 = Chave 4 = sine_spwm2 = sine_spwm4 + +## Modulação Unipolar + +O modelo de chaveamento segue da mesma forma que a modulação bipolar, porém agora com um sinal defasado. + +- sine_spwm1 = 1 quando Vseno > Vtriangular +- sine_spwm1 = 0 quando Vseno < Vtriangular +- sine_spwm2 = 1 quando Vseno_offset > Vtriangular +- sine_spwm2 = 0 quando Vseno_offset < Vtriangular + +

+ + + + +Em uma aplicação para inversores monofásicos utilizamos 4 chaves, precisamos de 2 sinais comparado com a tabela e seus complementares. A primeira tabela disponibilizando 1 sinal e seu complementar e a outra tabela sendo defasada 180º da primeira, tendo como resposta 1 sinal e seu complementar A disposição das chaves ficam exemplificados abaixo: + + + + +- Chave 1 = sine_spwm1 = a partir de table_sine +- Chave 2 = sine_spwm2 = a partir de table_sine_offset +- Chave 3 = sine_spwm3 = complementar de sine_spwm1 +- Chave 4 = sine_spwm4 = complementar de sine_spwm2 + ## Simulação Os valores a seguir foram gerados no Questa utilizando os arquivos de testbench e também o exemplo de software main_spwm.c encontrado nesse repositório, no caminho software/spwm/. @@ -44,4 +86,4 @@ Foi aplicado um zoom para mostrar os valores das ondas de referência e portador ## Sugestões - Testar lógica de modulação de amplitude - Adequar o componente para N saídas e com a lógica de chaveamento para - aplicação. Exemplos: conversor B6, inversor monofásico -- Gerar a tabela de valores da senoide em tempo de compilação \ No newline at end of file +- Gerar a tabela de valores da senoide em tempo de compilação diff --git a/peripherals/spwm/sine_values.txt b/peripherals/spwm/sine_values.txt index c818ef7d..c834048c 100644 --- a/peripherals/spwm/sine_values.txt +++ b/peripherals/spwm/sine_values.txt @@ -98,3 +98,105 @@ -6140, -5938, -5735, -5532, -5329, -5126, -4922, -4719, -4515, -4311, -4107, -3902, -3698, -3493, -3289, -3084, -2879, -2673, -2468, -2263, -2057, -1852, -1646, -1441, -1235, -1029, -823, -618, -412, -206] + + Tabela defasada 90 graus + [ 0, -206, -412, -618, -823, -1029, -1235, -1441, -1646, -1852, + -2057, -2263, -2468, -2673, -2879, -3084, -3289, -3493, -3698, -3902, + -4107, -4311, -4515, -4719, -4922, -5126, -5329, -5532, -5735, -5938, + -6140, -6342, -6544, -6746, -6947, -7148, -7349, -7549, -7749, -7949, + -8149, -8348, -8547, -8746, -8944, -9142, -9339, -9536, -9733, -9930, + -10126,-10321,-10516,-10711,-10905,-11099,-11293,-11486,-11679,-11871, + -12062,-12254,-12444,-12634,-12824,-13013,-13202,-13390,-13578,-13765, + -13952,-14138,-14323,-14508,-14692,-14876,-15059,-15242,-15424,-15605, + -15786,-15966,-16145,-16324,-16502,-16680,-16857,-17033,-17208,-17383, + -17557,-17731,-17904,-18076,-18247,-18418,-18588,-18757,-18925,-19093, + -19260,-19426,-19592,-19756,-19920,-20083,-20245,-20407,-20568,-20727, + -20886,-21045,-21202,-21359,-21514,-21669,-21823,-21976,-22129,-22280, + -22431,-22580,-22729,-22877,-23024,-23170,-23315,-23459,-23602,-23745, + -23886,-24027,-24166,-24305,-24442,-24579,-24715,-24849,-24983,-25116, + -25247,-25378,-25508,-25637,-25764,-25891,-26017,-26141,-26265,-26388, + -26509,-26630,-26749,-26867,-26985,-27101,-27216,-27330,-27443,-27555, + -27666,-27776,-27885,-27992,-28099,-28204,-28308,-28411,-28513,-28614, + -28714,-28813,-28910,-29006,-29102,-29196,-29289,-29380,-29471,-29560, + -29648,-29736,-29821,-29906,-29990,-30072,-30153,-30233,-30312,-30390, + -30466,-30541,-30615,-30688,-30759,-30830,-30899,-30967,-31034,-31099, + -31163,-31226,-31288,-31349,-31408,-31466,-31523,-31578,-31633,-31686, + -31738,-31788,-31837,-31886,-31932,-31978,-32022,-32065,-32107,-32147, + -32187,-32225,-32261,-32297,-32331,-32364,-32395,-32425,-32454,-32482, + -32509,-32534,-32558,-32580,-32602,-32622,-32640,-32658,-32674,-32689, + -32702,-32715,-32726,-32735,-32744,-32751,-32757,-32761,-32764,-32766, + -32767,-32766,-32764,-32761,-32757,-32751,-32744,-32735,-32726,-32715, + -32702,-32689,-32674,-32658,-32640,-32622,-32602,-32580,-32558,-32534, + -32509,-32482,-32454,-32425,-32395,-32364,-32331,-32297,-32261,-32225, + -32187,-32147,-32107,-32065,-32022,-31978,-31932,-31886,-31837,-31788, + -31738,-31686,-31633,-31578,-31523,-31466,-31408,-31349,-31288,-31226, + -31163,-31099,-31034,-30967,-30899,-30830,-30759,-30688,-30615,-30541, + -30466,-30390,-30312,-30233,-30153,-30072,-29990,-29906,-29821,-29736, + -29648,-29560,-29471,-29380,-29289,-29196,-29102,-29006,-28910,-28813, + -28714,-28614,-28513,-28411,-28308,-28204,-28099,-27992,-27885,-27776, + -27666,-27555,-27443,-27330,-27216,-27101,-26985,-26867,-26749,-26630, + -26509,-26388,-26265,-26141,-26017,-25891,-25764,-25637,-25508,-25378, + -25247,-25116,-24983,-24849,-24715,-24579,-24442,-24305,-24166,-24027, + -23886,-23745,-23602,-23459,-23315,-23170,-23024,-22877,-22729,-22580, + -22431,-22280,-22129,-21976,-21823,-21669,-21514,-21359,-21202,-21045, + -20886,-20727,-20568,-20407,-20245,-20083,-19920,-19756,-19592,-19426, + -19260,-19093,-18925,-18757,-18588,-18418,-18247,-18076,-17904,-17731, + -17557,-17383,-17208,-17033,-16857,-16680,-16502,-16324,-16145,-15966, + -15786,-15605,-15424,-15242,-15059,-14876,-14692,-14508,-14323,-14138, + -13952,-13765,-13578,-13390,-13202,-13013,-12824,-12634,-12444,-12254, + -12062,-11871,-11679,-11486,-11293,-11099,-10905,-10711,-10516,-10321, + -10126, -9930, -9733, -9536, -9339, -9142, -8944, -8746, -8547, -8348, + -8149, -7949, -7749, -7549, -7349, -7148, -6947, -6746, -6544, -6342, + -6140, -5938, -5735, -5532, -5329, -5126, -4922, -4719, -4515, -4311, + -4107, -3902, -3698, -3493, -3289, -3084, -2879, -2673, -2468, -2263, + -2057, -1852, -1646, -1441, -1235, -1029, -823, -618, -412, -206, + 0, 206, 412, 618, 823, 1029, 1235, 1441, 1646, 1852, + 2057, 2263, 2468, 2673, 2879, 3084, 3289, 3493, 3698, 3902, + 4107, 4311, 4515, 4719, 4922, 5126, 5329, 5532, 5735, 5938, + 6140, 6342, 6544, 6746, 6947, 7148, 7349, 7549, 7749, 7949, + 8149, 8348, 8547, 8746, 8944, 9142, 9339, 9536, 9733, 9930, + 10126, 10321, 10516, 10711, 10905, 11099, 11293, 11486, 11679, 11871, + 12062, 12254, 12444, 12634, 12824, 13013, 13202, 13390, 13578, 13765, + 13952, 14138, 14323, 14508, 14692, 14876, 15059, 15242, 15424, 15605, + 15786, 15966, 16145, 16324, 16502, 16680, 16857, 17033, 17208, 17383, + 17557, 17731, 17904, 18076, 18247, 18418, 18588, 18757, 18925, 19093, + 19260, 19426, 19592, 19756, 19920, 20083, 20245, 20407, 20568, 20727, + 20886, 21045, 21202, 21359, 21514, 21669, 21823, 21976, 22129, 22280, + 22431, 22580, 22729, 22877, 23024, 23170, 23315, 23459, 23602, 23745, + 23886, 24027, 24166, 24305, 24442, 24579, 24715, 24849, 24983, 25116, + 25247, 25378, 25508, 25637, 25764, 25891, 26017, 26141, 26265, 26388, + 26509, 26630, 26749, 26867, 26985, 27101, 27216, 27330, 27443, 27555, + 27666, 27776, 27885, 27992, 28099, 28204, 28308, 28411, 28513, 28614, + 28714, 28813, 28910, 29006, 29102, 29196, 29289, 29380, 29471, 29560, + 29648, 29736, 29821, 29906, 29990, 30072, 30153, 30233, 30312, 30390, + 30466, 30541, 30615, 30688, 30759, 30830, 30899, 30967, 31034, 31099, + 31163, 31226, 31288, 31349, 31408, 31466, 31523, 31578, 31633, 31686, + 31738, 31788, 31837, 31886, 31932, 31978, 32022, 32065, 32107, 32147, + 32187, 32225, 32261, 32297, 32331, 32364, 32395, 32425, 32454, 32482, + 32509, 32534, 32558, 32580, 32602, 32622, 32640, 32658, 32674, 32689, + 32702, 32715, 32726, 32735, 32744, 32751, 32757, 32761, 32764, 32766, + 32767, 32766, 32764, 32761, 32757, 32751, 32744, 32735, 32726, 32715, + 32702, 32689, 32674, 32658, 32640, 32622, 32602, 32580, 32558, 32534, + 32509, 32482, 32454, 32425, 32395, 32364, 32331, 32297, 32261, 32225, + 32187, 32147, 32107, 32065, 32022, 31978, 31932, 31886, 31837, 31788, + 31738, 31686, 31633, 31578, 31523, 31466, 31408, 31349, 31288, 31226, + 31163, 31099, 31034, 30967, 30899, 30830, 30759, 30688, 30615, 30541, + 30466, 30390, 30312, 30233, 30153, 30072, 29990, 29906, 29821, 29736, + 29648, 29560, 29471, 29380, 29289, 29196, 29102, 29006, 28910, 28813, + 28714, 28614, 28513, 28411, 28308, 28204, 28099, 27992, 27885, 27776, + 27666, 27555, 27443, 27330, 27216, 27101, 26985, 26867, 26749, 26630, + 26509, 26388, 26265, 26141, 26017, 25891, 25764, 25637, 25508, 25378, + 25247, 25116, 24983, 24849, 24715, 24579, 24442, 24305, 24166, 24027, + 23886, 23745, 23602, 23459, 23315, 23170, 23024, 22877, 22729, 22580, + 22431, 22280, 22129, 21976, 21823, 21669, 21514, 21359, 21202, 21045, + 20886, 20727, 20568, 20407, 20245, 20083, 19920, 19756, 19592, 19426, + 19260, 19093, 18925, 18757, 18588, 18418, 18247, 18076, 17904, 17731, + 17557, 17383, 17208, 17033, 16857, 16680, 16502, 16324, 16145, 15966, + 15786, 15605, 15424, 15242, 15059, 14876, 14692, 14508, 14323, 14138, + 13952, 13765, 13578, 13390, 13202, 13013, 12824, 12634, 12444, 12254, + 12062, 11871, 11679, 11486, 11293, 11099, 10905, 10711, 10516, 10321, + 10126, 9930, 9733, 9536, 9339, 9142, 8944, 8746, 8547, 8348, + 8149, 7949, 7749, 7549, 7349, 7148, 6947, 6746, 6544, 6342, + 6140, 5938, 5735, 5532, 5329, 5126, 4922, 4719, 4515, 4311, + 4107, 3902, 3698, 3493, 3289, 3084, 2879, 2673, 2468, 2263, + 2057, 1852, 1646, 1441, 1235, 1029, 823, 618, 412, 206] diff --git a/peripherals/spwm/sint/de10_lite/de10_lite.qsf b/peripherals/spwm/sint/de10_lite/de10_lite.qsf index 423d4d5d..47805621 100644 --- a/peripherals/spwm/sint/de10_lite/de10_lite.qsf +++ b/peripherals/spwm/sint/de10_lite/de10_lite.qsf @@ -42,7 +42,7 @@ set_global_assignment -name DEVICE 10M50DAF484C7G set_global_assignment -name TOP_LEVEL_ENTITY de10_lite set_global_assignment -name ORIGINAL_QUARTUS_VERSION 15.0.0 set_global_assignment -name PROJECT_CREATION_TIME_DATE "18:49:34 JUNE 20, 2019" -set_global_assignment -name LAST_QUARTUS_VERSION "21.1.1 Lite Edition" +set_global_assignment -name LAST_QUARTUS_VERSION "21.1.1 Standard Edition" set_global_assignment -name PROJECT_OUTPUT_DIRECTORY output_files set_global_assignment -name MIN_CORE_JUNCTION_TEMP 0 set_global_assignment -name MAX_CORE_JUNCTION_TEMP 85 @@ -241,4 +241,5 @@ set_global_assignment -name VHDL_FILE de10_lite.vhd set_global_assignment -name QIP_FILE pll.qip set_global_assignment -name SOURCE_FILE db/de10_lite.cmp.rdb set_global_assignment -name VHDL_FILE ../../../gpio/led_displays.vhd +set_global_assignment -name MIF_FILE output_files/tabela_seno.mif set_instance_assignment -name PARTITION_HIERARCHY root_partition -to | -section_id Top \ No newline at end of file diff --git a/peripherals/spwm/sint/de10_lite/de10_lite.vhd b/peripherals/spwm/sint/de10_lite/de10_lite.vhd index 32da6db5..deeae1bc 100644 --- a/peripherals/spwm/sint/de10_lite/de10_lite.vhd +++ b/peripherals/spwm/sint/de10_lite/de10_lite.vhd @@ -123,8 +123,11 @@ architecture rtl of de10_lite is signal ddata_r_dig_fil : std_logic_vector(31 downto 0); signal ddata_r_stepmot : std_logic_vector(31 downto 0); signal ddata_r_lcd : std_logic_vector(31 downto 0); - signal ddata_r_nn_accelerator : std_logic_vector(31 downto 0); - signal ddata_r_fir_fil : std_logic_vector(31 downto 0); + signal ddata_r_nn_accelerator : std_logic_vector(31 downto 0); + signal ddata_r_fir_fil : std_logic_vector(31 downto 0); + signal ddata_r_crc : std_logic_vector(31 downto 0); + signal ddata_r_key : std_logic_vector(31 downto 0); + signal ddata_r_accelerometer : std_logic_vector(31 downto 0); -- Interrupt Signals signal interrupts : std_logic_vector(31 downto 0); @@ -133,8 +136,12 @@ architecture rtl of de10_lite is -- I/O signals signal input_in : std_logic_vector(31 downto 0); - signal switching_sine : std_logic; + + --Timer + signal ifcap : std_logic ; -- capture flag + + signal sel_modulation : std_logic; begin @@ -174,7 +181,11 @@ begin port map( clock => clk_50MHz, reset => rst, + sel_modulation => SW(5), sine_pwm1 => ARDUINO_IO(0), + sine_pwm2 => ARDUINO_IO(2), + sine_pwm3 => ARDUINO_IO(4), + sine_pwm4 => ARDUINO_IO(6), daddress => daddress, ddata_w => ddata_w, ddata_r => ddata_r_spwm, @@ -217,6 +228,7 @@ begin -- 0x20000 -> Data memory -- 0x40000 -> Input/Output generic address space -- ( ... ) -> ( ... ) + datamux: entity work.databusmux port map( dcsel => dcsel, @@ -263,10 +275,14 @@ begin ddata_r_periph => ddata_r_periph, ddata_r_spwm => ddata_r_spwm, ddata_r_dif_fil => ddata_r_dig_fil, - ddata_r_stepmot => ddata_r_stepmot, - ddata_r_lcd => ddata_r_lcd, - ddata_r_fir_fil => ddata_r_fir_fil, - ddata_r_nn_accelerator => ddata_r_nn_accelerator + ddata_r_stepmot => ddata_r_stepmot, + ddata_r_lcd => ddata_r_lcd, + ddata_r_fir_fil => ddata_r_fir_fil, + ddata_r_nn_accelerator => ddata_r_nn_accelerator, + ddata_r_crc => ddata_r_crc, + ddata_r_key => ddata_r_key, + ddata_r_accelerometer => ddata_r_accelerometer + ); generic_gpio: entity work.gpio @@ -301,7 +317,8 @@ begin d_rd => d_rd, dcsel => dcsel, dmask => dmask, - timer_interrupt => timer_interrupt + timer_interrupt => timer_interrupt, + ifcap => ifcap ); generic_displays : entity work.led_displays diff --git a/peripherals/spwm/spwm.vhd b/peripherals/spwm/spwm.vhd index 5f105edd..cfd8b4a1 100644 --- a/peripherals/spwm/spwm.vhd +++ b/peripherals/spwm/spwm.vhd @@ -13,8 +13,12 @@ entity spwm is -- hardware input/output clock : in std_logic; reset : in std_logic; + sel_modulation : in std_logic; sine_pwm1 : out std_logic; - + sine_pwm2 : out std_logic; + sine_pwm3 : out std_logic; + sine_pwm4 : out std_logic; + -- Core data bus signals daddress : in unsigned(DADDRESS_BUS_SIZE-1 downto 0); ddata_w : in std_logic_vector(31 downto 0); @@ -164,9 +168,121 @@ architecture RTL of spwm is -6140, -5938, -5735, -5532, -5329, -5126, -4922, -4719, -4515, -4311, -4107, -3902, -3698, -3493, -3289, -3084, -2879, -2673, -2468, -2263, -2057, -1852, -1646, -1441, -1235, -1029, -823, -618, -412, -206); + + constant sine_table_offset : sine_table_t := ( 0, -206, -412, -618, -823, -1029, -1235, -1441, -1646, -1852, + -2057, -2263, -2468, -2673, -2879, -3084, -3289, -3493, -3698, -3902, + -4107, -4311, -4515, -4719, -4922, -5126, -5329, -5532, -5735, -5938, + -6140, -6342, -6544, -6746, -6947, -7148, -7349, -7549, -7749, -7949, + -8149, -8348, -8547, -8746, -8944, -9142, -9339, -9536, -9733, -9930, + -10126,-10321,-10516,-10711,-10905,-11099,-11293,-11486,-11679,-11871, + -12062,-12254,-12444,-12634,-12824,-13013,-13202,-13390,-13578,-13765, + -13952,-14138,-14323,-14508,-14692,-14876,-15059,-15242,-15424,-15605, + -15786,-15966,-16145,-16324,-16502,-16680,-16857,-17033,-17208,-17383, + -17557,-17731,-17904,-18076,-18247,-18418,-18588,-18757,-18925,-19093, + -19260,-19426,-19592,-19756,-19920,-20083,-20245,-20407,-20568,-20727, + -20886,-21045,-21202,-21359,-21514,-21669,-21823,-21976,-22129,-22280, + -22431,-22580,-22729,-22877,-23024,-23170,-23315,-23459,-23602,-23745, + -23886,-24027,-24166,-24305,-24442,-24579,-24715,-24849,-24983,-25116, + -25247,-25378,-25508,-25637,-25764,-25891,-26017,-26141,-26265,-26388, + -26509,-26630,-26749,-26867,-26985,-27101,-27216,-27330,-27443,-27555, + -27666,-27776,-27885,-27992,-28099,-28204,-28308,-28411,-28513,-28614, + -28714,-28813,-28910,-29006,-29102,-29196,-29289,-29380,-29471,-29560, + -29648,-29736,-29821,-29906,-29990,-30072,-30153,-30233,-30312,-30390, + -30466,-30541,-30615,-30688,-30759,-30830,-30899,-30967,-31034,-31099, + -31163,-31226,-31288,-31349,-31408,-31466,-31523,-31578,-31633,-31686, + -31738,-31788,-31837,-31886,-31932,-31978,-32022,-32065,-32107,-32147, + -32187,-32225,-32261,-32297,-32331,-32364,-32395,-32425,-32454,-32482, + -32509,-32534,-32558,-32580,-32602,-32622,-32640,-32658,-32674,-32689, + -32702,-32715,-32726,-32735,-32744,-32751,-32757,-32761,-32764,-32766, + -32767,-32766,-32764,-32761,-32757,-32751,-32744,-32735,-32726,-32715, + -32702,-32689,-32674,-32658,-32640,-32622,-32602,-32580,-32558,-32534, + -32509,-32482,-32454,-32425,-32395,-32364,-32331,-32297,-32261,-32225, + -32187,-32147,-32107,-32065,-32022,-31978,-31932,-31886,-31837,-31788, + -31738,-31686,-31633,-31578,-31523,-31466,-31408,-31349,-31288,-31226, + -31163,-31099,-31034,-30967,-30899,-30830,-30759,-30688,-30615,-30541, + -30466,-30390,-30312,-30233,-30153,-30072,-29990,-29906,-29821,-29736, + -29648,-29560,-29471,-29380,-29289,-29196,-29102,-29006,-28910,-28813, + -28714,-28614,-28513,-28411,-28308,-28204,-28099,-27992,-27885,-27776, + -27666,-27555,-27443,-27330,-27216,-27101,-26985,-26867,-26749,-26630, + -26509,-26388,-26265,-26141,-26017,-25891,-25764,-25637,-25508,-25378, + -25247,-25116,-24983,-24849,-24715,-24579,-24442,-24305,-24166,-24027, + -23886,-23745,-23602,-23459,-23315,-23170,-23024,-22877,-22729,-22580, + -22431,-22280,-22129,-21976,-21823,-21669,-21514,-21359,-21202,-21045, + -20886,-20727,-20568,-20407,-20245,-20083,-19920,-19756,-19592,-19426, + -19260,-19093,-18925,-18757,-18588,-18418,-18247,-18076,-17904,-17731, + -17557,-17383,-17208,-17033,-16857,-16680,-16502,-16324,-16145,-15966, + -15786,-15605,-15424,-15242,-15059,-14876,-14692,-14508,-14323,-14138, + -13952,-13765,-13578,-13390,-13202,-13013,-12824,-12634,-12444,-12254, + -12062,-11871,-11679,-11486,-11293,-11099,-10905,-10711,-10516,-10321, + -10126, -9930, -9733, -9536, -9339, -9142, -8944, -8746, -8547, -8348, + -8149, -7949, -7749, -7549, -7349, -7148, -6947, -6746, -6544, -6342, + -6140, -5938, -5735, -5532, -5329, -5126, -4922, -4719, -4515, -4311, + -4107, -3902, -3698, -3493, -3289, -3084, -2879, -2673, -2468, -2263, + -2057, -1852, -1646, -1441, -1235, -1029, -823, -618, -412, -206, + 0, 206, 412, 618, 823, 1029, 1235, 1441, 1646, 1852, + 2057, 2263, 2468, 2673, 2879, 3084, 3289, 3493, 3698, 3902, + 4107, 4311, 4515, 4719, 4922, 5126, 5329, 5532, 5735, 5938, + 6140, 6342, 6544, 6746, 6947, 7148, 7349, 7549, 7749, 7949, + 8149, 8348, 8547, 8746, 8944, 9142, 9339, 9536, 9733, 9930, + 10126, 10321, 10516, 10711, 10905, 11099, 11293, 11486, 11679, 11871, + 12062, 12254, 12444, 12634, 12824, 13013, 13202, 13390, 13578, 13765, + 13952, 14138, 14323, 14508, 14692, 14876, 15059, 15242, 15424, 15605, + 15786, 15966, 16145, 16324, 16502, 16680, 16857, 17033, 17208, 17383, + 17557, 17731, 17904, 18076, 18247, 18418, 18588, 18757, 18925, 19093, + 19260, 19426, 19592, 19756, 19920, 20083, 20245, 20407, 20568, 20727, + 20886, 21045, 21202, 21359, 21514, 21669, 21823, 21976, 22129, 22280, + 22431, 22580, 22729, 22877, 23024, 23170, 23315, 23459, 23602, 23745, + 23886, 24027, 24166, 24305, 24442, 24579, 24715, 24849, 24983, 25116, + 25247, 25378, 25508, 25637, 25764, 25891, 26017, 26141, 26265, 26388, + 26509, 26630, 26749, 26867, 26985, 27101, 27216, 27330, 27443, 27555, + 27666, 27776, 27885, 27992, 28099, 28204, 28308, 28411, 28513, 28614, + 28714, 28813, 28910, 29006, 29102, 29196, 29289, 29380, 29471, 29560, + 29648, 29736, 29821, 29906, 29990, 30072, 30153, 30233, 30312, 30390, + 30466, 30541, 30615, 30688, 30759, 30830, 30899, 30967, 31034, 31099, + 31163, 31226, 31288, 31349, 31408, 31466, 31523, 31578, 31633, 31686, + 31738, 31788, 31837, 31886, 31932, 31978, 32022, 32065, 32107, 32147, + 32187, 32225, 32261, 32297, 32331, 32364, 32395, 32425, 32454, 32482, + 32509, 32534, 32558, 32580, 32602, 32622, 32640, 32658, 32674, 32689, + 32702, 32715, 32726, 32735, 32744, 32751, 32757, 32761, 32764, 32766, + 32767, 32766, 32764, 32761, 32757, 32751, 32744, 32735, 32726, 32715, + 32702, 32689, 32674, 32658, 32640, 32622, 32602, 32580, 32558, 32534, + 32509, 32482, 32454, 32425, 32395, 32364, 32331, 32297, 32261, 32225, + 32187, 32147, 32107, 32065, 32022, 31978, 31932, 31886, 31837, 31788, + 31738, 31686, 31633, 31578, 31523, 31466, 31408, 31349, 31288, 31226, + 31163, 31099, 31034, 30967, 30899, 30830, 30759, 30688, 30615, 30541, + 30466, 30390, 30312, 30233, 30153, 30072, 29990, 29906, 29821, 29736, + 29648, 29560, 29471, 29380, 29289, 29196, 29102, 29006, 28910, 28813, + 28714, 28614, 28513, 28411, 28308, 28204, 28099, 27992, 27885, 27776, + 27666, 27555, 27443, 27330, 27216, 27101, 26985, 26867, 26749, 26630, + 26509, 26388, 26265, 26141, 26017, 25891, 25764, 25637, 25508, 25378, + 25247, 25116, 24983, 24849, 24715, 24579, 24442, 24305, 24166, 24027, + 23886, 23745, 23602, 23459, 23315, 23170, 23024, 22877, 22729, 22580, + 22431, 22280, 22129, 21976, 21823, 21669, 21514, 21359, 21202, 21045, + 20886, 20727, 20568, 20407, 20245, 20083, 19920, 19756, 19592, 19426, + 19260, 19093, 18925, 18757, 18588, 18418, 18247, 18076, 17904, 17731, + 17557, 17383, 17208, 17033, 16857, 16680, 16502, 16324, 16145, 15966, + 15786, 15605, 15424, 15242, 15059, 14876, 14692, 14508, 14323, 14138, + 13952, 13765, 13578, 13390, 13202, 13013, 12824, 12634, 12444, 12254, + 12062, 11871, 11679, 11486, 11293, 11099, 10905, 10711, 10516, 10321, + 10126, 9930, 9733, 9536, 9339, 9142, 8944, 8746, 8547, 8348, + 8149, 7949, 7749, 7549, 7349, 7148, 6947, 6746, 6544, 6342, + 6140, 5938, 5735, 5532, 5329, 5126, 4922, 4719, 4515, 4311, + 4107, 3902, 3698, 3493, 3289, 3084, 2879, 2673, 2468, 2263, + 2057, 1852, 1646, 1441, 1235, 1029, 823, 618, 412, 206); + --signal sine_table : sine_table_t; + --signal sine_table_offset : sine_table_t; signal sine_value : signed(15 downto 0); + signal sine_offset_value : signed(15 downto 0); signal sine_index : natural := sine_resolution-1; + signal sine_offset_index : natural := sine_resolution-1; + + -- These lines works with Quartus. MIF is a Memory Initialization file + --attribute init_sine_file : string; + --attribute init_sine_offset_file : string; + -- Quartus uses Project folder to look for mif file. + --attribute init_sine_file of sine_table : signal is "../table_sine.mif"; + --attribute init_sine_offset_file of sine_table_offset : signal is "../table_sine_offset.mif"; begin @@ -273,6 +389,24 @@ begin sine_value <= count_temp; end process; + -- Processo que atualiza o valor de seno defasado + sine_offset_process: process (clk_sine, reset) + variable count_temp : signed(15 downto 0); + begin + if reset = '1' then + count_temp := (others => '0'); + sine_offset_index <= 0; + elsif (rising_edge(clk_sine)) then + if sine_offset_index = sine_resolution-1 then + sine_offset_index <= 0; + else + count_temp := to_signed(sine_table_offset(sine_offset_index),16); + sine_offset_index <= sine_offset_index + 1; + end if; + end if; + sine_offset_value <= count_temp; + end process; + -- Processo que faz a contagem da moduladora modulator_process: process (clk_mod, reset) variable count_temp : signed(15 downto 0); @@ -300,18 +434,49 @@ begin mod_count <= count_temp; end process; --- Processo que comparada seno e moduladora - spwm_process: process (clk_mod, reset) - begin - if reset = '1' then - sine_pwm1 <= '0'; - elsif (rising_edge(clk_mod)) then - if(sine_value > (scaling_factor*mod_count)) then - sine_pwm1 <= '1'; - else - sine_pwm1 <= '0'; - end if; - end if; - end process; + -- Processo que compara seno e moduladora + spwm_process: process (clk_mod, reset) + begin + if reset = '1' then + sine_pwm1 <= '0'; + sine_pwm2 <= '0'; + sine_pwm3 <= '0'; + sine_pwm4 <= '0'; + elsif rising_edge(clk_mod) then + if sel_modulation = '0' then -- Modulação Bipolar + if sine_value > (scaling_factor * mod_count) then + sine_pwm1 <= '1'; -- Sinal positivo + sine_pwm2 <= '0'; + sine_pwm3 <= '1'; -- Complementar + sine_pwm4 <= '0'; + else + sine_pwm1 <= '0'; + sine_pwm2 <= '1'; -- Complementar + sine_pwm3 <= '0'; + sine_pwm4 <= '1'; + end if; + elsif sel_modulation = '1' then -- Modulação Unipolar + -- Tabela sine_value para os primeiros sinais (sem defasagem) + if sine_value > (scaling_factor * mod_count) then + sine_pwm1 <= '1'; -- Sinal positivo + sine_pwm2 <= '0'; + else + sine_pwm1 <= '0'; + sine_pwm2 <= '1'; -- Complementar + end if; + + -- Tabela sine_offset_value para os sinais defasados (180 graus) + if sine_offset_value > (scaling_factor * mod_count) then + sine_pwm3 <= '1'; -- Sinal positivo + sine_pwm4 <= '0'; + else + sine_pwm3 <= '0'; + sine_pwm4 <= '1'; -- Complementar + end if; + end if; + end if; + end process; + + end architecture RTL; diff --git a/peripherals/spwm/spwm_example_unipolar.png b/peripherals/spwm/spwm_example_unipolar.png new file mode 100644 index 0000000000000000000000000000000000000000..59085a16679792733fbc9561e38c30c7de08fb52 GIT binary patch literal 70556 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 SyCrqxBNasrh1@GQ?*1Qf$$!KE literal 0 HcmV?d00001 diff --git a/peripherals/spwm/table_sine.mif b/peripherals/spwm/table_sine.mif new file mode 100644 index 00000000..af2b3791 --- /dev/null +++ b/peripherals/spwm/table_sine.mif @@ -0,0 +1,1025 @@ +-- Copyright (C) 2022 Intel Corporation. All rights reserved. +-- Your use of Intel Corporation's design tools, logic functions +-- and other software and tools, and any partner logic +-- functions, and any output files from any of the foregoing +-- (including device programming or simulation files), and any +-- associated documentation or information are expressly subject +-- to the terms and conditions of the Intel Program License +-- Subscription Agreement, the Intel Quartus Prime License Agreement, +-- the Intel FPGA IP License Agreement, or other applicable license +-- agreement, including, without limitation, that your use is for +-- the sole purpose of programming logic devices manufactured by +-- Intel and sold by Intel or its authorized distributors. Please +-- refer to the applicable agreement for further details, at +-- https://fpgasoftware.intel.com/eula. + +-- Quartus Prime generated Memory Initialization File (.mif) + +WIDTH=16; +DEPTH=1000; + +ADDRESS_RADIX=UNS; +DATA_RADIX=UNS; + +CONTENT BEGIN + 0 : 0000; + 1 : 00CE; + 2 : 019C; + 3 : 026A; + 4 : 0337; + 5 : 0405; + 6 : 04D3; + 7 : 05A1; + 8 : 066E; + 9 : 073C; + 10 : 0809; + 11 : 08D7; + 12 : 09A4; + 13 : 0A71; + 14 : 0B3F; + 15 : 0C0C; + 16 : 0CD9; + 17 : 0DA5; + 18 : 0E72; + 19 : 0F3E; + 20 : 100B; + 21 : 10D7; + 22 : 11A3; + 23 : 126F; + 24 : 133A; + 25 : 1406; + 26 : 14D1; + 27 : 159C; + 28 : 1667; + 29 : 1732; + 30 : 17FC; + 31 : 18C6; + 32 : 1990; + 33 : 1A5A; + 34 : 1B23; + 35 : 1BEC; + 36 : 1CB5; + 37 : 1D7D; + 38 : 1E45; + 39 : 1F0D; + 40 : 1FD5; + 41 : 209C; + 42 : 2163; + 43 : 222A; + 44 : 22F0; + 45 : 23B6; + 46 : 247B; + 47 : 2540; + 48 : 2605; + 49 : 26CA; + 50 : 278E; + 51 : 2851; + 52 : 2914; + 53 : 29D7; + 54 : 2A99; + 55 : 2B5B; + 56 : 2C1D; + 57 : 2CDE; + 58 : 2D9F; + 59 : 2E5F; + 60 : 2F1E; + 61 : 2FDE; + 62 : 309C; + 63 : 315A; + 64 : 3218; + 65 : 32D5; + 66 : 3392; + 67 : 344E; + 68 : 350A; + 69 : 35C5; + 70 : 3680; + 71 : 373A; + 72 : 37F3; + 73 : 38AC; + 74 : 3964; + 75 : 3A1C; + 76 : 3AD3; + 77 : 3B8A; + 78 : 3C40; + 79 : 3CF5; + 80 : 3DAA; + 81 : 3E5E; + 82 : 3F11; + 83 : 3FC4; + 84 : 4076; + 85 : 4128; + 86 : 41D9; + 87 : 4289; + 88 : 4338; + 89 : 43E7; + 90 : 4495; + 91 : 4543; + 92 : 45F0; + 93 : 469C; + 94 : 4747; + 95 : 47F2; + 96 : 489C; + 97 : 4945; + 98 : 49ED; + 99 : 4A95; + 100 : 4B3C; + 101 : 4BE2; + 102 : 4C88; + 103 : 4D2C; + 104 : 4DD0; + 105 : 4E73; + 106 : 4F15; + 107 : 4FB7; + 108 : 5058; + 109 : 50F7; + 110 : 5196; + 111 : 5235; + 112 : 52D2; + 113 : 536F; + 114 : 540A; + 115 : 54A5; + 116 : 553F; + 117 : 55D8; + 118 : 5671; + 119 : 5708; + 120 : 579F; + 121 : 5834; + 122 : 58C9; + 123 : 595D; + 124 : 59F0; + 125 : 5A82; + 126 : 5B13; + 127 : 5BA3; + 128 : 5C32; + 129 : 5CC1; + 130 : 5D4E; + 131 : 5DDB; + 132 : 5E66; + 133 : 5EF1; + 134 : 5F7A; + 135 : 6003; + 136 : 608B; + 137 : 6111; + 138 : 6197; + 139 : 621C; + 140 : 629F; + 141 : 6322; + 142 : 63A4; + 143 : 6425; + 144 : 64A4; + 145 : 6523; + 146 : 65A1; + 147 : 661D; + 148 : 6699; + 149 : 6714; + 150 : 678D; + 151 : 6806; + 152 : 687D; + 153 : 68F3; + 154 : 6969; + 155 : 69DD; + 156 : 6A50; + 157 : 6AC2; + 158 : 6B33; + 159 : 6BA3; + 160 : 6C12; + 161 : 6C80; + 162 : 6CED; + 163 : 6D58; + 164 : 6DC3; + 165 : 6E2C; + 166 : 6E94; + 167 : 6EFB; + 168 : 6F61; + 169 : 6FC6; + 170 : 702A; + 171 : 708D; + 172 : 70EE; + 173 : 714E; + 174 : 71AE; + 175 : 720C; + 176 : 7269; + 177 : 72C4; + 178 : 731F; + 179 : 7378; + 180 : 73D0; + 181 : 7428; + 182 : 747D; + 183 : 74D2; + 184 : 7526; + 185 : 7578; + 186 : 75C9; + 187 : 7619; + 188 : 7668; + 189 : 76B6; + 190 : 7702; + 191 : 774D; + 192 : 7797; + 193 : 77E0; + 194 : 7827; + 195 : 786E; + 196 : 78B3; + 197 : 78F7; + 198 : 793A; + 199 : 797B; + 200 : 79BB; + 201 : 79FA; + 202 : 7A38; + 203 : 7A75; + 204 : 7AB0; + 205 : 7AEA; + 206 : 7B23; + 207 : 7B5A; + 208 : 7B91; + 209 : 7BC6; + 210 : 7BFA; + 211 : 7C2C; + 212 : 7C5D; + 213 : 7C8E; + 214 : 7CBC; + 215 : 7CEA; + 216 : 7D16; + 217 : 7D41; + 218 : 7D6B; + 219 : 7D93; + 220 : 7DBB; + 221 : 7DE1; + 222 : 7E05; + 223 : 7E29; + 224 : 7E4B; + 225 : 7E6C; + 226 : 7E8B; + 227 : 7EA9; + 228 : 7EC6; + 229 : 7EE2; + 230 : 7EFD; + 231 : 7F16; + 232 : 7F2E; + 233 : 7F44; + 234 : 7F5A; + 235 : 7F6E; + 236 : 7F80; + 237 : 7F92; + 238 : 7FA2; + 239 : 7FB1; + 240 : 7FBE; + 241 : 7FCB; + 242 : 7FD6; + 243 : 7FDF; + 244 : 7FE8; + 245 : 7FEF; + 246 : 7FF5; + 247 : 7FF9; + 248 : 7FFC; + 249 : 7FFE; + 250 : 7FFF; + 251 : 7FFE; + 252 : 7FFC; + 253 : 7FF9; + 254 : 7FF5; + 255 : 7FEF; + 256 : 7FE8; + 257 : 7FDF; + 258 : 7FD6; + 259 : 7FCB; + 260 : 7FBE; + 261 : 7FB1; + 262 : 7FA2; + 263 : 7F92; + 264 : 7F80; + 265 : 7F6E; + 266 : 7F5A; + 267 : 7F44; + 268 : 7F2E; + 269 : 7F16; + 270 : 7EFD; + 271 : 7EE2; + 272 : 7EC6; + 273 : 7EA9; + 274 : 7E8B; + 275 : 7E6C; + 276 : 7E4B; + 277 : 7E29; + 278 : 7E05; + 279 : 7DE1; + 280 : 7DBB; + 281 : 7D93; + 282 : 7D6B; + 283 : 7D41; + 284 : 7D16; + 285 : 7CEA; + 286 : 7CBC; + 287 : 7C8E; + 288 : 7C5D; + 289 : 7C2C; + 290 : 7BFA; + 291 : 7BC6; + 292 : 7B91; + 293 : 7B5A; + 294 : 7B23; + 295 : 7AEA; + 296 : 7AB0; + 297 : 7A75; + 298 : 7A38; + 299 : 79FA; + 300 : 79BB; + 301 : 797B; + 302 : 793A; + 303 : 78F7; + 304 : 78B3; + 305 : 786E; + 306 : 7827; + 307 : 77E0; + 308 : 7797; + 309 : 774D; + 310 : 7702; + 311 : 76B6; + 312 : 7668; + 313 : 7619; + 314 : 75C9; + 315 : 7578; + 316 : 7526; + 317 : 74D2; + 318 : 747D; + 319 : 7428; + 320 : 73D0; + 321 : 7378; + 322 : 731F; + 323 : 72C4; + 324 : 7269; + 325 : 720C; + 326 : 71AE; + 327 : 714E; + 328 : 70EE; + 329 : 708D; + 330 : 702A; + 331 : 6FC6; + 332 : 6F61; + 333 : 6EFB; + 334 : 6E94; + 335 : 6E2C; + 336 : 6DC3; + 337 : 6D58; + 338 : 6CED; + 339 : 6C80; + 340 : 6C12; + 341 : 6BA3; + 342 : 6B33; + 343 : 6AC2; + 344 : 6A50; + 345 : 69DD; + 346 : 6969; + 347 : 68F3; + 348 : 687D; + 349 : 6806; + 350 : 678D; + 351 : 6714; + 352 : 6699; + 353 : 661D; + 354 : 65A1; + 355 : 6523; + 356 : 64A4; + 357 : 6425; + 358 : 63A4; + 359 : 6322; + 360 : 629F; + 361 : 621C; + 362 : 6197; + 363 : 6111; + 364 : 608B; + 365 : 6003; + 366 : 5F7A; + 367 : 5EF1; + 368 : 5E66; + 369 : 5DDB; + 370 : 5D4E; + 371 : 5CC1; + 372 : 5C32; + 373 : 5BA3; + 374 : 5B13; + 375 : 5A82; + 376 : 59F0; + 377 : 595D; + 378 : 58C9; + 379 : 5834; + 380 : 579F; + 381 : 5708; + 382 : 5671; + 383 : 55D8; + 384 : 553F; + 385 : 54A5; + 386 : 540A; + 387 : 536F; + 388 : 52D2; + 389 : 5235; + 390 : 5196; + 391 : 50F7; + 392 : 5058; + 393 : 4FB7; + 394 : 4F15; + 395 : 4E73; + 396 : 4DD0; + 397 : 4D2C; + 398 : 4C88; + 399 : 4BE2; + 400 : 4B3C; + 401 : 4A95; + 402 : 49ED; + 403 : 4945; + 404 : 489C; + 405 : 47F2; + 406 : 4747; + 407 : 469C; + 408 : 45F0; + 409 : 4543; + 410 : 4495; + 411 : 43E7; + 412 : 4338; + 413 : 4289; + 414 : 41D9; + 415 : 4128; + 416 : 4076; + 417 : 3FC4; + 418 : 3F11; + 419 : 3E5E; + 420 : 3DAA; + 421 : 3CF5; + 422 : 3C40; + 423 : 3B8A; + 424 : 3AD3; + 425 : 3A1C; + 426 : 3964; + 427 : 38AC; + 428 : 37F3; + 429 : 373A; + 430 : 3680; + 431 : 35C5; + 432 : 350A; + 433 : 344E; + 434 : 3392; + 435 : 32D5; + 436 : 3218; + 437 : 315A; + 438 : 309C; + 439 : 2FDE; + 440 : 2F1E; + 441 : 2E5F; + 442 : 2D9F; + 443 : 2CDE; + 444 : 2C1D; + 445 : 2B5B; + 446 : 2A99; + 447 : 29D7; + 448 : 2914; + 449 : 2851; + 450 : 278E; + 451 : 26CA; + 452 : 2605; + 453 : 2540; + 454 : 247B; + 455 : 23B6; + 456 : 22F0; + 457 : 222A; + 458 : 2163; + 459 : 209C; + 460 : 1FD5; + 461 : 1F0D; + 462 : 1E45; + 463 : 1D7D; + 464 : 1CB5; + 465 : 1BEC; + 466 : 1B23; + 467 : 1A5A; + 468 : 1990; + 469 : 18C6; + 470 : 17FC; + 471 : 1732; + 472 : 1667; + 473 : 159C; + 474 : 14D1; + 475 : 1406; + 476 : 133A; + 477 : 126F; + 478 : 11A3; + 479 : 10D7; + 480 : 100B; + 481 : 0F3E; + 482 : 0E72; + 483 : 0DA5; + 484 : 0CD9; + 485 : 0C0C; + 486 : 0B3F; + 487 : 0A71; + 488 : 09A4; + 489 : 08D7; + 490 : 0809; + 491 : 073C; + 492 : 066E; + 493 : 05A1; + 494 : 04D3; + 495 : 0405; + 496 : 0337; + 497 : 026A; + 498 : 019C; + 499 : 00CE; + 500 : 0000; + 501 : FF32; + 502 : FE64; + 503 : FD96; + 504 : FCC9; + 505 : FBFB; + 506 : FB2D; + 507 : FA5F; + 508 : F992; + 509 : F8C4; + 510 : F7F7; + 511 : F729; + 512 : F65C; + 513 : F58F; + 514 : F4C1; + 515 : F3F4; + 516 : F327; + 517 : F25B; + 518 : F18E; + 519 : F0C2; + 520 : EFF5; + 521 : EF29; + 522 : EE5D; + 523 : ED91; + 524 : ECC6; + 525 : EBFA; + 526 : EB2F; + 527 : EA64; + 528 : E999; + 529 : E8CE; + 530 : E804; + 531 : E73A; + 532 : E670; + 533 : E5A6; + 534 : E4DD; + 535 : E414; + 536 : E34B; + 537 : E283; + 538 : E1BB; + 539 : E0F3; + 540 : E02B; + 541 : DF64; + 542 : DE9D; + 543 : DDD6; + 544 : DD10; + 545 : DC4A; + 546 : DB85; + 547 : DAC0; + 548 : D9FB; + 549 : D936; + 550 : D872; + 551 : D7AF; + 552 : D6EC; + 553 : D629; + 554 : D567; + 555 : D4A5; + 556 : D3E3; + 557 : D322; + 558 : D261; + 559 : D1A1; + 560 : D0E2; + 561 : D022; + 562 : CF64; + 563 : CEA6; + 564 : CDE8; + 565 : CD2B; + 566 : CC6E; + 567 : CBB2; + 568 : CAF6; + 569 : CA3B; + 570 : C980; + 571 : C8C6; + 572 : C80D; + 573 : C754; + 574 : C69C; + 575 : C5E4; + 576 : C52D; + 577 : C476; + 578 : C3C0; + 579 : C30B; + 580 : C256; + 581 : C1A2; + 582 : C0EF; + 583 : C03C; + 584 : BF8A; + 585 : BED8; + 586 : BE27; + 587 : BD77; + 588 : BCC8; + 589 : BC19; + 590 : BB6B; + 591 : BABD; + 592 : BA10; + 593 : B964; + 594 : B8B9; + 595 : B80E; + 596 : B764; + 597 : B6BB; + 598 : B613; + 599 : B56B; + 600 : B4C4; + 601 : B41E; + 602 : B378; + 603 : B2D4; + 604 : B230; + 605 : B18D; + 606 : B0EB; + 607 : B049; + 608 : AFA8; + 609 : AF09; + 610 : AE6A; + 611 : ADCB; + 612 : AD2E; + 613 : AC91; + 614 : ABF6; + 615 : AB5B; + 616 : AAC1; + 617 : AA28; + 618 : A98F; + 619 : A8F8; + 620 : A861; + 621 : A7CC; + 622 : A737; + 623 : A6A3; + 624 : A610; + 625 : A57E; + 626 : A4ED; + 627 : A45D; + 628 : A3CE; + 629 : A33F; + 630 : A2B2; + 631 : A225; + 632 : A19A; + 633 : A10F; + 634 : A086; + 635 : 9FFD; + 636 : 9F75; + 637 : 9EEF; + 638 : 9E69; + 639 : 9DE4; + 640 : 9D61; + 641 : 9CDE; + 642 : 9C5C; + 643 : 9BDB; + 644 : 9B5C; + 645 : 9ADD; + 646 : 9A5F; + 647 : 99E3; + 648 : 9967; + 649 : 98EC; + 650 : 9873; + 651 : 97FA; + 652 : 9783; + 653 : 970D; + 654 : 9697; + 655 : 9623; + 656 : 95B0; + 657 : 953E; + 658 : 94CD; + 659 : 945D; + 660 : 93EE; + 661 : 9380; + 662 : 9313; + 663 : 92A8; + 664 : 923D; + 665 : 91D4; + 666 : 916C; + 667 : 9105; + 668 : 909F; + 669 : 903A; + 670 : 8FD6; + 671 : 8F73; + 672 : 8F12; + 673 : 8EB2; + 674 : 8E52; + 675 : 8DF4; + 676 : 8D97; + 677 : 8D3C; + 678 : 8CE1; + 679 : 8C88; + 680 : 8C30; + 681 : 8BD8; + 682 : 8B83; + 683 : 8B2E; + 684 : 8ADA; + 685 : 8A88; + 686 : 8A37; + 687 : 89E7; + 688 : 8998; + 689 : 894A; + 690 : 88FE; + 691 : 88B3; + 692 : 8869; + 693 : 8820; + 694 : 87D9; + 695 : 8792; + 696 : 874D; + 697 : 8709; + 698 : 86C6; + 699 : 8685; + 700 : 8645; + 701 : 8606; + 702 : 85C8; + 703 : 858B; + 704 : 8550; + 705 : 8516; + 706 : 84DD; + 707 : 84A6; + 708 : 846F; + 709 : 843A; + 710 : 8406; + 711 : 83D4; + 712 : 83A3; + 713 : 8372; + 714 : 8344; + 715 : 8316; + 716 : 82EA; + 717 : 82BF; + 718 : 8295; + 719 : 826D; + 720 : 8245; + 721 : 821F; + 722 : 81FB; + 723 : 81D7; + 724 : 81B5; + 725 : 8194; + 726 : 8175; + 727 : 8157; + 728 : 813A; + 729 : 811E; + 730 : 8103; + 731 : 80EA; + 732 : 80D2; + 733 : 80BC; + 734 : 80A6; + 735 : 8092; + 736 : 8080; + 737 : 806E; + 738 : 805E; + 739 : 804F; + 740 : 8042; + 741 : 8035; + 742 : 802A; + 743 : 8021; + 744 : 8018; + 745 : 8011; + 746 : 800B; + 747 : 8007; + 748 : 8004; + 749 : 8002; + 750 : 8001; + 751 : 8002; + 752 : 8004; + 753 : 8007; + 754 : 800B; + 755 : 8011; + 756 : 8018; + 757 : 8021; + 758 : 802A; + 759 : 8035; + 760 : 8042; + 761 : 804F; + 762 : 805E; + 763 : 806E; + 764 : 8080; + 765 : 8092; + 766 : 80A6; + 767 : 80BC; + 768 : 80D2; + 769 : 80EA; + 770 : 8103; + 771 : 811E; + 772 : 813A; + 773 : 8157; + 774 : 8175; + 775 : 8194; + 776 : 81B5; + 777 : 81D7; + 778 : 81FB; + 779 : 821F; + 780 : 8245; + 781 : 826D; + 782 : 8295; + 783 : 82BF; + 784 : 82EA; + 785 : 8316; + 786 : 8344; + 787 : 8372; + 788 : 83A3; + 789 : 83D4; + 790 : 8406; + 791 : 843A; + 792 : 846F; + 793 : 84A6; + 794 : 84DD; + 795 : 8516; + 796 : 8550; + 797 : 858B; + 798 : 85C8; + 799 : 8606; + 800 : 8645; + 801 : 8685; + 802 : 86C6; + 803 : 8709; + 804 : 874D; + 805 : 8792; + 806 : 87D9; + 807 : 8820; + 808 : 8869; + 809 : 88B3; + 810 : 88FE; + 811 : 894A; + 812 : 8998; + 813 : 89E7; + 814 : 8A37; + 815 : 8A88; + 816 : 8ADA; + 817 : 8B2E; + 818 : 8B83; + 819 : 8BD8; + 820 : 8C30; + 821 : 8C88; + 822 : 8CE1; + 823 : 8D3C; + 824 : 8D97; + 825 : 8DF4; + 826 : 8E52; + 827 : 8EB2; + 828 : 8F12; + 829 : 8F73; + 830 : 8FD6; + 831 : 903A; + 832 : 909F; + 833 : 9105; + 834 : 916C; + 835 : 91D4; + 836 : 923D; + 837 : 92A8; + 838 : 9313; + 839 : 9380; + 840 : 93EE; + 841 : 945D; + 842 : 94CD; + 843 : 953E; + 844 : 95B0; + 845 : 9623; + 846 : 9697; + 847 : 970D; + 848 : 9783; + 849 : 97FA; + 850 : 9873; + 851 : 98EC; + 852 : 9967; + 853 : 99E3; + 854 : 9A5F; + 855 : 9ADD; + 856 : 9B5C; + 857 : 9BDB; + 858 : 9C5C; + 859 : 9CDE; + 860 : 9D61; + 861 : 9DE4; + 862 : 9E69; + 863 : 9EEF; + 864 : 9F75; + 865 : 9FFD; + 866 : A086; + 867 : A10F; + 868 : A19A; + 869 : A225; + 870 : A2B2; + 871 : A33F; + 872 : A3CE; + 873 : A45D; + 874 : A4ED; + 875 : A57E; + 876 : A610; + 877 : A6A3; + 878 : A737; + 879 : A7CC; + 880 : A861; + 881 : A8F8; + 882 : A98F; + 883 : AA28; + 884 : AAC1; + 885 : AB5B; + 886 : ABF6; + 887 : AC91; + 888 : AD2E; + 889 : ADCB; + 890 : AE6A; + 891 : AF09; + 892 : AFA8; + 893 : B049; + 894 : B0EB; + 895 : B18D; + 896 : B230; + 897 : B2D4; + 898 : B378; + 899 : B41E; + 900 : B4C4; + 901 : B56B; + 902 : B613; + 903 : B6BB; + 904 : B764; + 905 : B80E; + 906 : B8B9; + 907 : B964; + 908 : BA10; + 909 : BABD; + 910 : BB6B; + 911 : BC19; + 912 : BCC8; + 913 : BD77; + 914 : BE27; + 915 : BED8; + 916 : BF8A; + 917 : C03C; + 918 : C0EF; + 919 : C1A2; + 920 : C256; + 921 : C30B; + 922 : C3C0; + 923 : C476; + 924 : C52D; + 925 : C5E4; + 926 : C69C; + 927 : C754; + 928 : C80D; + 929 : C8C6; + 930 : C980; + 931 : CA3B; + 932 : CAF6; + 933 : CBB2; + 934 : CC6E; + 935 : CD2B; + 936 : CDE8; + 937 : CEA6; + 938 : CF64; + 939 : D022; + 940 : D0E2; + 941 : D1A1; + 942 : D261; + 943 : D322; + 944 : D3E3; + 945 : D4A5; + 946 : D567; + 947 : D629; + 948 : D6EC; + 949 : D7AF; + 950 : D872; + 951 : D936; + 952 : D9FB; + 953 : DAC0; + 954 : DB85; + 955 : DC4A; + 956 : DD10; + 957 : DDD6; + 958 : DE9D; + 959 : DF64; + 960 : E02B; + 961 : E0F3; + 962 : E1BB; + 963 : E283; + 964 : E34B; + 965 : E414; + 966 : E4DD; + 967 : E5A6; + 968 : E670; + 969 : E73A; + 970 : E804; + 971 : E8CE; + 972 : E999; + 973 : EA64; + 974 : EB2F; + 975 : EBFA; + 976 : ECC6; + 977 : ED91; + 978 : EE5D; + 979 : EF29; + 980 : EFF5; + 981 : F0C2; + 982 : F18E; + 983 : F25B; + 984 : F327; + 985 : F3F4; + 986 : F4C1; + 987 : F58F; + 988 : F65C; + 989 : F729; + 990 : F7F7; + 991 : F8C4; + 992 : F992; + 993 : FA5F; + 994 : FB2D; + 995 : FBFB; + 996 : FCC9; + 997 : FD96; + 998 : FE64; + 999 : FF32; +END; diff --git a/peripherals/spwm/table_sine_offset.mif b/peripherals/spwm/table_sine_offset.mif new file mode 100644 index 00000000..653b1b36 --- /dev/null +++ b/peripherals/spwm/table_sine_offset.mif @@ -0,0 +1,1025 @@ +-- Copyright (C) 2022 Intel Corporation. All rights reserved. +-- Your use of Intel Corporation's design tools, logic functions +-- and other software and tools, and any partner logic +-- functions, and any output files from any of the foregoing +-- (including device programming or simulation files), and any +-- associated documentation or information are expressly subject +-- to the terms and conditions of the Intel Program License +-- Subscription Agreement, the Intel Quartus Prime License Agreement, +-- the Intel FPGA IP License Agreement, or other applicable license +-- agreement, including, without limitation, that your use is for +-- the sole purpose of programming logic devices manufactured by +-- Intel and sold by Intel or its authorized distributors. Please +-- refer to the applicable agreement for further details, at +-- https://fpgasoftware.intel.com/eula. + +-- Quartus Prime generated Memory Initialization File (.mif) + +WIDTH=16; +DEPTH=1000; + +ADDRESS_RADIX=UNS; +DATA_RADIX=UNS; + +CONTENT BEGIN + 0 : 0000; + 1 : FF32; + 2 : FE64; + 3 : FD96; + 4 : FCC9; + 5 : FBFB; + 6 : FB2D; + 7 : FA5F; + 8 : F992; + 9 : F8C4; + 10 : F7F7; + 11 : F729; + 12 : F65C; + 13 : F58F; + 14 : F4C1; + 15 : F3F4; + 16 : F327; + 17 : F25B; + 18 : F18E; + 19 : F0C2; + 20 : EFF5; + 21 : EF29; + 22 : EE5D; + 23 : ED91; + 24 : ECC6; + 25 : EBFA; + 26 : EB2F; + 27 : EA64; + 28 : E999; + 29 : E8CE; + 30 : E804; + 31 : E73A; + 32 : E670; + 33 : E5A6; + 34 : E4DD; + 35 : E414; + 36 : E34B; + 37 : E283; + 38 : E1BB; + 39 : E0F3; + 40 : E02B; + 41 : DF64; + 42 : DE9D; + 43 : DDD6; + 44 : DD10; + 45 : DC4A; + 46 : DB85; + 47 : DAC0; + 48 : D9FB; + 49 : D936; + 50 : D872; + 51 : D7AF; + 52 : D6EC; + 53 : D629; + 54 : D567; + 55 : D4A5; + 56 : D3E3; + 57 : D322; + 58 : D261; + 59 : D1A1; + 60 : D0E2; + 61 : D022; + 62 : CF64; + 63 : CEA6; + 64 : CDE8; + 65 : CD2B; + 66 : CC6E; + 67 : CBB2; + 68 : CAF6; + 69 : CA3B; + 70 : C980; + 71 : C8C6; + 72 : C80D; + 73 : C754; + 74 : C69C; + 75 : C5E4; + 76 : C52D; + 77 : C476; + 78 : C3C0; + 79 : C30B; + 80 : C256; + 81 : C1A2; + 82 : C0EF; + 83 : C03C; + 84 : BF8A; + 85 : BED8; + 86 : BE27; + 87 : BD77; + 88 : BCC8; + 89 : BC19; + 90 : BB6B; + 91 : BABD; + 92 : BA10; + 93 : B964; + 94 : B8B9; + 95 : B80E; + 96 : B764; + 97 : B6BB; + 98 : B613; + 99 : B56B; + 100 : B4C4; + 101 : B41E; + 102 : B378; + 103 : B2D4; + 104 : B230; + 105 : B18D; + 106 : B0EB; + 107 : B049; + 108 : AFA8; + 109 : AF09; + 110 : AE6A; + 111 : ADCB; + 112 : AD2E; + 113 : AC91; + 114 : ABF6; + 115 : AB5B; + 116 : AAC1; + 117 : AA28; + 118 : A98F; + 119 : A8F8; + 120 : A861; + 121 : A7CC; + 122 : A737; + 123 : A6A3; + 124 : A610; + 125 : A57E; + 126 : A4ED; + 127 : A45D; + 128 : A3CE; + 129 : A33F; + 130 : A2B2; + 131 : A225; + 132 : A19A; + 133 : A10F; + 134 : A086; + 135 : 9FFD; + 136 : 9F75; + 137 : 9EEF; + 138 : 9E69; + 139 : 9DE4; + 140 : 9D61; + 141 : 9CDE; + 142 : 9C5C; + 143 : 9BDB; + 144 : 9B5C; + 145 : 9ADD; + 146 : 9A5F; + 147 : 99E3; + 148 : 9967; + 149 : 98EC; + 150 : 9873; + 151 : 97FA; + 152 : 9783; + 153 : 970D; + 154 : 9697; + 155 : 9623; + 156 : 95B0; + 157 : 953E; + 158 : 94CD; + 159 : 945D; + 160 : 93EE; + 161 : 9380; + 162 : 9313; + 163 : 92A8; + 164 : 923D; + 165 : 91D4; + 166 : 916C; + 167 : 9105; + 168 : 909F; + 169 : 903A; + 170 : 8FD6; + 171 : 8F73; + 172 : 8F12; + 173 : 8EB2; + 174 : 8E52; + 175 : 8DF4; + 176 : 8D97; + 177 : 8D3C; + 178 : 8CE1; + 179 : 8C88; + 180 : 8C30; + 181 : 8BD8; + 182 : 8B83; + 183 : 8B2E; + 184 : 8ADA; + 185 : 8A88; + 186 : 8A37; + 187 : 89E7; + 188 : 8998; + 189 : 894A; + 190 : 88FE; + 191 : 88B3; + 192 : 8869; + 193 : 8820; + 194 : 87D9; + 195 : 8792; + 196 : 874D; + 197 : 8709; + 198 : 86C6; + 199 : 8685; + 200 : 8645; + 201 : 8606; + 202 : 85C8; + 203 : 858B; + 204 : 8550; + 205 : 8516; + 206 : 84DD; + 207 : 84A6; + 208 : 846F; + 209 : 843A; + 210 : 8406; + 211 : 83D4; + 212 : 83A3; + 213 : 8372; + 214 : 8344; + 215 : 8316; + 216 : 82EA; + 217 : 82BF; + 218 : 8295; + 219 : 826D; + 220 : 8245; + 221 : 821F; + 222 : 81FB; + 223 : 81D7; + 224 : 81B5; + 225 : 8194; + 226 : 8175; + 227 : 8157; + 228 : 813A; + 229 : 811E; + 230 : 8103; + 231 : 80EA; + 232 : 80D2; + 233 : 80BC; + 234 : 80A6; + 235 : 8092; + 236 : 8080; + 237 : 806E; + 238 : 805E; + 239 : 804F; + 240 : 8042; + 241 : 8035; + 242 : 802A; + 243 : 8021; + 244 : 8018; + 245 : 8011; + 246 : 800B; + 247 : 8007; + 248 : 8004; + 249 : 8002; + 250 : 8001; + 251 : 8002; + 252 : 8004; + 253 : 8007; + 254 : 800B; + 255 : 8011; + 256 : 8018; + 257 : 8021; + 258 : 802A; + 259 : 8035; + 260 : 8042; + 261 : 804F; + 262 : 805E; + 263 : 806E; + 264 : 8080; + 265 : 8092; + 266 : 80A6; + 267 : 80BC; + 268 : 80D2; + 269 : 80EA; + 270 : 8103; + 271 : 811E; + 272 : 813A; + 273 : 8157; + 274 : 8175; + 275 : 8194; + 276 : 81B5; + 277 : 81D7; + 278 : 81FB; + 279 : 821F; + 280 : 8245; + 281 : 826D; + 282 : 8295; + 283 : 82BF; + 284 : 82EA; + 285 : 8316; + 286 : 8344; + 287 : 8372; + 288 : 83A3; + 289 : 83D4; + 290 : 8406; + 291 : 843A; + 292 : 846F; + 293 : 84A6; + 294 : 84DD; + 295 : 8516; + 296 : 8550; + 297 : 858B; + 298 : 85C8; + 299 : 8606; + 300 : 8645; + 301 : 8685; + 302 : 86C6; + 303 : 8709; + 304 : 874D; + 305 : 8792; + 306 : 87D9; + 307 : 8820; + 308 : 8869; + 309 : 88B3; + 310 : 88FE; + 311 : 894A; + 312 : 8998; + 313 : 89E7; + 314 : 8A37; + 315 : 8A88; + 316 : 8ADA; + 317 : 8B2E; + 318 : 8B83; + 319 : 8BD8; + 320 : 8C30; + 321 : 8C88; + 322 : 8CE1; + 323 : 8D3C; + 324 : 8D97; + 325 : 8DF4; + 326 : 8E52; + 327 : 8EB2; + 328 : 8F12; + 329 : 8F73; + 330 : 8FD6; + 331 : 903A; + 332 : 909F; + 333 : 9105; + 334 : 916C; + 335 : 91D4; + 336 : 923D; + 337 : 92A8; + 338 : 9313; + 339 : 9380; + 340 : 93EE; + 341 : 945D; + 342 : 94CD; + 343 : 953E; + 344 : 95B0; + 345 : 9623; + 346 : 9697; + 347 : 970D; + 348 : 9783; + 349 : 97FA; + 350 : 9873; + 351 : 98EC; + 352 : 9967; + 353 : 99E3; + 354 : 9A5F; + 355 : 9ADD; + 356 : 9B5C; + 357 : 9BDB; + 358 : 9C5C; + 359 : 9CDE; + 360 : 9D61; + 361 : 9DE4; + 362 : 9E69; + 363 : 9EEF; + 364 : 9F75; + 365 : 9FFD; + 366 : A086; + 367 : A10F; + 368 : A19A; + 369 : A225; + 370 : A2B2; + 371 : A33F; + 372 : A3CE; + 373 : A45D; + 374 : A4ED; + 375 : A57E; + 376 : A610; + 377 : A6A3; + 378 : A737; + 379 : A7CC; + 380 : A861; + 381 : A8F8; + 382 : A98F; + 383 : AA28; + 384 : AAC1; + 385 : AB5B; + 386 : ABF6; + 387 : AC91; + 388 : AD2E; + 389 : ADCB; + 390 : AE6A; + 391 : AF09; + 392 : AFA8; + 393 : B049; + 394 : B0EB; + 395 : B18D; + 396 : B230; + 397 : B2D4; + 398 : B378; + 399 : B41E; + 400 : B4C4; + 401 : B56B; + 402 : B613; + 403 : B6BB; + 404 : B764; + 405 : B80E; + 406 : B8B9; + 407 : B964; + 408 : BA10; + 409 : BABD; + 410 : BB6B; + 411 : BC19; + 412 : BCC8; + 413 : BD77; + 414 : BE27; + 415 : BED8; + 416 : BF8A; + 417 : C03C; + 418 : C0EF; + 419 : C1A2; + 420 : C256; + 421 : C30B; + 422 : C3C0; + 423 : C476; + 424 : C52D; + 425 : C5E4; + 426 : C69C; + 427 : C754; + 428 : C80D; + 429 : C8C6; + 430 : C980; + 431 : CA3B; + 432 : CAF6; + 433 : CBB2; + 434 : CC6E; + 435 : CD2B; + 436 : CDE8; + 437 : CEA6; + 438 : CF64; + 439 : D022; + 440 : D0E2; + 441 : D1A1; + 442 : D261; + 443 : D322; + 444 : D3E3; + 445 : D4A5; + 446 : D567; + 447 : D629; + 448 : D6EC; + 449 : D7AF; + 450 : D872; + 451 : D936; + 452 : D9FB; + 453 : DAC0; + 454 : DB85; + 455 : DC4A; + 456 : DD10; + 457 : DDD6; + 458 : DE9D; + 459 : DF64; + 460 : E02B; + 461 : E0F3; + 462 : E1BB; + 463 : E283; + 464 : E34B; + 465 : E414; + 466 : E4DD; + 467 : E5A6; + 468 : E670; + 469 : E73A; + 470 : E804; + 471 : E8CE; + 472 : E999; + 473 : EA64; + 474 : EB2F; + 475 : EBFA; + 476 : ECC6; + 477 : ED91; + 478 : EE5D; + 479 : EF29; + 480 : EFF5; + 481 : F0C2; + 482 : F18E; + 483 : F25B; + 484 : F327; + 485 : F3F4; + 486 : F4C1; + 487 : F58F; + 488 : F65C; + 489 : F729; + 490 : F7F7; + 491 : F8C4; + 492 : F992; + 493 : FA5F; + 494 : FB2D; + 495 : FBFB; + 496 : FCC9; + 497 : FD96; + 498 : FE64; + 499 : FF32; + 500 : 0000; + 501 : 00CE; + 502 : 019C; + 503 : 026A; + 504 : 0337; + 505 : 0405; + 506 : 04D3; + 507 : 05A1; + 508 : 066E; + 509 : 073C; + 510 : 0809; + 511 : 08D7; + 512 : 09A4; + 513 : 0A71; + 514 : 0B3F; + 515 : 0C0C; + 516 : 0CD9; + 517 : 0DA5; + 518 : 0E72; + 519 : 0F3E; + 520 : 100B; + 521 : 10D7; + 522 : 11A3; + 523 : 126F; + 524 : 133A; + 525 : 1406; + 526 : 14D1; + 527 : 159C; + 528 : 1667; + 529 : 1732; + 530 : 17FC; + 531 : 18C6; + 532 : 1990; + 533 : 1A5A; + 534 : 1B23; + 535 : 1BEC; + 536 : 1CB5; + 537 : 1D7D; + 538 : 1E45; + 539 : 1F0D; + 540 : 1FD5; + 541 : 209C; + 542 : 2163; + 543 : 222A; + 544 : 22F0; + 545 : 23B6; + 546 : 247B; + 547 : 2540; + 548 : 2605; + 549 : 26CA; + 550 : 278E; + 551 : 2851; + 552 : 2914; + 553 : 29D7; + 554 : 2A99; + 555 : 2B5B; + 556 : 2C1D; + 557 : 2CDE; + 558 : 2D9F; + 559 : 2E5F; + 560 : 2F1E; + 561 : 2FDE; + 562 : 309C; + 563 : 315A; + 564 : 3218; + 565 : 32D5; + 566 : 3392; + 567 : 344E; + 568 : 350A; + 569 : 35C5; + 570 : 3680; + 571 : 373A; + 572 : 37F3; + 573 : 38AC; + 574 : 3964; + 575 : 3A1C; + 576 : 3AD3; + 577 : 3B8A; + 578 : 3C40; + 579 : 3CF5; + 580 : 3DAA; + 581 : 3E5E; + 582 : 3F11; + 583 : 3FC4; + 584 : 4076; + 585 : 4128; + 586 : 41D9; + 587 : 4289; + 588 : 4338; + 589 : 43E7; + 590 : 4495; + 591 : 4543; + 592 : 45F0; + 593 : 469C; + 594 : 4747; + 595 : 47F2; + 596 : 489C; + 597 : 4945; + 598 : 49ED; + 599 : 4A95; + 600 : 4B3C; + 601 : 4BE2; + 602 : 4C88; + 603 : 4D2C; + 604 : 4DD0; + 605 : 4E73; + 606 : 4F15; + 607 : 4FB7; + 608 : 5058; + 609 : 50F7; + 610 : 5196; + 611 : 5235; + 612 : 52D2; + 613 : 536F; + 614 : 540A; + 615 : 54A5; + 616 : 553F; + 617 : 55D8; + 618 : 5671; + 619 : 5708; + 620 : 579F; + 621 : 5834; + 622 : 58C9; + 623 : 595D; + 624 : 59F0; + 625 : 5A82; + 626 : 5B13; + 627 : 5BA3; + 628 : 5C32; + 629 : 5CC1; + 630 : 5D4E; + 631 : 5DDB; + 632 : 5E66; + 633 : 5EF1; + 634 : 5F7A; + 635 : 6003; + 636 : 608B; + 637 : 6111; + 638 : 6197; + 639 : 621C; + 640 : 629F; + 641 : 6322; + 642 : 63A4; + 643 : 6425; + 644 : 64A4; + 645 : 6523; + 646 : 65A1; + 647 : 661D; + 648 : 6699; + 649 : 6714; + 650 : 678D; + 651 : 6806; + 652 : 687D; + 653 : 68F3; + 654 : 6969; + 655 : 69DD; + 656 : 6A50; + 657 : 6AC2; + 658 : 6B33; + 659 : 6BA3; + 660 : 6C12; + 661 : 6C80; + 662 : 6CED; + 663 : 6D58; + 664 : 6DC3; + 665 : 6E2C; + 666 : 6E94; + 667 : 6EFB; + 668 : 6F61; + 669 : 6FC6; + 670 : 702A; + 671 : 708D; + 672 : 70EE; + 673 : 714E; + 674 : 71AE; + 675 : 720C; + 676 : 7269; + 677 : 72C4; + 678 : 731F; + 679 : 7378; + 680 : 73D0; + 681 : 7428; + 682 : 747D; + 683 : 74D2; + 684 : 7526; + 685 : 7578; + 686 : 75C9; + 687 : 7619; + 688 : 7668; + 689 : 76B6; + 690 : 7702; + 691 : 774D; + 692 : 7797; + 693 : 77E0; + 694 : 7827; + 695 : 786E; + 696 : 78B3; + 697 : 78F7; + 698 : 793A; + 699 : 797B; + 700 : 79BB; + 701 : 79FA; + 702 : 7A38; + 703 : 7A75; + 704 : 7AB0; + 705 : 7AEA; + 706 : 7B23; + 707 : 7B5A; + 708 : 7B91; + 709 : 7BC6; + 710 : 7BFA; + 711 : 7C2C; + 712 : 7C5D; + 713 : 7C8E; + 714 : 7CBC; + 715 : 7CEA; + 716 : 7D16; + 717 : 7D41; + 718 : 7D6B; + 719 : 7D93; + 720 : 7DBB; + 721 : 7DE1; + 722 : 7E05; + 723 : 7E29; + 724 : 7E4B; + 725 : 7E6C; + 726 : 7E8B; + 727 : 7EA9; + 728 : 7EC6; + 729 : 7EE2; + 730 : 7EFD; + 731 : 7F16; + 732 : 7F2E; + 733 : 7F44; + 734 : 7F5A; + 735 : 7F6E; + 736 : 7F80; + 737 : 7F92; + 738 : 7FA2; + 739 : 7FB1; + 740 : 7FBE; + 741 : 7FCB; + 742 : 7FD6; + 743 : 7FDF; + 744 : 7FE8; + 745 : 7FEF; + 746 : 7FF5; + 747 : 7FF9; + 748 : 7FFC; + 749 : 7FFE; + 750 : 7FFF; + 751 : 7FFE; + 752 : 7FFC; + 753 : 7FF9; + 754 : 7FF5; + 755 : 7FEF; + 756 : 7FE8; + 757 : 7FDF; + 758 : 7FD6; + 759 : 7FCB; + 760 : 7FBE; + 761 : 7FB1; + 762 : 7FA2; + 763 : 7F92; + 764 : 7F80; + 765 : 7F6E; + 766 : 7F5A; + 767 : 7F44; + 768 : 7F2E; + 769 : 7F16; + 770 : 7EFD; + 771 : 7EE2; + 772 : 7EC6; + 773 : 7EA9; + 774 : 7E8B; + 775 : 7E6C; + 776 : 7E4B; + 777 : 7E29; + 778 : 7E05; + 779 : 7DE1; + 780 : 7DBB; + 781 : 7D93; + 782 : 7D6B; + 783 : 7D41; + 784 : 7D16; + 785 : 7CEA; + 786 : 7CBC; + 787 : 7C8E; + 788 : 7C5D; + 789 : 7C2C; + 790 : 7BFA; + 791 : 7BC6; + 792 : 7B91; + 793 : 7B5A; + 794 : 7B23; + 795 : 7AEA; + 796 : 7AB0; + 797 : 7A75; + 798 : 7A38; + 799 : 79FA; + 800 : 79BB; + 801 : 797B; + 802 : 793A; + 803 : 78F7; + 804 : 78B3; + 805 : 786E; + 806 : 7827; + 807 : 77E0; + 808 : 7797; + 809 : 774D; + 810 : 7702; + 811 : 76B6; + 812 : 7668; + 813 : 7619; + 814 : 75C9; + 815 : 7578; + 816 : 7526; + 817 : 74D2; + 818 : 747D; + 819 : 7428; + 820 : 73D0; + 821 : 7378; + 822 : 731F; + 823 : 72C4; + 824 : 7269; + 825 : 720C; + 826 : 71AE; + 827 : 714E; + 828 : 70EE; + 829 : 708D; + 830 : 702A; + 831 : 6FC6; + 832 : 6F61; + 833 : 6EFB; + 834 : 6E94; + 835 : 6E2C; + 836 : 6DC3; + 837 : 6D58; + 838 : 6CED; + 839 : 6C80; + 840 : 6C12; + 841 : 6BA3; + 842 : 6B33; + 843 : 6AC2; + 844 : 6A50; + 845 : 69DD; + 846 : 6969; + 847 : 68F3; + 848 : 687D; + 849 : 6806; + 850 : 678D; + 851 : 6714; + 852 : 6699; + 853 : 661D; + 854 : 65A1; + 855 : 6523; + 856 : 64A4; + 857 : 6425; + 858 : 63A4; + 859 : 6322; + 860 : 629F; + 861 : 621C; + 862 : 6197; + 863 : 6111; + 864 : 608B; + 865 : 6003; + 866 : 5F7A; + 867 : 5EF1; + 868 : 5E66; + 869 : 5DDB; + 870 : 5D4E; + 871 : 5CC1; + 872 : 5C32; + 873 : 5BA3; + 874 : 5B13; + 875 : 5A82; + 876 : 59F0; + 877 : 595D; + 878 : 58C9; + 879 : 5834; + 880 : 579F; + 881 : 5708; + 882 : 5671; + 883 : 55D8; + 884 : 553F; + 885 : 54A5; + 886 : 540A; + 887 : 536F; + 888 : 52D2; + 889 : 5235; + 890 : 5196; + 891 : 50F7; + 892 : 5058; + 893 : 4FB7; + 894 : 4F15; + 895 : 4E73; + 896 : 4DD0; + 897 : 4D2C; + 898 : 4C88; + 899 : 4BE2; + 900 : 4B3C; + 901 : 4A95; + 902 : 49ED; + 903 : 4945; + 904 : 489C; + 905 : 47F2; + 906 : 4747; + 907 : 469C; + 908 : 45F0; + 909 : 4543; + 910 : 4495; + 911 : 43E7; + 912 : 4338; + 913 : 4289; + 914 : 41D9; + 915 : 4128; + 916 : 4076; + 917 : 3FC4; + 918 : 3F11; + 919 : 3E5E; + 920 : 3DAA; + 921 : 3CF5; + 922 : 3C40; + 923 : 3B8A; + 924 : 3AD3; + 925 : 3A1C; + 926 : 3964; + 927 : 38AC; + 928 : 37F3; + 929 : 373A; + 930 : 3680; + 931 : 35C5; + 932 : 350A; + 933 : 344E; + 934 : 3392; + 935 : 32D5; + 936 : 3218; + 937 : 315A; + 938 : 309C; + 939 : 2FDE; + 940 : 2F1E; + 941 : 2E5F; + 942 : 2D9F; + 943 : 2CDE; + 944 : 2C1D; + 945 : 2B5B; + 946 : 2A99; + 947 : 29D7; + 948 : 2914; + 949 : 2851; + 950 : 278E; + 951 : 26CA; + 952 : 2605; + 953 : 2540; + 954 : 247B; + 955 : 23B6; + 956 : 22F0; + 957 : 222A; + 958 : 2163; + 959 : 209C; + 960 : 1FD5; + 961 : 1F0D; + 962 : 1E45; + 963 : 1D7D; + 964 : 1CB5; + 965 : 1BEC; + 966 : 1B23; + 967 : 1A5A; + 968 : 1990; + 969 : 18C6; + 970 : 17FC; + 971 : 1732; + 972 : 1667; + 973 : 159C; + 974 : 14D1; + 975 : 1406; + 976 : 133A; + 977 : 126F; + 978 : 11A3; + 979 : 10D7; + 980 : 100B; + 981 : 0F3E; + 982 : 0E72; + 983 : 0DA5; + 984 : 0CD9; + 985 : 0C0C; + 986 : 0B3F; + 987 : 0A71; + 988 : 09A4; + 989 : 08D7; + 990 : 0809; + 991 : 073C; + 992 : 066E; + 993 : 05A1; + 994 : 04D3; + 995 : 0405; + 996 : 0337; + 997 : 026A; + 998 : 019C; + 999 : 00CE; +END; diff --git a/peripherals/spwm/tb_spwm.do b/peripherals/spwm/tb_spwm.do index 45eab3e1..61918cf1 100644 --- a/peripherals/spwm/tb_spwm.do +++ b/peripherals/spwm/tb_spwm.do @@ -160,7 +160,10 @@ add wave -label sine_freq -radix unsigned /spwm/sine_freq add wave -label sine_clkdiv_top_value -radix unsigned /spwm/sine_clkdiv_top_value add wave -label mod_freq -radix unsigned /spwm/mod_freq add wave -label mod_clkdiv_top_value -radix unsigned /spwm/mod_clkdiv_top_value -add wave -label spwm -radix binary /switching_sine +add wave -label spwm1 -radix binary /switching_sine1 +add wave -label spwm2 -radix binary /switching_sine2 +add wave -label spwm3 -radix binary /switching_sine3 +add wave -label spwm4 -radix binary /switching_sine4 add wave -label clk_sine -radix binary /spwm/clk_sine add wave -label sine_value -radix signed /spwm/sine_value add wave -label clk_mod -radix binary /spwm/clk_mod diff --git a/peripherals/spwm/tb_spwm.vhd b/peripherals/spwm/tb_spwm.vhd index 62b82866..d9e16e97 100644 --- a/peripherals/spwm/tb_spwm.vhd +++ b/peripherals/spwm/tb_spwm.vhd @@ -88,8 +88,18 @@ architecture RTL of coretestbench is signal ddata_r_lcd : std_logic_vector(31 downto 0); signal ddata_r_nn_accelerator : std_logic_vector(31 downto 0); signal ddata_r_fir_fil : std_logic_vector(31 downto 0); - - signal switching_sine : std_logic; + signal ddata_r_crc : std_logic_vector(31 downto 0); + signal ddata_r_key : std_logic_vector(31 downto 0); + signal ddata_r_accelerometer : std_logic_vector(31 downto 0); + + signal ifcap :std_logic; + + signal switching_sine1 : std_logic; + signal switching_sine2 : std_logic; + signal switching_sine3 : std_logic; + signal switching_sine4 : std_logic; + signal sel_modulation : std_logic; + begin @@ -104,7 +114,11 @@ begin port map( clock => clk_32x, reset => rst, - sine_pwm1 => switching_sine, + sel_modulation => sel_modulation, + sine_pwm1 => switching_sine1, + sine_pwm2 => switching_sine2, + sine_pwm3 => switching_sine3, + sine_pwm4 => switching_sine4, daddress => daddress, ddata_w => ddata_w, ddata_r => ddata_r_spwm, @@ -142,7 +156,8 @@ begin end process reset; -- Connect gpio data to output hardware - LEDR <= gpio_output(9 downto 0); + LEDR <= gpio_output(9 downto 0); + sel_modulation <= '0'; -- Connect input hardware to gpio data gpio_test: process @@ -231,10 +246,13 @@ begin ddata_r_dif_fil => ddata_r_dif_fil, ddata_r_spwm => ddata_r_spwm, ddata_r_stepmot => ddata_r_stepmot, - ddata_r_lcd => ddata_r_lcd, - ddata_r_nn_accelerator => ddata_r_nn_accelerator, - ddata_r_fir_fil => ddata_r_fir_fil, - ddata_r_periph => ddata_r_periph + ddata_r_lcd => ddata_r_lcd, + ddata_r_nn_accelerator => ddata_r_nn_accelerator, + ddata_r_fir_fil => ddata_r_fir_fil, + ddata_r_periph => ddata_r_periph, + ddata_r_crc => ddata_r_crc, + ddata_r_key => ddata_r_key, + ddata_r_accelerometer => ddata_r_accelerometer ); -- Softcore instatiation @@ -281,7 +299,8 @@ begin d_rd => d_rd, dcsel => dcsel, dmask => dmask, - timer_interrupt => timer_interrupt + timer_interrupt => timer_interrupt, + ifcap => ifcap ); -- Generic GPIO module instantiation diff --git a/software/spwm/Makefile b/software/spwm/Makefile index 51f9ef68..4f0d8f64 100644 --- a/software/spwm/Makefile +++ b/software/spwm/Makefile @@ -1,7 +1,7 @@ ifndef RISCV_TOOLS_PREFIX # RISCV_TOOLS_PREFIX = riscv-none-embed- # Para usar no LSC -RISCV_TOOLS_PREFIX = ~/opt/xPacks/@xpack-dev-tools/riscv-none-embed-gcc/10.2.0-1.2.1/.content/bin/riscv-none-embed- +RISCV_TOOLS_PREFIX = /var/data/aluno/riscv-multicycle-master/compiler/gcc/bin/riscv-none-embed- endif QUARTUS_DIR= ~/intelFPGA/quartus21.1/21.1/quartus/bin/ diff --git a/software/spwm/main_spwm.c b/software/spwm/main_spwm.c index a1b64848..1cb903b0 100644 --- a/software/spwm/main_spwm.c +++ b/software/spwm/main_spwm.c @@ -13,20 +13,18 @@ #include "../gpio/gpio.h" #include "spwm.h" -// SPWM Variables -uint32_t sine_frequency = 50; -uint32_t modulator_frequency = 1000; -uint32_t amplitude_ratio = 100; // % - void example_spwm(void){ - spwm_set_sine_frequency(sine_frequency); - spwm_set_amplitude_modulation_ratio(amplitude_ratio); - - spwm_set_modulator_frequency(modulator_frequency); + spwm_set_sine_frequency(50); + spwm_set_amplitude_modulation_ratio(100); + spwm_set_modulator_frequency(1000); } int main(void){ + // SPWM Variables + uint32_t sine_frequency = 50; + uint32_t modulator_frequency = 1000; + uint32_t amplitude_ratio = 100; // % example_spwm(); @@ -44,4 +42,4 @@ int main(void){ // delay_(10000); } return 0; -} \ No newline at end of file +}