📄 ch9_2_3.vhd
字号:
-- ********************************************
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
--*********************************************
ENTITY Ch9_2_3 is
PORT(
Din : IN STD_LOGIC_VECTOR(7 Downto 0); -- A/D Data
Dout : OUT STD_LOGIC_VECTOR(3 Downto 0); -- BCD Out
SELOUT : OUT STD_LOGIC_VECTOR(2 DOWNTO 0); -- Scan Code
SEGOUT : OUT STD_LOGIC_VECTOR(7 DOWNTO 0); -- SEG7 Display O/P
CP : IN STD_LOGIC; -- CLOCK
RST : IN STD_LOGIC; -- System Reset
nCS,nWR,nRD: OUT STD_LOGIC; -- O/P Signal
nINTR : IN STD_LOGIC -- I/P Signal
);
END Ch9_2_3;
--*********************************************
ARCHITECTURE a OF Ch9_2_3 IS
TYPE STATE_TYPE IS (S0,S1,S2,S3); --State Type Declare
SIGNAL State : STATE_TYPE; --State Signal Declare
SIGNAL EC,nIN : STD_LOGIC; --Synchronous Control & A/D nINTR
SIGNAL D : STD_LOGIC_VECTOR(7 Downto 0); -- Read A/D Data
SIGNAL Value : STd_LOGIC_VECTOR(11 Downto 0);-- A/D Conversion Data
SIGNAL NUM : STD_LOGIC_VECTOR(3 DOWNTO 0); -- Number Display Signal
SIGNAL SEG : STD_LOGIC_VECTOR(6 DOWNTO 0); -- SEG7 Display Signal
SIGNAL SEL : STD_LOGIC_VECTOR(2 DOWNTO 0); -- Select SEG7 Signal
Signal ST : STD_LOGIC_VECTOR(1 DOWNTO 0); -- Scan Code State
BEGIN
SystemConnection: Block
Begin
nIn <= nINTR;
SEGOUT(6 DOWNTO 0) <= SEG; -- Seven Segment Display
SEGOUT(7) <= '1' When ST = 2 Else -- Light a Decimal Point ?
'0';
Dout <= NUM; -- BCD Number Display
End Block SystemConnection;
StateChange: Block -- Signal Generator
Begin
PROCESS (CP,RST)
BEGIN
IF RST = '1' Then --Reset State
nCS <= '1';
nWR <= '1';
nRD <= '1';
EC <= '0';
State <= S0;
ElsIF CP'Event And CP = '1' Then
CASE State IS
WHEN S0 => --STATE S0 & Write State
nCS <= '0';
nWR <= '0';
nRD <= '1';
EC <= '0';
State <= S1;
WHEN S1 => --STATE S1 & A/D Conversion State
nCS <= '1';
nWR <= '1';
nRD <= '1';
EC <= '0';
If nIN = '0' Then --nINTR = '0' ?
State <= S2;
End if;
WHEN S2 => --STATE S2 & Read State
nCS <= '0';
nWR <= '1';
nRD <= '0';
EC <= '1';
State <= S3;
WHEN S3 => --STATE S3
nCS <= '1';
nWR <= '1';
nRD <= '1';
EC <= '0';
State <= S0;
WHEN OTHERS => --Initial State
State <= S0;
END CASE;
ENd If;
END PROCESS;
End Block StateChange;
ReadData: Block
Begin
PROCESS (CP)
BEGIN
IF CP'Event AND CP = '1' THEN
IF EC = '1' THEN
D <= Din ; --Read A/D Convertor Data
END IF;
END IF;
END PROCESS;
End Block ReadData;
Conversion: Block
Signal V : Std_Logic_Vector(7 downto 0); --A/D Conversion Data
Signal HB,LB : Std_Logic_Vector(11 downto 0);
Signal C30,C74,C118 : Std_Logic;
Begin
V <= D ; -- A/D Data * 2
-- For A/D Conversion Data High Byte
HB <= "010010000000" When V(7 downto 4) = "1111" Else --4.80
"010001001000" When V(7 downto 4) = "1110" Else --4.48
"010000010110" When V(7 downto 4) = "1101" Else --4.16
"001110000100" When V(7 downto 4) = "1100" Else --3.84
"001101010010" When V(7 downto 4) = "1011" Else --3.52
"001100100000" When V(7 downto 4) = "1010" Else --3.20
"001010001000" When V(7 downto 4) = "1001" Else --2.88
"001001010110" When V(7 downto 4) = "1000" Else --2.56
"001000100100" When V(7 downto 4) = "0111" Else --2.24
"000110010010" When V(7 downto 4) = "0110" Else --1.92
"000101100000" When V(7 downto 4) = "0101" Else --1.60
"000100101000" When V(7 downto 4) = "0100" Else --1.28
"000010010110" When V(7 downto 4) = "0011" Else --0.96
"000001100100" When V(7 downto 4) = "0010" Else --0.64
"000000110010" When V(7 downto 4) = "0001" Else --0.32
"000000000000"; --0.00
--For A/D Conversion Data Low Byte
LB <= "000000110000" When V(3 downto 0) = "1111" Else --0.30
"000000101000" When V(3 downto 0) = "1110" Else --0.28
"000000100110" When V(3 downto 0) = "1101" Else --0.26
"000000100100" When V(3 downto 0) = "1100" Else --0.24
"000000100010" When V(3 downto 0) = "1011" Else --0.22
"000000100000" When V(3 downto 0) = "1010" Else --0.20
"000000011000" When V(3 downto 0) = "1001" Else --0.18
"000000010110" When V(3 downto 0) = "1000" Else --0.16
"000000010100" When V(3 downto 0) = "0111" Else --0.14
"000000010010" When V(3 downto 0) = "0110" Else --0.12
"000000010000" When V(3 downto 0) = "0101" Else --0.10
"000000001000" When V(3 downto 0) = "0100" Else --0.08
"000000000110" When V(3 downto 0) = "0011" Else --0.06
"000000000100" When V(3 downto 0) = "0010" Else --0.04
"000000000010" When V(3 downto 0) = "0001" Else --0.02
"000000000000"; --0.00
--Check BCD Addition Carry
C30 <= '1' When HB(3 Downto 0) + LB(3 Downto 0) > "1001" Else
'0';
C74 <= '1' When HB(7 Downto 4) + LB(7 Downto 4) > "1001" Else
'0';
C118 <= '1' When HB(11 Downto 8) + LB(11 Downto 8) > "1001" Else
'0';
-- BCD Addition (3~0)
Value(3 Downto 0) <= HB(3 Downto 0) + LB(3 Downto 0) + "0110" When C30 ='1' Else
HB(3 Downto 0) + LB(3 Downto 0);
-- BCD Addition (7~4)
Value(7 Downto 4) <= HB(7 Downto 4) + LB(7 Downto 4) + "0111" When C74 ='1' And C30 = '1' Else
HB(7 Downto 4) + LB(7 Downto 4) + "0110" When C74 ='1' And C30 = '0' Else
HB(7 Downto 4) + LB(7 Downto 4) + "0001" When C74 ='0' And C30 = '1' Else
HB(7 Downto 4) + LB(7 Downto 4);
-- BCD Addition (11~8)
Value(11 Downto 8) <= HB(11 Downto 8) + LB(11 Downto 8) + "0111" When C118 ='1' And C74 = '1' Else
HB(11 Downto 8) + LB(11 Downto 8) + "0110" When C118 ='1' And C74 = '0' Else
HB(11 Downto 8) + LB(11 Downto 8) + "0001" When C118 ='0' And C74 = '1' Else
HB(11 Downto 8) + LB(11 Downto 8);
End Block Conversion;
Free_Counter : Block -- 计数器 & 产生扫描信号
Signal Q : STD_LOGIC_VECTOR(15 DOWNTO 0);
Begin
PROCESS (CP) -- 计数器计数
Begin
IF CP'Event AND CP='1' then
Q <= Q+1;
END IF;
END PROCESS;
ST <= Q(15 DOWNTO 14); --about 125 Hz
SELOUT <= "010" WHEN ST=0 ELSE
"001" WHEN ST=1 ELSE
"000" WHEN ST=2 ELSE
"111";
--扫描信号
SEL <= "110" WHEN ST=0 ELSE
"101" WHEN ST=1 ELSE
"011" WHEN ST=2 ELSE
"111";
End Block Free_Counter;
SELECT_BCD : Block
BEGIN -- Select BCD (4 Bits)
NUM <= Value(3 DOWNTO 0) WHEN ST=0 ELSE
Value(7 DOWNTO 4) WHEN ST=1 ELSE
Value(11 DOWNTO 8);
End Block SELECT_BCD;
SEVEN_SEGMENT : Block -- Binary Code -> Segment 7 Code
Begin
--gfedcba
SEG <= "0111111" WHEN NUM = 0 ELSE
"0000110" WHEN NUM = 1 ELSE
"1011011" WHEN NUM = 2 ELSE
"1001111" WHEN NUM = 3 ELSE
"1100110" WHEN NUM = 4 ELSE
"1101101" WHEN NUM = 5 ELSE
"1111101" WHEN NUM = 6 ELSE
"0000111" WHEN NUM = 7 ELSE
"1111111" WHEN NUM = 8 ELSE
"1101111" WHEN NUM = 9 ELSE
"1110111" WHEN NUM = 10 ELSE
"1111100" WHEN NUM = 11 ELSE
"0111001" WHEN NUM = 12 ELSE
"1011110" WHEN NUM = 13 ELSE
"1111001" WHEN NUM = 14 ELSE
"1110001" WHEN NUM = 15 ELSE
"0000000";
End Block SEVEN_SEGMENT;
END a;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -