- LIBRARY ieee;
- USE ieee.std_logic_1164.all;
- LIBRARY altera_mf;
- USE altera_mf.all;
- ENTITY sanjiaobo IS
- PORT
- (
- address : IN STD_LOGIC_VECTOR (5 DOWNTO 0);
- clock : IN STD_LOGIC := '1';
- q : OUT STD_LOGIC_VECTOR (7 DOWNTO 0)
- );
- END sanjiaobo;
- ARCHITECTURE SYN OF sanjiaobo IS
- SIGNAL sub_wire0 : STD_LOGIC_VECTOR (7 DOWNTO 0);
- COMPONENT altsyncram
- GENERIC (
- clock_enable_input_a : STRING;
- clock_enable_output_a : STRING;
- init_file : STRING;
- intended_device_family : STRING;
- lpm_hint : STRING;
- lpm_type : STRING;
- numwords_a : NATURAL;
- operation_mode : STRING;
- outdata_aclr_a : STRING;
- outdata_reg_a : STRING;
- widthad_a : NATURAL;
- width_a : NATURAL;
- width_byteena_a : NATURAL
- );
- PORT (
- address_a : IN STD_LOGIC_VECTOR (5 DOWNTO 0);
- clock0 : IN STD_LOGIC ;
- q_a : OUT STD_LOGIC_VECTOR (7 DOWNTO 0)
- );
- END COMPONENT;
- BEGIN
- q <= sub_wire0(7 DOWNTO 0);
- altsyncram_component : altsyncram
- GENERIC MAP (
- clock_enable_input_a => "BYPASS",
- clock_enable_output_a => "BYPASS",
- init_file => "sanjiaobo.mif",
- intended_device_family => "Cyclone II",
- lpm_hint => "ENABLE_RUNTIME_MOD=NO",
- lpm_type => "altsyncram",
- numwords_a => 64,
- operation_mode => "ROM",
- outdata_aclr_a => "NONE",
- outdata_reg_a => "CLOCK0",
- widthad_a => 6,
- width_a => 8,
- width_byteena_a => 1
- )
- PORT MAP (
- address_a => address,
- clock0 => clock,
- q_a => sub_wire0
- );
- END SYN;
三角波ROM元件建好后,我们需要的就是同步把正弦波和三角波中的ROM数据读出来,比较他们,根据比较结果即可生成spwm。修改一下(二)中的数据即可获得下面程序:
- LIBRARY IEEE;
- USE IEEE.STD_LOGIC_1164.ALL;
- USE IEEE.STD_LOGIC_UNSIGNED.ALL;
- ENTITY spwm IS
- PORT(sysclk :IN STD_LOGIC;
- pwm_output :OUT STD_LOGIC;
- spwm_output :OUT STD_LOGIC);
- END ENTITY spwm;
- ARCHITECTURE rlt OF spwm IS
- COMPONENT sin_512 IS --声明ROM元件
- PORT
- (
- address : IN STD_LOGIC_VECTOR (8 DOWNTO 0); --ROM地址信号
- clock : IN STD_LOGIC := '1'; --时钟信号
- q : OUT STD_LOGIC_VECTOR (7 DOWNTO 0) ---输出信号
- );
- END COMPONENT;
- COMPONENT sanjiaobo IS
- PORT
- (
- address : IN STD_LOGIC_VECTOR (5 DOWNTO 0);
- clock : IN STD_LOGIC := '1';
- q : OUT STD_LOGIC_VECTOR (7 DOWNTO 0)
- );
- END COMPONENT;
- SIGNAL counter :INTEGER RANGE 0 TO 256; --用于计数
- SIGNAL sin_addr :STD_LOGIC_VECTOR (8 DOWNTO 0) ; --sin ROM地址
- SIGNAL sin_rom_data :STD_LOGIC_VECTOR (7 DOWNTO 0) ; --sin ROM数据
- SIGNAL san_addr :STD_LOGIC_VECTOR (5 DOWNTO 0) ; --三角波ROM地址
- SIGNAL san_rom_data :STD_LOGIC_VECTOR (7 DOWNTO 0) ; --三角波ROM数据
- BEGIN
- u1: sanjiaobo PORT MAP(san_addr, sysclk, san_rom_data);
- u2: sin_512 PORT MAP(sin_addr, sysclk, sin_rom_data); --实例化ROM元件
- PROCESS(sysclk) IS
-
- BEGIN
- IF(sysclk'EVENT AND sysclk = '1') THEN
- counter <= counter + 1;
- IF(counter = 256) THEN
- counter <= 0;
- sin_addr <= sin_addr + 1; -- 比较完256个数据后sin ROM地址加1
- san_addr <= san_addr + 1; -- 三角波ROM地址跟随sin ROM地址变化
- END IF;
- IF(sin_rom_data > counter)THEN --输出sin
- pwm_output <= '1';
- ELSE
- pwm_output <= '0';
- END IF;
- IF(sin_rom_data > san_rom_data)THEN --输出spwm
- spwm_output <= '1';
- ELSE
- spwm_output <= '0';
- END IF;
- END IF;
- END PROCESS;
- END ARCHITECTURE;
到此为止,课程的基本内容已经完成,编程思路有千万种,我的程序只是供大家参考,请勿直接套用,大家有什么问题欢迎回帖提问,我会尽快回答。