xilinx
Radó-Láng
rado-lang at axelero.hu
Sat Jan 14 14:15:54 CET 2006
Ha már a listára került, akkor legyen mindenki számára érthető a
probléma, amit a Jánossal megbeszéltünk:
Ha megpróbáljuk fejben követni, hogy mit csinál a fordító, akkor a
következő kapjuk. (nézzük az első sort)
Az O0 egy (illetve 8) latch lesz, melynek az adatbemenete a
AVR_PA megfelelő bitjei. Az beírást vezérlő jel pedig 3 jel ÉS kombinációjából jönne
ki. AVR_PC="00..0", AVR_RD='H', rising_edge(avr_wr)
Igen ám, de szemben az AVR_PC="00..0" és a AVR_RD='H'-val a
rising_edge(avr_wr) nem állapot, hanem egy időpillanat, ami így
értelmezhetetlen.
A fordító erre nem volt felkészítve, mivel ilyen megoldást nem nagyon
használnak. Az él érzékeny jeleket processekben kezelik.
Ha viszont másként kezdünk szintetizálni:
(Az hittem, hogy ilyen kezdetü mondatot csak matematikusok tudnak:)
Vegyük észre, nekünk egy D regiszter kell, továbbá, hogy a regiszterbe
való beírás időpontját csak AVR_WR szabja meg. Tehát:
A D regiszter órajel bemenete az AVR_WR. Az engedélyező bemenetén a
AVR_PC="00..0", AVR_RD='H' ÉS kombinációja van. Az adat bemenetre
pedig a AVR_PA bit kerül. A kimenet pedig maga az O0.
Ahhoz, hogy ez a fordító számára is világos legyen az alábbi eljárást
érdemes követni ilyen esetben:
writer: process(avr_wr)
begin
if rising_edge(avr_wr) and avr_rd='H' then
case avr_pc is
when "00000000" => O0<= avr_pa;
when "00000001" => O1<= avr_pa;
when "00000010" => O2<= avr_pa;
when "00000011" => raml<= avr_pa;
when "00000100" => ramh<= avr_pa;
when "00000101" => ramd<= avr_pa;
when others => null;
end case;
end if;
end process;
Üdv.: Zoli
T> ez lefordul nalad?
T> nalam a 92. sorban az "avr_pa" ertekadasaval van baj. ha kikomentezem
T> akkor fordul.
.....
T> O0<= avr_pa when avr_pc="00000000" and
T> rising_edge(avr_wr) and avr_rd='H';
T> O1<= avr_pa when avr_pc="00000001" and
T> rising_edge(avr_wr) and avr_rd='H';
T> O2<= avr_pa when avr_pc="00000010" and
T> rising_edge(avr_wr) and avr_rd='H';
T> raml<= avr_pa when avr_pc="00000011" and
T> rising_edge(avr_wr) and avr_rd='H';
T> ramh<= avr_pa when avr_pc="00000100" and
T> rising_edge(avr_wr) and avr_rd='H';
T> ramd<= avr_pa when avr_pc="00000101" and
T> rising_edge(avr_wr) and avr_rd='H';
T> avr_pa<="00000000" when avr_pc="00000000" and avr_rd='L' else "ZZZZZZZZ";
More information about the Elektro
mailing list