20-01-2011, 11:11
|
|
|
חבר מתאריך: 20.01.11
הודעות: 3
|
|
עזרה ב-VHDL
שלום ,
כתבתי תוכנית ליצירת PWM ב-VHDL אבל במקום ישירות לחבר מנוע רשנתי תוכנית ל-"אורות רצים" כשר כול מצב של לחצן מדמה אחד ממצבי העבודה של המנוע.
צרבתי את התוכנית על לוח של DE2 וזה לא עבד אז רשמתי סימולציה ב-active hdl אבל אני לא רואה את צורות הגלים ... מה עשיתי לא נכון?
Tאני עובד עם Quartus סיקלון 2 עם זה חשוב
זה הקוד של ה-Quartus
library IEEE
קוד:
;
use IEEE.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
Entity Pwm is
Port ( Rst : In std_logic;
Clk : In std_logic;
Sw : In std_logic_vector (2 downto 0);
Enable : in std_logic;
Led : out std_logic_vector (7 downto 0);
Pwm : Out std_logic);
attribute altera_chip_pin_lc: string;
attribute altera_chip_pin_lc of Clk : signal is "@N2";
attribute altera_chip_pin_lc of Rst : signal is "@G26";
attribute altera_chip_pin_lc of Led : signal is "@AE23, @AF23, @AB21, @AC22, @AD22, @AD23, @AD21, @AC21";
attribute altera_chip_pin_lc of Sw : signal is "@N25,@N26, @P25";
attribute altera_chip_pin_lc of Enable: signal is "@P26";
end entity Pwm;
Architecture arc_Pwm of Pwm is
signal Counter : std_logic_vector (16 downto 0);
signal DC : std_logic_vector (16 downto 0);
signal Rd_led : std_logic_vector (7 downto 0);
begin
PwmReg: process (Clk,Rst,Sw)
begin
if (Rst='1') then
Counter <= (others=>'0');
Pwm <='0';
Led <= (others=>'0');
Rd_led <= (others=>'0');
DC <= conv_std_logic_vector(32678,17); --duty cycle 50%
elsif rising_edge(Clk) then
if (Enable='1') then
if (Counter = 50000) then
Counter <= (others => '0');
if (Sw(0) = '1') and (Sw(1) = '0') and (Sw(2) = '0') then
if(Rd_led = "11111111") then
Rd_led <= (others=>'0');
else
Rd_led <= Rd_led + 1;
end if;
elsif (Sw(0) = '0') and (Sw(1) = '1') and (Sw(2) = '0') then
if(Rd_led = "00000000") then
Led <= (others=>'1');
else
Rd_led <= Rd_led - 1;
end if;
Led <= Rd_led;
end if;
elsif (Counter < DC) then
Counter <= Counter + 1;
Pwm <= '1';
else
Counter <= Counter + 1;
Pwm <= '0';
end if;
else
Pwm <= '0';
end if;
end if;
end process PwmReg;
end architecture arc_Pwm;
זה הסימולציה ב-active hdl
קוד:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
use ieee.std_logic_unsigned.all;
--use std.textio.all;
--use ieee.std_logic_textio.all;
------------------------------------------------------------------------------
entity tb_pwm is
end entity tb_pwm;
------------------------------------------------------------------------------
architecture arc_tb_pwm of tb_pwm is
signal Clk : std_logic := '0'; -- [in]
signal Rst : std_logic := '0'; -- [in]
signal Sw : std_logic_vector (2 downto 0):= "000"; -- [in]
signal Enable : std_logic := '0'; -- [in]
signal Pwm : std_logic; -- [out]
signal Led : std_logic_vector(7 downto 0); -- [out]
begin
test : entity work.pwm
port map (
Clk => Clk,
Rst => Rst,
Enable => Enable,
Sw => Sw,
Pwm => Pwm,
Led => Led );
Clk <= not Clk after 10 ns;
Rst <= '1' after 20 ns;
process
begin
wait until Rst = '1';
wait until rising_edge(Clk);
Enable <= '1';
wait until rising_edge(clk);
Sw(0) <= '1';
Sw(1) <= '0';
Sw(2) <= '0';
wait for 100ms;
wait until rising_edge(clk);
Sw(0) <= '0';
Sw(1) <= '1';
Sw(2) <= '0';
wait for 100ms;
wait until rising_edge(clk);
Sw(0) <= '0';
Sw(1) <= '0';
Sw(2) <= '1';
wait for 100ms;
wait until rising_edge(clk);
Enable <= '0';
wait for 100ms;
wait until rising_edge(clk);
Rst <='0';
wait for 100ms;
end process;
end architecture arc_tb_pwm;
אין לי שגיאות סינטקס אבל אני די חדש בשפה כך שבטח שיש טעויות עקרוניות שאני פשוט לא חשבתי עליהם
בתודה מראש
|