亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? fpga_7279.vhd

?? 基于FPGA的7279鍵盤數碼管驅動
?? VHD
字號:
--FPGA控制7279的程序

library IEEE;
use IEEE.std_logic_1164.all;
use IEEE.std_logic_ARITH.all;
use IEEE.std_logic_UNSIGNED.all;

entity FPGA_7279 is
	port (
		--以下是引腳信號
		
		CLK       :IN      STD_LOGIC;  --系統時鐘
		RST_N     :IN      STD_LOGIC;  --系統復位
		CLK_S     :IN      STD_LOGIC;  --7279時序的狀態機時鐘,周期為20us
		--外部控制接口與本模塊之間的信號
		WR_N      :IN      STD_LOGIC;  --外部寫信號
		RD_N      :IN      STD_LOGIC;  --外部讀信號
		KEY_EN    :OUT     STD_LOGIC;  --存在有效鍵值, 高電平為存在有效鍵值, 外部接口讀走數據后變低
		ADDR  	  :IN      STD_LOGIC_VECTOR(2 downto 0);  --地址信號
		D_BUS  	  :IN      STD_LOGIC_VECTOR(7 downto 0);  --指令,數據輸入及鍵盤值輸出
		--與7279之間的信號
		KEY7279   :IN      STD_LOGIC;  --7279的鍵盤信號,有鍵按下時為低電平,平時為高電平
		CLK7279   :OUT     STD_LOGIC;  --7279的時鐘信號
		CS7279    :OUT     STD_LOGIC;  --7279的片選信號
		DAT7279   :INOUT   STD_LOGIC;  --7279數據信號
		OUT7279   :OUT     STD_LOGIC_VECTOR(7 downto 0)   --7279鍵盤鍵值輸出信號,測試時用
		);
end FPGA_7279;

ARCHITECTURE behav OF FPGA_7279 IS

CONSTANT RST_7279	: std_logic_vector (7 downto 0) := x"A4";  --復位(清除)指令
CONSTANT TST_7279	: std_logic_vector (7 downto 0) := x"BF";  --測試指令
CONSTANT SL_7279	: std_logic_vector (7 downto 0) := x"A1";  --左移指令
CONSTANT SR_7279	: std_logic_vector (7 downto 0) := x"A0";  --右移指令
CONSTANT RL_7279	: std_logic_vector (7 downto 0) := x"A3";  --循環左移指令
CONSTANT RR_7279	: std_logic_vector (7 downto 0) := x"A2";  --循環右移指令
CONSTANT RDKY_7279	: std_logic_vector (7 downto 0) := x"15";  --讀鍵盤數據指令
CONSTANT DC0_7279	: std_logic_vector (7 downto 0) := x"80";  --下載數據且按方式0譯碼, 1 0 0 0 0 a2 a1 a0 ,后3位用來指定數碼管
CONSTANT DC1_7279	: std_logic_vector (7 downto 0) := x"C8";  --下載數據且按方式1譯碼, 1 1 0 0 1 a2 a1 a0
CONSTANT NDC_7279	: std_logic_vector (7 downto 0) := x"90";  --下載數據不譯碼,        1 0 0 1 0 a2 a1 a0
CONSTANT FL_7279	: std_logic_vector (7 downto 0) := x"88";  --閃爍控制
CONSTANT HD_7279	: std_logic_vector (7 downto 0) := x"98";  --消隱控制
CONSTANT SGDSP_7279	: std_logic_vector (7 downto 0) := x"E0";  --段點亮指令
CONSTANT SGCLR_7279	: std_logic_vector (7 downto 0) := x"C0";  --段關閉指令

SIGNAL cmd_7279     : STD_LOGIC_VECTOR (7 downto 0); --保存讀進來的操作命令
SIGNAL key_7279     : STD_LOGIC_VECTOR (7 downto 0); --保存從7279讀出來的按鍵值
SIGNAL key_7279_tmp : STD_LOGIC_VECTOR (7 downto 0); --從7279讀鍵值,加一級緩存,鍵有效方才放入鍵值寄存器
SIGNAL cmd_tmp      : STD_LOGIC_VECTOR (7 downto 0); --保存操作命令到移位緩存
SIGNAL cmd_tmp1     : STD_LOGIC_VECTOR (7 downto 0); --進入START狀態后,操作命令緩存,因為2字節指令中讀鍵盤操作有所特殊,需要判斷
SIGNAL data_tmp     : STD_LOGIC_VECTOR (7 downto 0); --進入START狀態后,操作數據緩存
SIGNAL data_tmp1    : STD_LOGIC_VECTOR (7 downto 0); --保存操作數據到移位緩存
SIGNAL scmd_cnt     : INTEGER RANGE 0 to 7;          --命令字移位計數器
SIGNAL sdata_cnt    : INTEGER RANGE 0 to 7;          --數據字移位計數器,與鍵盤值讀取計數器復用
SIGNAL delay_cnt	: INTEGER RANGE 0 to 3;
SIGNAL seg_cnt		: INTEGER RANGE 0 to 7;			 --數碼管計數器,從右到左一共8個數碼管

