⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ch9_3_1.vhd

📁 CH4CH2CH1VHDL 数字电路参考书所有程序9
💻 VHD
字号:
-- ********************************************
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;

--*********************************************
ENTITY Ch9_3_1 is
	PORT(
		 Temp		: OUT   STD_LOGIC_VECTOR(7 Downto 0);
		 Din		: IN	STD_LOGIC_VECTOR(7 Downto 0);	-- A/D Data
		 Dout		: OUT   STD_LOGIC_VECTOR(3 Downto 0);	-- BCD Out
      	 Tout		: OUT   STD_LOGIC_VECTOR(11 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_3_1;

--*********************************************
ARCHITECTURE a OF Ch9_3_1 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) <= '0'; 				-- a Decimal Point ? 
	Dout <= NUM;					-- BCD Number Display
	Tout <= Value;	
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(8 downto 0);		--A/D Conversion Data
	Signal T : Std_Logic_Vector(7 downto 0);
Begin
	V <= (D & '0')  - "100010001";		-- A/D Data * 2 - (111H)
	T <= V(7 Downto 0);
	Temp <= T;

	Value <= "000000000000" When T = 0 Else
			 "000000000001" When T = 1 Else
			 "000000000010" When T = 2 Else
			 "000000000011" When T = 3 Else
			 "000000000100" When T = 4 Else
			 "000000000101" When T = 5 Else
			 "000000000110" When T = 6 Else
			 "000000000111" When T = 7 Else
			 "000000001000" When T = 8 Else
			 "000000001001" When T = 9 Else
			 "000000010000" When T = 10 Else
			 "000000010001" When T = 11 Else
			 "000000010010" When T = 12 Else
			 "000000010011" When T = 13 Else
			 "000000010100" When T = 14 Else
			 "000000010101" When T = 15 Else
			 "000000010110" When T = 16 Else
			 "000000010111" When T = 17 Else
			 "000000011000" When T = 18 Else
			 "000000011001" When T = 19 Else
			 "000000100000" When T = 20 Else
			 "000000100001" When T = 21 Else
			 "000000100010" When T = 22 Else
			 "000000100011" When T = 23 Else
			 "000000100100" When T = 24 Else
			 "000000100101" When T = 25 Else
			 "000000100110" When T = 26 Else
			 "000000100111" When T = 27 Else
			 "000000101000" When T = 28 Else
			 "000000101001" When T = 29 Else
			 "000000110000" When T = 30 Else
			 "000000110001" When T = 31 Else
			 "000000110010" When T = 32 Else
			 "000000110011" When T = 33 Else
			 "000000110100" When T = 34 Else
			 "000000110101" When T = 35 Else
			 "000000110110" When T = 36 Else
			 "000000110111" When T = 37 Else
			 "000000111000" When T = 38 Else
			 "000000111001" When T = 39 Else
			 "000001000000" When T = 40 Else
			 "000001000001" When T = 41 Else
			 "000001000010" When T = 42 Else
			 "000001000011" When T = 43 Else
			 "000001000100" When T = 44 Else
			 "000001000101" When T = 45 Else
			 "000001000110" When T = 46 Else
			 "000001000111" When T = 47 Else
			 "000001001000" When T = 48 Else
			 "000001001001" When T = 49 Else
			 "000001010000" When T = 50 Else
			 "000001010001" When T = 51 Else
			 "000001010010" When T = 52 Else
			 "000001010011" When T = 53 Else
			 "000001010100" When T = 54 Else
			 "000001010101" When T = 55 Else
			 "000001010110" When T = 56 Else
			 "000001010111" When T = 57 Else
			 "000001011000" When T = 58 Else
			 "000001011001" When T = 59 Else
			 "000001100000" When T = 60 Else
			 "000001100001" When T = 61 Else
			 "000001100010" When T = 62 Else
			 "000001100011" When T = 63 Else
			 "000001100100" When T = 64 Else
			 "000001100101" When T = 65 Else
			 "000001100110" When T = 66 Else
			 "000001100111" When T = 67 Else
			 "000001101000" When T = 68 Else
			 "000001101001" When T = 69 Else
			 "000001110000" When T = 70 Else
			 "000001110001" When T = 71 Else
			 "000001110010" When T = 72 Else
			 "000001110011" When T = 73 Else
			 "000001110100" When T = 74 Else
			 "000001110101" When T = 75 Else
			 "000001110110" When T = 76 Else
			 "000001110111" When T = 77 Else
			 "000001111000" When T = 78 Else
			 "000001111001" When T = 79 Else
			 "000010000000" When T = 80 Else
			 "000010000001" When T = 81 Else
			 "000010000010" When T = 82 Else
			 "000010000011" When T = 83 Else
			 "000010000100" When T = 84 Else
			 "000010000101" When T = 85 Else
			 "000010000110" When T = 86 Else
			 "000010000111" When T = 87 Else
			 "000010001000" When T = 88 Else
			 "000010001001" When T = 89 Else
			 "000010010000" When T = 90 Else
			 "000010010001" When T = 91 Else
			 "000010010010" When T = 92 Else
			 "000010010011" When T = 93 Else
			 "000010010100" When T = 94 Else
			 "000010010101" When T = 95 Else
			 "000010010110" When T = 96 Else
			 "000010010111" When T = 97 Else
			 "000010011000" When T = 98 Else
			 "000010011001" When T = 99 Else
			 "000100000000";				-- 100
 
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 + -