EmbDev.net

Forum: FPGA, VHDL & Verilog HELP call VHDL code to other VHDL code


Du wurdest von Mikrocontroller.net auf diese Seite weitergeleitet. Zurück zu Mikrocontroller.net
von Vicky V. (viduka)


Rate this post
useful
not useful
Hi.. i need help to call 1 VHDL code to other VHDL code..

i have 2 VHDL code (Rotary_switch and buzzer).. that program work well 
and i can run it at FPGA.. and now i need to call buzzer.vhdl at 
rotary.vhdl. but i dont know how to do that..

this is my vhdl code for rotary_switch
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.STD_LOGIC_ARITH.ALL;
4
use IEEE.STD_LOGIC_UNSIGNED.ALL;
5
6
-- Uncomment the following library declaration if using
7
-- arithmetic functions with Signed or Unsigned values
8
--use IEEE.NUMERIC_STD.ALL;
9
10
-- Uncomment the following library declaration if instantiating
11
-- any Xilinx primitives in this code.
12
--library UNISIM;
13
--use UNISIM.VComponents.all;
14
15
entity main is
16
port(  clk: in STD_LOGIC;
17
    rot_a: in STD_LOGIC;
18
    rot_b : in STD_LOGIC;
19
    rot_center : in STD_LOGIC;
20
    J4 : out  STD_LOGIC;
21
    led : out STD_LOGIC_VECTOR (7 downto 0):="00000000");
22
end main;
23
24
architecture Behavioral of main is
25
26
signal rotary_a_in: std_logic;
27
signal rotary_b_in: std_logic;
28
signal rotary_q1: std_logic;
29
signal rotary_q2: std_logic;
30
signal rotary_in: std_logic_vector(1 downto 0);
31
signal rotary_event: std_logic;
32
signal rotary_left:std_logic;
33
signal delay_rotary_q1:std_logic;
34
signal center_flag:std_logic;
35
36
begin
37
38
rotary_a_in <= rot_a;
39
rotary_b_in <= rot_b;
40
41
rotary_filter: process(clk)
42
begin
43
if clk'event and clk='1' then
44
rotary_in <= rotary_b_in & rotary_a_in;
45
46
case rotary_in is
47
when "00" => rotary_q1 <= '0';
48
rotary_q2 <= rotary_q2;
49
when "01" => rotary_q1 <= rotary_q1;
50
rotary_q2 <= '0';
51
when "10" => rotary_q1 <= rotary_q1;
52
rotary_q2 <= '1';
53
when "11" => rotary_q1 <= '1';
54
rotary_q2 <= rotary_q2;
55
when others => rotary_q1 <= rotary_q1;
56
rotary_q2 <= rotary_q2;
57
end case;
58
end if;
59
end process rotary_filter;
60
61
direction: process(clk)
62
begin
63
if clk'event and clk='1' then
64
65
delay_rotary_q1 <= rotary_q1;
66
if rotary_q1='1' and delay_rotary_q1='0' then
67
rotary_event <= '1';
68
rotary_left <= rotary_q2;
69
else
70
rotary_event <= '0';
71
rotary_left <= rotary_left;
72
end if;
73
end if;
74
end process direction;
75
76
led_switch: process(clk,rotary_event,rotary_left)
77
78
variable i : integer:=8;
79
variable index : integer;
80
begin
81
if clk'event and clk='1' then
82
if rotary_event='1' and rotary_left='0' then --left
83
index :=i mod 8;
84
led(index)<='1';
85
if index=3 then
86
J4<='1';
87
--I WANT CALL MY BUZZER.VHDL IN HERE. SO ITS MEAN WHEN INDEX=3 I WANT MY BUZZER ON..
88
end if;
89
i:=i+1;
90
if i=8 then
91
i:=7;
92
end if;
93
end if;
94
if rotary_event='1' and rotary_left='1' then --right
95
if i=8 then
96
i:=7;
97
end if;
98
index :=i mod 8;
99
led(index)<='0';
100
i:=i-1;
101
if index=3 then
102
J4<='0';
103
end if;
104
if i=0 then
105
i:=1;
106
led(0)<='1';
107
end if;
108
end if;
109
end if;
110
end process led_switch;
111
112
process(rot_center)
113
begin
114
if (rot_center='1') then
115
center_flag<='1';
116
elsif (rot_center='0') then
117
center_flag<='0';
118
end if;
119
end process;
120
121
end Behavioral;

