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.
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.
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
Log in with Google account
No account? Register here.