Implementierung Bytes Demultiplexer

OP #3490561
Lesenswert?
• ▲
▼
Hallo
Ich wäre dankbar für ein Tipp wie ich ein Byte Demultiplxer in VHDL 
implementieren soll.

Folgende Schaltung funktioniert bereits ist aber noch keine 
Demultiplexer. Es wird lediglich ein Byte (wb_dat_i) von Wishbone nach 
gpo getaktet. Nun soll aber je nach Adresse (wb_adr_i) das Wisbone Byte 
in ein bestimmtes Ausgangssignal getaktet werden, und dann auch dort 
bestehen bleiben, bis es wieder üerschrieben wird.

Also z.B. soll wenn wb_adr_i = 3 => tvor (23 downto 15) <= wb_dat_i;

Ich bin nicht so der VHDL Experte, deshalb bin ich mir nicht sicher, wie 
sowas am Besten implementiert wird.

Kann mir da jemand ein Vorschlag machen?

Gruss
1
ENTITY GPO_wb IS
2
   PORT( 
3
      clk       : IN     std_logic;
4
      reset       : IN     std_logic;
5
-- wishbone interface
6
      wb_stb_i       : IN     std_logic;
7
      wb_dat_i       : IN std_logic_vector(7 DOWNTO 0);
8
      wb_adr_i       : IN std_logic_vector(7 DOWNTO 0);
9
      wb_ack_o       : OUT     std_logic;
10
-- logik interface SM
11
      tvor       : OUT unsigned(31 DOWNTO 0);       
12
      ton       : OUT unsigned(31 DOWNTO 0);
13
      toff       : OUT unsigned(31 DOWNTO 0);
14
      tmag_on       : OUT unsigned(31 DOWNTO 0);
15
      tmag_off       : OUT unsigned(31 DOWNTO 0);
16
      umon_trig       : OUT unsigned(15 DOWNTO 0);
17
      npuls       : OUT unsigned(7 DOWNTO 0);
18
      SM_control       : OUT std_logic_vector(7 DOWNTO 0);
19
-- logik interface GPO
20
      gpo       : OUT std_logic_vector(7 DOWNTO 0);
21
);
22
END GPO_wb ;
23

24
ARCHITECTURE struct OF GPO_wb IS  
25
BEGIN
26
PROCESS(clk,reset)
27
BEGIN
28
 IF reset='1' THEN 
29
  gpo <= (others => '0');
30
  wb_ack_o <= '0';
31
 ELSIF rising_edge(clk) THEN
32
  IF wb_stb_i='1' THEN
33
      
34
    --Hier müssten die Zuweisungen gem Adresse rein
35
   gpo <= wb_dat_i;
36

37
   wb_ack_o <= '1';
38
  ELSE
39
   wb_ack_o <= '0';
40
  END IF;
41
 END IF;
42
END PROCESS;
43
END ARCHITECTURE struct;
#3491938
Lesenswert?
• ▲
▼
Vielleicht hilft dir das weiter...
1
LIBRARY ieee;
2
USE ieee.std_logic_1164.ALL;
3
USE ieee.numeric_std.ALL;
4
...
5
PROCESS(clk,reset)
6
BEGIN
7
 IF reset='1' THEN 
8
  gpo      <= (others => '0');
9
  wb_ack_o <= '0';
10
  tvor     <= (others => '0');
11
 ELSIF rising_edge(clk) THEN
12
  IF wb_stb_i='1' THEN
13
      
14
    --Hier müssten die Zuweisungen gem Adresse rein
15
   case to_integer(unsigned(w_adr_i)) is
16
     when 0 => tvor (7 downto 0)   <= wb_dat_i;
17
     when 1 => tvor (15 downto 8)  <= wb_dat_i;
18
     when 2 => tvor (23 downto 16) <= wb_dat_i;
19
     when 3 => tvor (31 downto 24) <= wb_dat_i;
20
     when OTHERS => NULL;
21
   end case;
22

23
   gpo <= wb_dat_i;
24

25
...

Gruss

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.