this is my vhdl code for buzzer
1
library IEEE;
2
use IEEE.STD_LOGIC_1164.ALL;
3
use IEEE.STD_LOGIC_ARITH.ALL;
4
use IEEE.STD_LOGIC_UNSIGNED.ALL;
5
6
ENTITY buzzer IS
7
   PORT (
8
      clk  : IN std_logic;   
9
      rst  : IN std_logic;   
10
      out_bit  : OUT std_logic);   
11
END buzzer;
12
13
ARCHITECTURE arch OF buzzer IS
14
15
16
   SIGNAL clk_div1   :  std_logic_vector(3 DOWNTO 0);  
17
   SIGNAL clk_div2   :  std_logic_vector(12 DOWNTO 0); 
18
   SIGNAL cnt        :  std_logic_vector(21 DOWNTO 0);  
19
   SIGNAL state      :  std_logic_vector(2 DOWNTO 0); 
20
   CONSTANT  duo   :  std_logic_vector(12 DOWNTO 0) :="0111011101110";     
21
   CONSTANT  lai  :  std_logic_vector(12 DOWNTO 0) := "0110101001101";    
22
   CONSTANT  mi   :  std_logic_vector(12 DOWNTO 0) := "0101111011010";    
23
   CONSTANT  fa    :  std_logic_vector(12 DOWNTO 0) := "0101100110001";    
24
   CONSTANT  suo   :  std_logic_vector(12 DOWNTO 0) := "0100111110111";    
25
   CONSTANT  la    :  std_logic_vector(12 DOWNTO 0) := "0100011100001";    
26
   CONSTANT  xi    :  std_logic_vector(12 DOWNTO 0) := "0011111101000";    
27
   CONSTANT  duo1   :  std_logic_vector(12 DOWNTO 0) := "0011101110111";   
28
   SIGNAL out_bit_tmp :std_logic; 
29
30
BEGIN
31
   out_bit<=out_bit_tmp;
32
   PROCESS(clk,rst)
33
   BEGIN
34
       IF (NOT rst = '1') THEN
35
         clk_div1 <= "0000";    