SIGNAL f_edge_cnt	: INTEGER RANGE 0 to 10;	--檢測到KEY7279后,延時計數器
SIGNAL key_flag		: STD_LOGIC;				--按鍵標志,計數器溢出標志

SIGNAL cmd_start	: STD_LOGIC;		--單字節指令判斷開始標志
SIGNAL data_start	: STD_LOGIC;		--雙字節指令,由數據來判斷開始標志
SIGNAL cmd_start_tmp	: STD_LOGIC;	--緩存單字節指令判斷開始標志
SIGNAL data_start_tmp	: STD_LOGIC;	--緩存由數據來判斷開始標志

TYPE SEG_Register IS ARRAY ( 0 To 7) of STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL seg_r 		:SEG_Register;
SIGNAL data_7279 	:SEG_Register;
SIGNAL decode_bus 	:STD_LOGIC_VECTOR (7 downto 0);	--從D_BUS讀進數據來后,解碼
TYPE STATE_TYPE is (IDLE, START, START_DELAY, SHIFT_CMD_LOW, 
					SHIFT_CMD_HIGH,	NEXT_DELAY,  SHIFT_DATA_LOW, SHIFT_DATA_HIGH, 
					SHIFT_KEY_LOW, SHIFT_KEY_HIGH, SHIFT_KEY_HIGH1, FINISH );
	signal state : STATE_TYPE;
TYPE STATE_TYPE1 IS (IDLE, START_WR, STOP);
	SIGNAL state1: STATE_TYPE1;	
BEGIN

	OUT7279 <= key_7279;
	
