Генерация ШИМ с использованием FPGA
Как сгенерировать сигнал ШИМ с использованием ПЛИС? Каков наилучший метод для генерации переменного рабочего цикла?
Я попытался решить эту проблему с помощью следующего кода, но произошли две или три ошибки.
Это мой код:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
use ieee.numeric_std.all;
--use ieee.float_pkg.all;
---- Uncomment the following library declaration if instantiating
---- any Xilinx primitives in this code.
--library UNISIM;
--use UNISIM.VComponents.all;
entity pwm_sne is
Generic(
sys_clk :integer :=50000000;
pwm_freq :integer :=100000;
bits_resolution :integer :=8
);
Port (
clk : in STD_LOGIC;
rst : in STD_LOGIC;
k : in STD_LOGIC_VECTOR (7 downto 0);
y : out STD_LOGIC
);
end pwm_sne;
architecture Behavioral of pwm_sne is
signal cnt :std_logic_vector(7 downto 0);
signal flag :std_logic;
signal reg :std_logic_vector(7 downto 0);
--variable duty :std_logic:=0;
begin
process(clk,rst)
begin
if rst='1' then
cnt<="00000000";
elsif(clk'event and clk='1')then
cnt<=cnt+"00000001";
elsif cnt="11111111" then
flag<='0';
cnt<="00000000";
end if;
end process;
process(clk,flag)
begin
if(clk'event and clk='1') then
reg<=k;
end if;
end process;
process(cnt,reg)
begin
if(flag='0')then
elsif cnt>reg then
y<=(reg/256)*100;
--y<=duty;
elsif cnt=reg then
y<=(reg/256)*100;
elsif cnt<=reg then
y<=period;
--y<=duty;
end if;
end process;
end Behavioral;
Произошли ошибки в выходном значении y
и на операции подразделения.
Пожалуйста, предложите хороший метод для решения проблем сверху.
1 ответ
Решение: делать математику с числами, а не с нетипизированными пакетами с битами.
Если cnt, reg,k
мы natural range 0 to 255
и вы сравнили cnt
с 0 или 255 и добавлением 1 к нему, это будет просто работать. И если k
ДОЛЖЕН быть std_logic_vector, использовать ОДНУ функцию преобразования типа между ним и reg
,
Также рекомендуется: удалить нестандартный std_logic_arith and
std_logic_unsignedlibs and use
вместо numeric_std`