36
      ELSif(clk'event and clk='1')then
37
         IF (clk_div1 /= "1100") THEN
38
            clk_div1 <= clk_div1 + "0001";    
39
         ELSE
40
            clk_div1 <= "0000";    
41
         END IF;
42
      END IF;
43
   END PROCESS;
44
45
   PROCESS(clk,rst)
46
   BEGIN
47
    
48
      IF (NOT rst = '1') THEN
49
         clk_div2 <= "0000000000000";    
50
         state <= "000";    
51
         cnt <= "0000000000000000000000";    
52
         out_bit_tmp <= '0';    
53
      ELSif(clk'event and clk='1')then
54
         IF (clk_div1 = "1001") THEN
55
            CASE state IS
56
               WHEN "000" =>
57
                        cnt <= cnt + "0000000000000000000001";    
58
                        IF (cnt = "1111111111111111111111") THEN
59
                           state <= "001";    
60
                        END IF;
61
                        IF (clk_div2 /= duo) THEN
62
                           clk_div2 <= clk_div2 + "0000000000001";    
63
                        ELSE
64
                           clk_div2 <= "0000000000000";    
65
                           out_bit_tmp <= NOT out_bit_tmp;    
66
                        END IF;
67
               WHEN "001" =>  
68
                        cnt <= cnt + "0000000000000000000001";    
69
                        IF (cnt = "1111111111111111111111") THEN
70
                           state <= "010";    
71
                        END IF;
72
                        IF (clk_div2 /=lai) THEN
73
                           clk_div2 <= clk_div2 + "0000000000001";    
74
                        ELSE
75
                           clk_div2 <= "0000000000000";    
76
                           out_bit_tmp <= NOT out_bit_tmp;    
77
                        END IF;
78
               WHEN "010" => 
79
                        cnt <= cnt + "0000000000000000000001";    
80
                        IF (cnt = "1111111111111111111111") THEN
81
                           state <= "011";    
82
                        END IF;
83
                        IF (clk_div2 /=mi) THEN
84
                           clk_div2 <= clk_div2 + "0000000000001";    
85
                        ELSE
86
                           clk_div2 <= "0000000000000";    
87
                           out_bit_tmp <= NOT out_bit_tmp;    
88
                        END IF;
89
               WHEN "011" =>  
90
                        cnt <= cnt + "0000000000000000000001";    
91
                        IF (cnt = "1111111111111111111111") THEN
92
                           state <= "100";    
93
                        END IF;
94
                        IF (clk_div2 /=fa) THEN
95
                           clk_div2 <= clk_div2 + "0000000000001";    
96
                        ELSE
97
                           clk_div2 <= "0000000000000";    
98
                           out_bit_tmp <= NOT out_bit_tmp;    
99
                        END IF;
100
               WHEN "100" =>   
101
                        cnt <= cnt + "0000000000000000000001";    
102
                        IF (cnt = "1111111111111111111111") THEN
103
                           state <= "101";    
104
                        END IF;
105
                        IF (clk_div2 /=suo) THEN
106
                           clk_div2 <= clk_div2 + "0000000000001";    
107
                        ELSE
108
                           clk_div2 <= "0000000000000";    
109
                           out_bit_tmp <= NOT out_bit_tmp;    
110
                        END IF;
111
               WHEN "101" => 
112
                        cnt <= cnt + "0000000000000000000001";    
113
                        IF (cnt = "1111111111111111111111") THEN
114
                           state <= "110";    
115
                        END IF;
116
                        IF (clk_div2 /= la) THEN
117
                           clk_div2 <= clk_div2 + "0000000000001";    
118
                        ELSE
119
                           clk_div2 <= "0000000000000";    
120
                           out_bit_tmp <= NOT out_bit_tmp;    
121
                        END IF;
122
               WHEN "110" => 
123
                        cnt <= cnt + "0000000000000000000001";    
124
                        IF (cnt = "1111111111111111111111") THEN
125
                           state <= "111";    
126
                        END IF;
127
                        IF (clk_div2 /= xi) THEN
128
                           clk_div2 <= clk_div2 + "0000000000001";    
129
                        ELSE
130
                           clk_div2 <= "0000000000000";    
131
                           out_bit_tmp <= NOT out_bit_tmp;    
132
                        END IF;
133
               WHEN "111" => 
134
                        cnt <= cnt + "0000000000000000000001";    
135
                        IF (cnt = "1111111111111111111111") THEN
136
                           state <= "000";    
137
                        END IF;
138
                        IF (clk_div2 /= duo1) THEN
139
                           clk_div2 <= clk_div2 + "0000000000001";    
140
                        ELSE
141
                           clk_div2 <= "0000000000000";    
142
                           out_bit_tmp <= NOT out_bit_tmp;    
143
                        END IF;
144
               WHEN OTHERS =>
145
                        NULL;
146
               
147
            END CASE;
148
         END IF;
149
      END IF;
150
   END PROCESS;
151
152
END arch;

anyone can help me to do it.. or explain it how to call buzzer.vhdl at 
my rotary switch when i need to turn on my buzzer.
1
if index=3 then
2
J4<='1';
3
--I WANT CALL MY BUZZER.VHDL IN HERE. SO ITS MEAN WHEN INDEX=3 I WANT MY BUZZER ON..
4
end if;

I'm sorry if my english not good.

von lkmiller (Guest)


Rate this post
useful
not useful
> and now i need to call buzzer.vhdl at rotary.vhdl
With VHDL you are not programming a piece of software, where one 
module calls another. You are doing a hardware description, and so you 
must describe a wiring inside a chip (CPLD/FPGA). And therfore you do 
not call another module, but you instantiate a component and connect it 
to your top level module.
This task is a very common, and so you can find the procedure easily in 
any VHDL book.

> this is my vhdl code for rotary_switch
I don't want to read a VHDL decription formatted in such a bad manner. 
But in there you must do something like that:
1
architecture Behavioral of main is
2
3
signal rotary_a_in: std_logic;
4
signal rotary_b_in: std_logic;
5
signal rotary_q1: std_logic;
6
signal rotary_q2: std_logic;
7
signal rotary_in: std_logic_vector(1 downto 0);
8
signal rotary_event: std_logic;
9
signal rotary_left:std_logic;
10
signal delay_rotary_q1:std_logic;
11
signal center_flag:std_logic;
12
13
component buzzer IS
14
   PORT (
15
      clk  : IN std_logic;   
16
      rst  : IN std_logic;   
17
      out_bit  : OUT std_logic);   
18
END component;
19
20
begin
21
22
buzz : buzzer 
23
      PORT MAP ( clk  => clk, rst => rst, out_bit => buzzer_pin);   
24
END component;
25
26
rotary_a_in <= rot_a;
27
rotary_b_in <= rot_b;

But as far i can see, the buzzer code is doing something very stupid in 
a very difficult way...

> or explain it how to call buzzer.vhdl at
> my rotary switch when i need to turn on my buzzer.
You do not call the code, but you can set a signal to enable buzzing. 
And then the buzzer will buzz as long as the enable signal is active.

BTW:
>              cnt <= cnt + "0000000000000000000001";
>              IF (cnt = "1111111111111111111111") THEN
I would do this so:
>              cnt <= cnt + '1';
>              IF (cnt = (others=>'1') THEN
Thats much easier to read.

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.