Forum: FPGA, VHDL & Co. VHDL strukturbeschreibung


von aero (Gast)


Lesenswert?

Hallo,
ich habe ein Problem mit einem VHDL Programm.
Und zwar habe ich ein listing in dem eine Stopwatch programmiert und ein 
anderes in dem die ansteuerung eines BCDs programmiert ist.
Und jetzt will ich ganz einfach die stopwatch in dem bcd anzeigen 
lassen, allerdings wird mir selbst nachdem ich mit component und der 
portmap alles irgendwie verknüpft erkennt der aber im chip planner von 
quartus II immer noch nicht die bcd segmente und ohne kanns halt nicht 
gehen.
Hier der code.
1
-- Listing 5.15
2
library ieee;
3
use ieee.std_logic_1164.all;
4
use ieee.numeric_std.all;
5
entity ch05_15_16_watch is
6
   port(
7
      clk: in std_logic;
8
      go, clr: in std_logic;
9
      d2, d1, d0: buffer std_logic_vector(3 downto 0)
10
    --bcd0, bcd1, bcd2: out std_logic_vector(6 downto 0)
11
    
12
   );
13
end ch05_15_16_watch;
14
15
architecture cascade_arch of ch05_15_16_watch is
16
   constant DVSR: integer:=5000000;
17
  
18
  component bin_to_sseg
19
  port(
20
     bin0: in std_logic_vector(3 downto 0);
21
    bin1: in std_logic_vector(3 downto 0);
22
    bin2: in std_logic_vector(3 downto 0);
23
    sseg0: out std_logic_vector(6 downto 0);
24
    sseg1: out std_logic_vector(6 downto 0);
25
    sseg2: out std_logic_vector(6 downto 0)
26
       );
27
  end component;
28
  
29
   signal ms_reg, ms_next: unsigned(22 downto 0);
30
   signal d2_reg, d1_reg, d0_reg: unsigned(3 downto 0);
31
   signal d2_next, d1_next, d0_next: unsigned(3 downto 0);
32
   signal d1_en, d2_en, d0_en: std_logic;
33
   signal ms_tick, d0_tick, d1_tick: std_logic;
34
  signal bin0, bin1, bin2 : std_logic_vector(3 downto 0);
35
begin
36
   -- register
37
   process(clk)
38
   begin