--直接對7279控制的狀態機
process(CLK_S,RST_N)
	begin
	if (RST_N = '0') then
		state <= IDLE;
		key_7279 <= x"00";
		CS7279 <= '1';
		CLK7279 <= '0';
		DAT7279 <= 'Z';
		state <= IDLE;
	elsif falling_edge(CLK_S) then
		case state is
			when IDLE =>
				if (KEY7279 = '0') then
					cmd_tmp <= RDKY_7279;--為了測試讀鍵盤操作
					DAT7279 <= 'Z';
					state <= START; 
				else
					if (seg_cnt = 7) then
						seg_cnt <= 0;
					else
						seg_cnt <= seg_cnt + 1;						
					end if;
					cmd_tmp <= NDC_7279(7 downto 3) & CONV_STD_LOGIC_VECTOR(seg_cnt,3);
					data_tmp <= data_7279(seg_cnt);
					state <= START; 
				end if;					
			when START =>
				delay_cnt <= 3;
				CS7279 <= '0';			--7279片選置低,開始4次延時,即80us
				CLK7279 <= '0';			--設置時鐘為低
				state <= START_DELAY;
			
			--開始發送命令字-------------------------------------------------
			when START_DELAY =>
				if (delay_cnt > 1) then
					delay_cnt <= delay_cnt - 1;
				else
					scmd_cnt <= 7;		--80us延時結束,開始送命令字
					state <= SHIFT_CMD_LOW;
				end if;
			when SHIFT_CMD_LOW =>		--1位數據送到數據線上
				DAT7279 <= cmd_tmp1(scmd_cnt);	--用命令字的二級緩存做
				CLK7279 <= '1';			--時鐘信號由低變高
				state <= SHIFT_CMD_HIGH;
			when SHIFT_CMD_HIGH =>
				CLK7279 <= '0';		--一外時鐘后,時鐘信號由高變低
				if (scmd_cnt > 0) then
					scmd_cnt <= scmd_cnt - 1;
					state <= SHIFT_CMD_LOW;					
				--當為雙字節操作時,交替間斷的延時
				elsif (data_start_tmp = '1') or (cmd_tmp1 = RDKY_7279) then
					delay_cnt <= 3;
					state <= NEXT_DELAY;
				else
					state <= FINISH;
				end if;
			
			--開始發送8位數據------------------------------------------------
			when NEXT_DELAY =>
				if (delay_cnt >1) then
					delay_cnt <= delay_cnt - 1;
				elsif (cmd_tmp = RDKY_7279) then	--當為鍵盤接收指令時
					sdata_cnt <= 7;
					state <= SHIFT_KEY_LOW;			--進行讀取按鍵
				else
					sdata_cnt <= 7;
					state <= SHIFT_DATA_LOW;		--80us延時結束,進入數據傳輸
				end if;
			when SHIFT_DATA_LOW =>					--1位數據送到數據線上
				DAT7279 <= data_tmp1(sdata_cnt);
				CLK7279 <= '1';						--時鐘信號由低變高
				state <= SHIFT_DATA_HIGH;
			when SHIFT_DATA_HIGH =>
				CLK7279 <= '0';						--時鐘信號由高變低
				if (sdata_cnt > 0) then					
					sdata_cnt <= sdata_cnt - 1;
					state <= SHIFT_DATA_LOW;
				else
					state <= FINISH;
				end if;
			
			--讀取按鍵值-----------------------------------------------------
			when SHIFT_KEY_LOW =>
				CLK7279 <= '1';						--時鐘信號由低變高,DAT7279變為輸入狀態
				DAT7279 <= 'Z';
				state <= SHIFT_KEY_HIGH;
			when SHIFT_KEY_HIGH =>					--保證一個時鐘周期的建立時間
				--key_7279(sdata_cnt) <= DAT7279;
				key_7279_tmp(sdata_cnt) <= DAT7279;
				state <= SHIFT_KEY_HIGH1;
			when SHIFT_KEY_HIGH1 =>
				CLK7279 <= '0';						--低電平后為一個時鐘周期的保持時間
				if (sdata_cnt > 0) then					
					sdata_cnt <= sdata_cnt - 1;
					state <= SHIFT_KEY_LOW;
				else
					if (KEY7279 = '0') then			--當讀取完后,KEY7279仍為0才能確定讀取的為有效值
						key_7279 <= key_7279_tmp;
					end if;
					state <= FINISH;
				end if;
								
			--結束操作-------------------------------------------------------
			when FINISH =>
				CS7279 <= '1';		--7279片選置高,結束操作
				state <= IDLE;				
			when others =>
				NULL;
		end case;
	end if;
end process;

process(CLK_S,RST_N)
	begin
	if (RST_N = '0') then
		cmd_start <= '0';
		data_start <= '0';
	elsif falling_edge(CLK_S) then
		case state is
			when IDLE =>
				if (KEY7279 = '0') then
					cmd_start <= '1';	--為了測試
					data_start <= '0';	--為了測試	
				else
					cmd_start <= '0';	--為了測試
					data_start <= '1';	--為了測試	
				end if;	
			when START => --IDLE =>
				cmd_tmp1 <= cmd_tmp;	--為防止丟失雙字節指令,所以多加一級緩存
				data_tmp1 <= data_tmp;
				cmd_start_tmp <= cmd_start;
				data_start_tmp <= data_start;
			when others =>
				NULL;
		end case;
	end if;
end process;

--讀鍵值標志位
KEY_EN <= not key_flag;		--高電平,鍵值有效,(一般用高電平表示有效,用沿的話一般用下降沿表示有效)
process(KEY7279,CLK,RST_N)
	begin
	if (RST_N = '0') then
		key_flag <= '1';
	elsif (RD_N = '0') then
		key_flag <= '1';			--讀鍵值寄存器key_7279時,清key_flag鍵值標志
	elsif rising_edge(KEY7279) then	--7279上升沿時,即按鍵已釋放
		key_flag <= '0';			--key_flag下降沿,通知外部,可以讀鍵值了
	end if;
end process;

