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

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

?? fpga_7279.vhd

?? AD0820小程序
?? 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) & "0000001" when (D_BUS(3 downto 0) = "1010") else	---
				D_BUS(7) & "0000000" when (D_BUS(3 downto 0) = "1011") else	--NULL
				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小说网| 国产日韩在线不卡| 日本伊人色综合网| 一本大道久久a久久综合婷婷| 8x8x8国产精品| 亚洲成av人片一区二区| 精品人伦一区二区色婷婷| 欧美日韩情趣电影| 一区二区欧美在线观看| 91麻豆精品国产91久久久资源速度| 国内精品免费**视频| 亚洲日本丝袜连裤袜办公室| 久久精品国产秦先生| 欧美一区二区视频观看视频| 一区在线播放视频| 色婷婷久久久综合中文字幕| 久久视频一区二区| 美女www一区二区| 91精品久久久久久久91蜜桃| 国产精品久久久久aaaa| 不卡av电影在线播放| 中文av一区二区| 91农村精品一区二区在线| 国产精品大尺度| 色婷婷av一区二区| 香蕉久久一区二区不卡无毒影院| 欧洲在线/亚洲| 蜜臀av性久久久久蜜臀aⅴ四虎 | 欧美日韩免费一区二区三区| 亚洲婷婷国产精品电影人久久| 粉嫩aⅴ一区二区三区四区五区| 欧美激情一区二区| 99精品国产99久久久久久白柏| 亚洲精品视频在线观看免费| 视频精品一区二区| 麻豆视频一区二区| 91在线视频免费91| 一区二区三区精品| 美女网站在线免费欧美精品| 成人午夜大片免费观看| 欧美日韩国产高清一区| 国产人成亚洲第一网站在线播放| 亚洲一级片在线观看| 国产综合色在线视频区| 色妹子一区二区| 欧美精品一区二区三区四区| 亚洲精品国产一区二区精华液 | 久久品道一品道久久精品| 亚洲黄色av一区| va亚洲va日韩不卡在线观看| 国产精品私人自拍| 暴力调教一区二区三区| 国产精品乱码一区二区三区软件| 久久99久久精品欧美| 国产乱子伦一区二区三区国色天香| 欧美性生交片4| 亚洲精品国产精华液| www.亚洲色图| 欧美极品另类videosde| 豆国产96在线|亚洲| 国产三级一区二区| 91久久一区二区| 亚洲午夜一二三区视频| 欧美日韩亚洲另类| 日本中文一区二区三区| 精品奇米国产一区二区三区| 国产一区二区三区免费在线观看 | 成人涩涩免费视频| 日本一区二区高清| 在线观看www91| 国产一区亚洲一区| 亚洲免费av高清| 91精品国产美女浴室洗澡无遮挡| 久久99热狠狠色一区二区| 国产色一区二区| 欧美网站大全在线观看| 精品午夜久久福利影院| 一区在线观看视频| 日韩精品中文字幕一区二区三区 | 免费人成网站在线观看欧美高清| 日韩精品一区二区三区视频在线观看 | 91丨国产丨九色丨pron| 午夜视频在线观看一区二区| 亚洲国产精品激情在线观看| 欧美色图激情小说| 99热在这里有精品免费| 久草中文综合在线| 亚洲高清免费视频| 成人免费小视频| 久久久一区二区三区| 日韩精品一区二区三区swag| 欧美丝袜丝nylons| 91美女片黄在线观看| 成人爽a毛片一区二区免费| 久久狠狠亚洲综合| 蜜桃久久精品一区二区| 日韩不卡免费视频| 日本 国产 欧美色综合| 一区二区三区中文在线观看| 亚洲乱码中文字幕综合| 亚洲天堂成人网| 最新中文字幕一区二区三区| 国产精品卡一卡二卡三| 国产欧美日韩视频在线观看| 久久亚洲精精品中文字幕早川悠里| 欧美一区二区三区婷婷月色 | 91精品国产丝袜白色高跟鞋| 91麻豆精品国产91久久久资源速度| 欧美体内she精高潮| 欧美大白屁股肥臀xxxxxx| 日韩欧美国产一区二区三区| 久久久久99精品国产片| 国产精品天干天干在观线 | 一区二区三区在线观看网站| 亚洲尤物在线视频观看| 香港成人在线视频| 久久国产欧美日韩精品| 97se亚洲国产综合自在线不卡 | 国产精品久久久久久久久快鸭 | 久久综合久久综合亚洲| 国产精品女同互慰在线看| 亚洲福中文字幕伊人影院| 国产一区二区主播在线| 成人h版在线观看| 日韩久久精品一区| 一区二区成人在线视频| 国产伦精品一区二区三区在线观看| 99久久综合国产精品| 欧美日韩一区二区三区在线看| 6080午夜不卡| 国产精品国产三级国产aⅴ入口| 亚洲一区在线观看免费观看电影高清| 亚洲动漫第一页| av亚洲精华国产精华精| 精品国精品国产尤物美女| 亚洲精品成人精品456| 国产成人精品综合在线观看 | 国产精品一区在线观看你懂的| 国产成人精品影视| 久久久亚洲精品一区二区三区| 亚洲一区影音先锋| 91蝌蚪porny| 国产精品美女久久久久久久久| 加勒比av一区二区| 日韩一区二区视频| 久久99国产精品成人| 日韩欧美国产wwwww| 麻豆精品一二三| 欧美一区二区在线免费观看| 亚洲综合成人网| 欧美一区二区三区免费视频| 欧美大片国产精品| 国产在线一区二区| 3d动漫精品啪啪| 日韩成人dvd| 久久久久国产成人精品亚洲午夜| 亚洲va韩国va欧美va| 欧美亚洲丝袜传媒另类| 亚洲精品一二三| 国产精品一区一区| 欧美激情综合五月色丁香| 国产一区二区不卡| 国产欧美日韩麻豆91| 成人精品一区二区三区四区| 国产欧美中文在线| 99久久亚洲一区二区三区青草| 欧美经典一区二区三区| 欧美日韩在线播| 日韩二区三区四区| 欧美色精品在线视频| 青娱乐精品在线视频| 国产人久久人人人人爽| 欧美亚洲一区二区在线| 天使萌一区二区三区免费观看| 精品久久久三级丝袜| 色婷婷综合五月| 激情成人综合网| 亚洲一区二区三区不卡国产欧美| 日韩一二三区不卡| 日本道色综合久久| 91香蕉视频mp4| 国产盗摄视频一区二区三区| 一区二区不卡在线视频 午夜欧美不卡在| 欧美日韩一区小说| 91免费精品国自产拍在线不卡| 久久国产精品第一页| 日日夜夜免费精品| 亚洲日本电影在线| 中文字幕乱码亚洲精品一区| 这里是久久伊人| 99久久精品免费|