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;
|