pwm modulation/demodulation

OP #2968684
Rate this post
• ▲ useful
▼ not useful
hi everyone. I need help about vhdl code of spartan3e.
i wanna communicate two FBGAs. For example, i am using rotary switch to 
produce pwm(it arranges my duty cycles. and i produce my pwm from my 1st 
FBGA and use it 2nd FBGA. i tried but it didnt happened.
please help me ??

my codes is:
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.STD_LOGIC_UNSIGNED.ALL;
4

5
entity rotaryEncoder is
6
Port ( 
7
      clk  : in    STD_LOGIC; -- C9
8
      RotA : in    STD_LOGIC; -- K18 PULLUP
9
      RotB : in    STD_LOGIC; -- G18 PULLUP
10
      data : inout STD_LOGIC_VECTOR(7 DOWNTO 0); -- E12
11
      leds : inout STD_LOGIC_VECTOR(7 DOWNTO 0);
12
      sout : inout std_logic;
13
      sin  : in std_logic);
14
 end rotaryEncoder;
15

16
 architecture rotaryEncoder of rotaryEncoder is
17
 signal sta       : STD_LOGIC_VECTOR(1 downto 0);
18
 signal prr       : STD_LOGIC_vector(1 downto 0);
19
 signal rotary_in : STD_LOGIC_vector(1 downto 0);
20
 signal RotA1     : STD_LOGIC;
21
 signal RotB1     : STD_LOGIC;
22
 signal s1        :std_logic;
23
 signal s2        :std_logic;
24
 signal s3        :std_logic;
25
 signal s4        :std_logic;
26
 signal s5        :std_logic_vector(3 downto 0);
27
 signal s6        :std_logic;
28
 signal s7        :std_logic_vector(1 downto 0);
29
 signal cmp        :std_logic_vector(3 downto 0);
30
 signal xcount3   : std_logic_vector(7 downto 0);
31
 signal xcount1   : std_logic_vector(8 downto 0);
32
 signal reg       :std_logic_vector(7 downto 0);
33
 
34
 begin
35
 rotary_filter: 
36
 process(clk)    
37
  begin                   
38
    if clk'event and clk='1' then  
39
    rotary_in <= RotA & RotB;      
40
        case rotary_in is  
41

42
          when "00" => RotA1 <= '0';     RotB1 <= RotB1;   
43
          when "01" => RotA1 <= RotA1;   RotB1 <= '0';      
44
          when "10" => RotA1 <= RotA1;   RotB1 <= '1';     
45
          when "11" => RotA1 <= '1';     RotB1 <= RotB1;   
46
          when others => RotA1 <= RotA1; RotB1 <= RotB1;                
47
        end case;                    
48
    end if;                        
49
 end process rotary_filter;     
50

51
 direction:
52
  process(clk) is begin
53
      if(rising_edge(clk)) then
54
        case sta & RotA1 & RotB1 is
55
    when "0001" => prr <= "01"; sta <="01"; -- 01 turn right
56
          when "0010" => prr <= "00"; sta <="10"; -- 00 turn left
57
    when "0111" => prr <= "01"; sta <="11"; -- 10 null
58
    when "0100" => prr <= "00"; sta <="00";
59
    when "1000" => prr <= "10"; sta <="00";
60
    when "1011" => prr <= "10"; sta <="11";
61
    when "1110" => prr <= "10"; sta <="10";
62
    when "1101" => prr <= "10"; sta <="01";
63
    when others => null;
64
        end case;
65
          if(prr="00") then
66
            data<=data+1; prr<="10";
67
          elsif(prr="01") then
68
            data<=data-1; prr<="10";
69
          else
70
            null;
71
          end if;
72
       end if;
73
   end process;
74

75
  TRNS:process(clk) is begin 
76
    if clk'event and clk='1' then
77
      
78
        if(xcount1<="000000000") then
79
        sout<='1';
80
        elsif(xcount1="000000001") then
81
        sout<='1';
82
        elsif(xcount1="000000010") then
83
        sout<='0';
84
        elsif(xcount1="000000011") then
85
        sout<='0';
86

87
        elsif((xcount1<=data)and(xcount1>"000000011")) then
88
            sout<='1';
89
        elsif(xcount1<="100000011") then
90
          sout<='0';
91
        elsif(xcount1="100000011") then
92
        xcount1<="000000000";  
93
        end if;
94
    xcount1<= xcount1 + 1;
95
    end if;
96
 end process;
97
 
98
 RCV:process(clk,sin,s1,s2,s3,s4,s5,s6,s7)is begin
99
       if(rising_edge(clk)) then
100
        
101
          s1<=sin;
102
         s2<=s1;
103
         s3<=s2;
104
         s4<=s3;
105
          s5<=s1&s2&s3&s4;
106
          s7<=s6&sin;
107
         if(s5="0011") then
108
        s6<='1';
109
        end if;
110
        if(s7="11") then
111
        
112
            leds<=leds;
113
            reg<=xcount3;
114
        else
115
            leds<=reg-3;
116
        end if;
117
        xcount3<= xcount3 + 1;
118
        
119
        if(xcount3="11111111") then
120
          xcount3<="00000000";
121
        end if;
122
         if(reg="11111111") then
123
         reg<="00000000";
124
         end if;
125
      end if;
126
    end process;
127
 end rotaryEncoder;
Guest #3112872
Rate this post
• ▲ useful
▼ not useful
I am again surprised, how complex a AB-decoding can be done. I never 
learned about that and therefor was very new to it, when I had to do it 
the first time. What I am doing:

I sample the incoming value with a frequency which is low enough, that 
bouncing has no effect anymore and decide, if the value changed. When it 
inreased or had an overrun, I am adding 1 to my result, in the other 
case i substracted one. Allways worked sufficiently.

Reply

Note: the original post is older than 6 months. Please don't ask any new questions in this thread, but start a new one.

Formatting
  • [c]C-Code[/c]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]code in other languages, ASCII drawings[/code]
  • [math]formula (LaTeX syntax)[/math]
  • [[Title]] – link to an article
  • Link to another post: right-click its post ID (#8078628), copy the address, paste it into the text

More about formatting

Post long source code as an attachment, not in the text.

Already registered? Log in

Not shown to anyone. We send you a link; your post appears once you confirm it there.

By submitting you create a free account and accept the terms of use.