我是用VHDL设计一个数字电压表,是0.1-5V的模拟电压转换为相应的数字量,然后通过进制转换在数码管上进行显示。我在BCD码转换的那一段出错了!我的邮箱是jgq888@163.com.程序如下:
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);
Dout: OUT STD_LOGIC_VECTOR(3 Downto 0);
SELOUT: OUT STD_LOGIC_VECTOR(2 Downto 0);
SEGOUT: OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
CP: IN STD_LOGIC;
RST :IN STD_LOGIC;
nCS,nWR,nRD:OUT STD_LOGIC;
nINTR :IN STD_LOGIC
);
END Ch9_2_3;
ARCHITECTURE a OF Ch9_2_3 IS
TYPE STATE_TYPE IS (S0,S1,S2,S3);
SIGNAL State :STATE_TYPE;
SIGNAL EC,nIN :STD_LOGIC;
SIGNAL D : STD_LOGIC_VECTOR(7 Downto 0);
SIGNAL Value : STD_LOGIC_VECTOR(11 Downto 0);
SIGNAL NUM :STD_LOGIC_VECTOR(3 Downto 0);
SIGNAL SEG :STD_LOGIC_VECTOR(6 Downto 0);
SIGNAL SEL: STD_LOGIC_VECTOR(2 Downto 0);
SIGNAL ST: STD_LOGIC_VECTOR(1 Downto 0);
BEGIN
SystemConnection:Block
Begin
nIN<=nINTR;
SEGOUT(6 DOWNTO 0)<=SEG;
SEGOUT(7)<= '1' WHEN ST=2 Else '0' ;
Dout<=NUM;
End Block SystemConnection;
StateChange:Block
Begin
PROCESS(CP,RST)
BEGIN
IF RST= '1' Then
nCS<= '1';
nWR<= '1' ;
nRD<= '1';
EC<= '0';
State<=S0;
ElsIF CP'Event And CP= '1' Then
CASE State IS
WHEN S0 =>
nCS<= '0';
nWR<= '0' ;
nRD<= '1';
Ec<= '0';
State<=S1;
WHEN S1=>
nCS<= '1' ;
nWR<= '1' ;
nRD<= '1' ;
EC<= '0' ;
If nIN= '0' Then
State<=S2;
END If;
WHEN S2=>
nCS<= '0';
nWR<= '1' ;
nRD<= '0';
EC<= '1';
State<=S3;
WHEN S3=>
nCS<= '1';
nWR<= '1' ;
nRD<= '1';
EC<= '0';
State<=S0;
WHEN OTHERS=>
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;
END IF;
end if;
END PROCESS;
END Block ReadData;
Conversion:Block
SIGNAL V: STD_LOGIC_VECTOR(7 Downto 0);
SIGNAL HB, LB: STD_LOGIC_VECTOR(11 Downto 0);
SIGNAL C30, C74, C118: STD_LOGIC;
BEGIN
V<=D;
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
---(2)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" ;
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';
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);
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);
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);
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
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
BEGIN
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; |