--解碼模塊,從數據到顯示碼
decode_bus <= 	"00000000" when (D_BUS = "11111111") else	--D_BUS為x"FF"時,清除顯示
				D_BUS(7) & "1111110" when (D_BUS(3 downto 0) = "0000") else	--0,D_BUS(7)小數點位
				D_BUS(7) & "0110000" when (D_BUS(3 downto 0) = "0001") else	--1
				D_BUS(7) & "1101101" when (D_BUS(3 downto 0) = "0010") else	--2
				D_BUS(7) & "1111001" when (D_BUS(3 downto 0) = "0011") else	--3
				D_BUS(7) & "0110011" when (D_BUS(3 downto 0) = "0100") else	--4
				D_BUS(7) & "1011011" when (D_BUS(3 downto 0) = "0101") else	--5
				D_BUS(7) & "1011111" when (D_BUS(3 downto 0) = "0110") else	--6
				D_BUS(7) & "1110000" when (D_BUS(3 downto 0) = "0111") else	--7
				D_BUS(7) & "1111111" when (D_BUS(3 downto 0) = "1000") else	--8
				D_BUS(7) & "1111011" when (D_BUS(3 downto 0) = "1001") else	--9
				D_BUS(7) & "1110111" when (D_BUS(3 downto 0) = "1010") else	--a
				D_BUS(7) & "0011111" when (D_BUS(3 downto 0) = "1011") else	--b
				D_BUS(7) & "1001110" when (D_BUS(3 downto 0) = "1100") else	--c
				D_BUS(7) & "0111101" when (D_BUS(3 downto 0) = "1101") else	--d
				D_BUS(7) & "1001111" when (D_BUS(3 downto 0) = "1110") else	--e
				D_BUS(7) & "1000111" when (D_BUS(3 downto 0) = "1111") else	--f
				"00000000";

--外部控制接口的寫操作
process(CLK,RST_N)
	begin
	if(RST_N = '0') then
		for i in 0 to 7 loop
			data_7279(i) <= x"00";
			--data_7279(i) <= CONV_STD_LOGIC_VECTOR(i,8); --測試用
		end loop;
	elsif falling_edge(CLK) then
		case state1 is
			when IDLE =>
				if (WR_N = '0') then	--只有在WR_N與state狀態為IDLE時,才允許接收命令
					state1 <= START_WR;
				end if;
			when START_WR =>
				if (WR_N = '0') then	
					--data_7279(CONV_INTEGER(ADDR)) <= D_BUS; 		--DC0_7279或DC1_7279
					data_7279(CONV_INTEGER(ADDR)) <= decode_bus;	--NDC_7279
				else
					state1 <= STOP;
				end if;
			when STOP =>
				state1 <= IDLE;
			when others =>
				NULL;
		end case;
	end if;
end process;



