Генерация ШИМ с использованием 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 andstd_logic_unsignedlibs and useвместо numeric_std`

Другие вопросы по тегам