39
      if (clk'event and clk='1') then
40
         ms_reg <= ms_next;
41
         d2_reg <= d2_next;
42
         d1_reg <= d1_next;
43
         d0_reg <= d0_next;
44
      end if;
45
   end process;
46
47
   -- next-state logic
48
   -- 0.1 sec tick generator: mod-5000000
49
   ms_next <=
50
      (others=>'0') when clr='1' or
51
                        (ms_reg=DVSR and go='1') else
52
      ms_reg + 1 when go='1' else
53
      ms_reg;
54
   ms_tick <= '1' when ms_reg=DVSR else '0';
55
   -- 0.1 sec counter
56
   d0_en <= '1' when ms_tick='1' else '0';
57
   d0_next <=
58
      "0000" when (clr='1') or (d0_en='1' and d0_reg=9) else
59
      d0_reg + 1 when d0_en='1' else
60
      d0_reg;
61
   d0_tick <= '1' when d0_reg=9 else '0';
62
   -- 1 sec counter
63
   d1_en <= '1' when ms_tick='1' and d0_tick='1' else '0';
64
   d1_next <=
65
      "0000" when (clr='1') or (d1_en='1' and d1_reg=9) else
66
      d1_reg + 1 when d1_en='1' else
67
      d1_reg;
68
   d1_tick <= '1' when d1_reg=9 else '0';
69
   -- 10 sec counter
70
   d2_en <=
71
      '1' when ms_tick='1' and d0_tick='1' and d1_tick='1' else
72
      '0';
73
   d2_next <=
74
      "0000" when (clr='1') or (d2_en='1' and d2_reg=9) else
75
      d2_reg + 1 when d2_en='1' else
76
      d2_reg;
77
78
   -- output logic
79
   d0 <= std_logic_vector(d0_reg);
80
   d1 <= std_logic_vector(d1_reg);
81
   d2 <= std_logic_vector(d2_reg);
82
  
83
  bin0 <= d0;
84
  bin1 <= d1;
85
  bin2 <= d2;
86
  
87
  binary_unit : entity work.bin_to_sseg
88
  port map(bin0 => bin0, bin1 => bin1, bin2 => bin2);
89
--  bcd_unit : entity work.bin_to_sseg
90
--  port map(sseg0 => bcd0, sseg1 => bcd1, sseg2 => bcd2);
91
  
92
  
93
end cascade_arch;
94
95
96
-- Listing 4.12
97
library ieee;
98
use ieee.std_logic_1164.all;
99
entity bin_to_sseg is
100
   port(
101
      bin0: in std_logic_vector(3 downto 0);
102
    bin1: in std_logic_vector(3 downto 0);
103
    bin2: in std_logic_vector(3 downto 0);
104
      sseg0: out std_logic_vector(6 downto 0);
105
    sseg1: out std_logic_vector(6 downto 0);
106
    sseg2: out std_logic_vector(6 downto 0)
107
   );
108
end bin_to_sseg;
109
110
architecture arch of bin_to_sseg is
111
begin
112
   with bin0 select
113
      sseg0 <=
114
         "1000000" when "0000",
115
         "1111001" when "0001",
116
         "0100100" when "0010",
117
         "0110000" when "0011",
118
         "0011001" when "0100",
119
         "0010010" when "0101",
120
         "0000010" when "0110",
121
         "1111000" when "0111",
122
         "0000000" when "1000",
123
         "0010000" when "1001",
124
         "0001000" when "1010", --a
125
         "0000011" when "1011", --b
126
         "1000110" when "1100", --c
127
         "0100001" when "1101", --d
128
         "0000110" when "1110", --e
129
         "0001110" when others; --f
130
      
131
  with bin1 select
132
      sseg1 <=
133
         "1000000" when "0000",
134
         "1111001" when "0001",
135
         "0100100" when "0010",
136
         "0110000" when "0011",
137
         "0011001" when "0100",
138
         "0010010" when "0101",
139
         "0000010" when "0110",
140
         "1111000" when "0111",
141
         "0000000" when "1000",
142
         "0010000" when "1001",
143
         "0001000" when "1010", --a
144
         "0000011" when "1011", --b
145
         "1000110" when "1100", --c
146
         "0100001" when "1101", --d
147
         "0000110" when "1110", --e
148
         "0001110" when others; --f
149
      
150
      
151
  with bin2 select
152
      sseg2 <=
153
         "1000000" when "0000",
154
         "1111001" when "0001",
155
         "0100100" when "0010",
156
         "0110000" when "0011",
157
         "0011001" when "0100",
158
         "0010010" when "0101",
159
         "0000010" when "0110",
160
         "1111000" when "0111",
161
         "0000000" when "1000",
162
         "0010000" when "1001",
163
         "0001000" when "1010", --a
164
         "0000011" when "1011", --b
165
         "1000110" when "1100", --c
166
         "0100001" when "1101", --d
167
         "0000110" when "1110", --e
168
         "0001110" when others; --f
169
end arch;

Vielleicht kann mir ja jemand von euch helfen.
Danke im voraus
aero

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

aero schrieb:
> jetzt will ich ganz einfach die stopwatch in dem bcd anzeigen lassen
Der richtige Schritt an dieser Stelle wäre eine Verhaltenssimulation. 
Sieh dir dieses Kapitel mal an...

> erkennt der aber im chip planner von quartus II immer noch nicht die
> bcd segmente und ohne kanns halt nicht gehen.
Dein Top-Level hat gar keine Ports zum Anschluss einer 
7-Segment-Anzeige, die sind da auskommentiert...
Und das hier:
1
  binary_unit : entity work.bin_to_sseg
2
  port map(bin0 => bin0, bin1 => bin1, bin2 => bin2);
3
--  bcd_unit : entity work.bin_to_sseg
4
--  port map(sseg0 => bcd0, sseg1 => bcd1, sseg2 => bcd2);
5
Sollte besser so heißen:
6
  port map(bin0 => bin0, bin1 => bin1, bin2 => bin2, 
7
           sseg0 => bcd0, sseg1 => bcd1, sseg2 => bcd2);

Das das hier arg umständlich ist, ist dir klar?
1
   -- output logic
2
   d0 <= std_logic_vector(d0_reg);
3
   d1 <= std_logic_vector(d1_reg);
4
   d2 <= std_logic_vector(d2_reg);
5
  
6
  bin0 <= d0;
7
  bin1 <= d1;
8
  bin2 <= d2;

Ein Tipp: in der wirklichen Realität würde man einen einzigen 
bin_to_bcd Umsetzer bauen und den dann 3 mal instantiieren. So macht man 
das nämlich auch mit ICs: man sucht nicht einen 3-fach Converter, 
sondern nimmt 3 von den einfachen Konverter...
So etwa:
1
  component bin_to_sseg -- wandelt eine Stelle
2
     port( bin: in std_logic_vector(3 downto 0);
3
           sseg: out std_logic_vector(6 downto 0));
4
  end component;
5
  :  
6
  :
7
  -- wird 3 x instantiiert
8
  bcdwandler0: bin_to_sseg
9
  port map(bin => bin0, sseg => bcd0);
10
  bcdwandler1: bin_to_sseg
11
  port map(bin => bin1, sseg => bcd1);
12
  bcdwandler2: bin_to_sseg
13
  port map(bin => bin2, sseg => bcd2);

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.