END behav;

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久综合av免费| 日本不卡一区二区三区 | 国产成人99久久亚洲综合精品| 国产成人自拍网| 欧美一级日韩一级| 一区二区三区四区乱视频| 国产综合一区二区| 欧美精三区欧美精三区| 亚洲三级理论片| 国产在线看一区| 欧美一区二区三区在线| 一区二区三区av电影| 大美女一区二区三区| 久久久久国产一区二区三区四区| 午夜国产精品影院在线观看| 色94色欧美sute亚洲13| 国产精品国产a| 国产福利精品一区二区| 精品av综合导航| 精品一区二区免费| 日韩欧美中文字幕公布| 亚洲一区二区三区影院| 不卡的电视剧免费网站有什么| 久久久久久久久久电影| 精品一区二区三区视频| 日韩精品在线网站| 蜜臀久久久99精品久久久久久| 欧美色欧美亚洲另类二区| 一区二区三区四区视频精品免费| 99re66热这里只有精品3直播| 欧美激情在线一区二区| 国产99久久久久| 国产精品久久久久影院亚瑟| 国产成人久久精品77777最新版本| 久久久久久久网| 国产精品一区二区x88av| 久久嫩草精品久久久精品| 国产在线精品一区二区三区不卡 | 精品一区二区三区蜜桃| 欧美v日韩v国产v| 国产一二精品视频| 欧美经典一区二区| 91亚洲午夜精品久久久久久| 亚洲欧美一区二区三区孕妇| 日本精品视频一区二区| 午夜精品在线看| 日韩欧美在线综合网| 精品一区二区三区香蕉蜜桃| 中文字幕国产精品一区二区| eeuss国产一区二区三区| 亚洲激情男女视频| 51精品视频一区二区三区| 精品一区二区三区蜜桃| 国产精品久久久久久亚洲伦| 91福利国产成人精品照片| 亚洲一区二区三区四区不卡| 欧美一区二区在线观看| 激情五月激情综合网| 国产精品国产馆在线真实露脸| 欧美亚洲免费在线一区| 久久精品国产秦先生| 中文字幕制服丝袜一区二区三区 | 男男视频亚洲欧美| 国产日韩v精品一区二区| 日本久久电影网| 激情六月婷婷久久| 一区二区国产盗摄色噜噜| 国产欧美日韩精品a在线观看| 91网站最新地址| 久久精品国产一区二区三| 亚洲色图欧美激情| 精品国产乱码久久久久久牛牛| 色综合天天综合色综合av| 另类的小说在线视频另类成人小视频在线| 久久毛片高清国产| 欧美日本一道本| av男人天堂一区| 国产一区二区三区黄视频| 亚洲综合激情网| 欧美国产精品中文字幕| 91精品国产综合久久精品图片 | 五月激情综合色| 欧美国产精品劲爆| 日韩一区二区在线免费观看| 99久久精品国产麻豆演员表| 国内精品第一页| 日产欧产美韩系列久久99| 自拍偷拍亚洲综合| 国产亚洲一区二区三区四区| 欧美情侣在线播放| 91麻豆国产香蕉久久精品| 国产电影精品久久禁18| 男男视频亚洲欧美| 午夜精品在线看| 亚洲国产日韩av| 亚洲久本草在线中文字幕| 亚洲国产精华液网站w| 欧美电影免费观看完整版| 欧美日韩欧美一区二区| 91小视频免费看| 成人午夜大片免费观看| 国产美女一区二区| 国产乱码精品一区二区三| 久久国产婷婷国产香蕉| 美国十次综合导航| 日韩成人午夜电影| 美日韩一区二区| 另类小说图片综合网| 免费高清在线视频一区·| 日韩精品国产欧美| 日本 国产 欧美色综合| 日本vs亚洲vs韩国一区三区| 亚洲va欧美va天堂v国产综合| 亚洲一区二区三区小说| 亚洲一级电影视频| 亚洲国产裸拍裸体视频在线观看乱了| 亚洲欧洲精品成人久久奇米网| 国产精品电影院| 国产精品国产自产拍高清av王其| 国产精品久久久久影视| 亚洲欧洲av一区二区三区久久| 国产精品美女久久久久久2018| 秋霞av亚洲一区二区三| 蜜桃一区二区三区四区| 国产一区中文字幕| 不卡的电影网站| 精品视频在线视频| 欧美一级精品大片| 久久免费偷拍视频| 亚洲三级电影网站| 亚洲成人激情av| 麻豆精品蜜桃视频网站| 国产精品一区二区三区99| 99精品国产一区二区三区不卡| 色综合激情五月| 制服丝袜国产精品| 国产欧美久久久精品影院| 成人免费一区二区三区在线观看| 一区二区三区中文字幕| 老司机精品视频导航| 成人黄色777网| 在线播放国产精品二区一二区四区| 欧美丰满少妇xxxxx高潮对白| 久久综合精品国产一区二区三区| 中文字幕在线不卡| 调教+趴+乳夹+国产+精品| 精品在线一区二区| 色婷婷av一区二区三区软件 | 免费成人av资源网| 成人美女视频在线观看| 欧美喷潮久久久xxxxx| 久久久蜜桃精品| 亚洲自拍偷拍麻豆| 国模娜娜一区二区三区| 91在线无精精品入口| 91精品国产91综合久久蜜臀| 中文字幕av免费专区久久| 丝袜脚交一区二区| www.日韩大片| 日韩午夜在线播放| 夜夜嗨av一区二区三区四季av| 欧美色中文字幕| 国产午夜亚洲精品午夜鲁丝片| 亚洲国产精品嫩草影院| 国产91高潮流白浆在线麻豆 | 激情五月播播久久久精品| 91麻豆自制传媒国产之光| 精品剧情v国产在线观看在线| 亚洲色图都市小说| 国产精品一级在线| 日韩一区二区精品在线观看| 亚洲女厕所小便bbb| 从欧美一区二区三区| 精品裸体舞一区二区三区| 香蕉乱码成人久久天堂爱免费| www..com久久爱| 久久青草欧美一区二区三区| 午夜精品福利一区二区三区蜜桃| av电影在线观看不卡| 国产欧美日韩综合精品一区二区| 日本伊人色综合网| 欧美日本一区二区| 亚洲图片自拍偷拍| 91免费观看在线| 亚洲视频在线观看一区| 成人毛片视频在线观看| 欧美国产欧美综合| 国产精品影音先锋| 久久久三级国产网站| 狠狠色综合日日| 精品国产乱码久久久久久牛牛| 免费看欧美女人艹b| 欧美一二三区在线| 全国精品久久少妇| 日韩免费视频一区二区| 蜜桃在线一区二区三区| 精品欧美一区二区三区精品久久| 免费在线看成人av| 精品日韩成人av| 国产成人午夜精品5599 |