EmbDev.net

Forum: FPGA, VHDL & Verilog VHDL - 10% duty cycle


von Sen93 (Guest)


Attached files:

Rate this post
useful
not useful
Hello, I'm new to VHDL. I need to generate 500Hz from 50MHz clock 
frequency. I already got it. My problem here is how should the code to 
be adjusted if I want to change the duty cycle to 10%, 30%, and 50%?

Thank you.

von Chris (Guest)


Rate this post
useful
not useful
You should reformat your code. You cannot read which "else" belongs to 
which "if".
I don't kniwnif its even possible to add 1 to a std_logic_vector.
What you need, are 2 values. One for counting up and one for down. 
Typically you set a flag if you are counting up or not.

von Lothar M. (Company: Titel) (lkmiller) (Moderator)


Rate this post
useful
not useful
Chris wrote:
> What you need, are 2 values. One for counting up and one for down.
Indeed 2 values are needed.
But only 1 for a counter, and the second for a compare value to toggle 
the output. Then its stupidly easy:
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.numeric_std.ALL;
4
5
entity PWM500Hz is
6
    port( clock   : in STD_LOGIC; -- 50 Mhz
7
          pwmout  : out STD_LOGIC);
8
end PWM500Hz ;
9
10
architecture Behavioral of PWM500Hz is
11
  signal cnt: integer range 0 to (50000000/500)-1 := 0;
12
  constant cmp: integer := (50000000/5000); -- PWM = 10%
13
begin
14
15
  process(clock) begin
16
    if rising_edge(clock) then
17
      if cnt<(50000000/500)-1 then cnt<=cnt+1;
18
      else cnt<=0;
19
      end if;
20
    end if;
21
  end process;
22
  
23
  pwmout <= '1' when cnt<cmp else '0';
24
end Behavioral;

Please log in before posting. Registration is free and takes only a minute.
Existing account
Do you have a Google/GoogleMail account? No registration required!
Log in with Google account
No account? Register here.