|
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
aly Član
Pridružen-a: Tor 28 Sep 2004 14:51 Prispevkov: 9407 Aktiv.: 42.06 Kraj: Kranj - struževo
|
Objavljeno: Pet Jun 03, 2011 10:22 pm Naslov sporočila: Serijska komunikacija v VHDL |
|
|
gregzy87 je napisal/a: |
Lep pozdrav!
Priznam, za fax se matram z nekim "projektom", ki ga moram narediti. Pa mi ne gre najbolje. Če bi lahko tukaj rešila, bi bil zelo hvaležen.
Gre za RS232 komunikacijo. Tipka T0 pošlje ascii znak 0 v 8 bitni obliki, tipka T1 pa ascii znak 1. Zraven je še start in stop bit.
Torej zadeva mora na 1 bitnem izhodu pošiljati bit za bitom.
Vem, tukaj bi rabil "hendlat" z pomikalnim registrom a se ne spomnim kako točno smo mi to takrat delali . Mogoče bi šlo še kako drugače?
Spodaj sem že sam nekaj napisal za eno tipko in mislim da je to skoraj že to, nisem pa siguren. Poleg tega ne vem kako sedaj še za drugo tipko rešiti. Še en process s case stavkom? Ampak potem bo najmanj 1 signal v dveh processih, to pa ni dobro.
Skratka, kakšnih nasvetov in pomoči se nebi branil.
Hvala,
LP
Koda: |
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
-- Uncomment the following lines to use the declarations that are
-- provided for instantiating Xilinx primitive components.
--library UNISIM;
--use UNISIM.VComponents.all;
entity RS232komun is
Port ( t0 : in std_logic;
--t1 : in std_logic;
clk : in std_logic;
izhod : out std_logic);
end RS232komun;
architecture Behavioral of RS232komun is
---------- notranji signali -----------------------------------------------------------------
signal delilnik: std_logic_vector (3 downto 0):="0000";
--signal korak: std_logic:='0';
signal ascii: std_logic;
--signal izhod1: std_logic;
begin
-- deljenje vhodne ure na 38,4 kHz ----------------------------------------------------------
deljenje: process (clk)
begin
if rising_edge(clk) then delilnik <= delilnik + 1;
--if delilnik = "0100" then korak <= '1'; -- ko pride do 26
--delilnik <= "0000";
--else korak <= '0';
--end if;
end if;
end process;
-- pošiljanje podatkov po RS232 protokolu ---------------------------------------------------
process(T0, ascii, delilnik)
begin
--if rising_edge(korak) then
if T0 = '0' then ascii <= '1';
else
case delilnik (3 downto 0) is
when "0000" => ascii <= '0'; -- start bit
when "0001" => ascii <= '0'; -- 1 p
when "0010" => ascii <= '0'; -- 2 o
when "0011" => ascii <= '0'; -- 3 d
when "0100" => ascii <= '0'; -- 4 a
when "0101" => ascii <= '1'; -- 5 t
when "0110" => ascii <= '1'; -- 6 k
when "0111" => ascii <= '0'; -- 7 i
when "1000" => ascii <= '0'; -- 8 i
when "1001" => ascii <= '1'; -- stop bit
when others => ascii <= '1'; -- ni podatka
end case;
--end if;
end if;
end process;
izhod <= ascii;
end Behavioral;
|
|
_________________ I'm going to stand outside, so if anyone asks, I'm outstanding |
|
Nazaj na vrh |
|
|
aly Član
Pridružen-a: Tor 28 Sep 2004 14:51 Prispevkov: 9407 Aktiv.: 42.06 Kraj: Kranj - struževo
|
Objavljeno: Pet Jun 03, 2011 10:28 pm Naslov sporočila: |
|
|
Znak se pošilja ven s shift registrom in ne s case stavkom
Če ga ne znaš napisati, si potegni dol skripto na spletnih straneh FE ali najdi na netu. Jaz sem ga našel v 3 sekundah.
reg <= reg(9 downto 1) & 0;
Najlažje bo, če si narediš en blok, ki na zahtevo pošlje podatek.
Torej ima vhode Start in Data in izhode Serial_out in Finish.
V glavnem delu pa narediš avtomat, ki ob pritisnjeni tipki postavi ustrezen znak na Data vodilo, sproži Start in čaka na Finish signal in gre spet na čakanje tipke.
Sicer lahko tisti ubogi shift register za pošiljanje implementiraš kar v enem stanju avtomata. Seveda rabiš še en števec bitov pri pošiljanju. _________________ I'm going to stand outside, so if anyone asks, I'm outstanding |
|
Nazaj na vrh |
|
|
gregzy87 Član
Pridružen-a: Čet 08 Feb 2007 2:48 Prispevkov: 741 Aktiv.: 3.53 Kraj: Okolica Vrhnike
|
Objavljeno: Pet Jun 03, 2011 11:06 pm Naslov sporočila: |
|
|
Torej bo treba res z avtomatom rešiti .
Števec bitov verjetno zato, da ko bo preštel do 8, bo dal stop bit 1 na izhod.
Blok je mišljeno kot process?
Hvala, jutri poskusim kaj sčarati . |
|
Nazaj na vrh |
|
|
gregzy87 Član
Pridružen-a: Čet 08 Feb 2007 2:48 Prispevkov: 741 Aktiv.: 3.53 Kraj: Okolica Vrhnike
|
Objavljeno: Sob Jun 04, 2011 4:17 pm Naslov sporočila: |
|
|
Skripto sem našel a mi v tem mojem primeru ne pomaga kaj dosti ...
Najprej moram rešiti to, da nek 8 bitni podatek (npr.: "11001010") pošljem ven na eno bitni izhod enega za drugim: "1" "1" "0" "0" "1" "0" "1" "0". To mi pa nikakor noče delati .
Dela mi tako, da če dam na vhod nek 8 bitni podatek, dobim na izhod1 za 1 višjo cifro ... Če nastavim izhod1 da je eno bitni signal vrže ven error.
Ko bom to uspel narediti grem šele na avtomat.
Koda: |
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
-- Uncomment the following lines to use the declarations that are
-- provided for instantiating Xilinx primitive components.
--library UNISIM;
--use UNISIM.VComponents.all;
entity RS232komun is
Port ( vhod : in std_logic_vector(7 downto 0);
clk : in std_logic);
end RS232komun;
architecture Behavioral of RS232komun is
---------- notranji signali -----------------------------------------------------------------
signal izhod1: std_logic_vector(7 downto 0);
begin
-- pošiljanje podatkov ------------------------------------
neki: process (clk)
begin
if rising_edge(clk) then
izhod1 <= vhod(6 downto 0) & '0';
end if;
end process;
end Behavioral;
|
Po daljšem mučenju nekako rešil. |
|
Nazaj na vrh |
|
|
|
|
Ne, ne moreš dodajati novih tem v tem forumu Ne, ne moreš odgovarjati na teme v tem forumu Ne, ne moreš urejati svojih prispevkov v tem forumu Ne, ne moreš brisati svojih prispevkov v tem forumu Ne ne moreš glasovati v anketi v tem forumu Ne, ne moreš pripeti datotek v tem forumu Ne, ne moreš povleči datotek v tem forumu
|
Uptime: 95 dni
Powered by phpBB © 2001, 2005 phpBB Group
|