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