主頁 > 軟體設計 > EDA課程設計報告——數字密碼鎖

EDA課程設計報告——數字密碼鎖

2022-01-03 08:44:11 軟體設計

EDA課程設計報告——數字密碼鎖

前言

大二上做的一個課程設計,一開始選這個題的時候看到網上有挺多代碼的還以為可以參考參考,不過自己寫的時候才發現許多的代碼跟自己的題目沒太大關系,然后自己寫,就開始了快半個月的折磨(哈哈哈~),因為臨近又期末考試,搞得我飯吃不下覺睡不好,作業系統的課設也沒做幾個(抱怨一下下嗚嗚嗚),現在想著把自己的設計給學弟學妹們參考一下,別像我一樣被折磨,雖然我的設計與題目要求的還是有點出入,不過還是拿的優秀,具體使用說明放在后面,

一、設計題目說明

題目十:數字密碼鎖設計(平臺實作)★★
完成一簡易密碼鎖的設計,實作6位密碼的設定與開鎖,
1)使用6個按鍵進行密碼輸入,K0-K5,分別代表數字鍵0-5,用右邊6個數碼管顯示;
2)密碼初始值為555555;開鎖方式:xxxxxx(x代表密碼數字,位數等于6位);上電后,初始顯示:"PP------";輸入一個數字就在最右數碼管顯示,前面的數字均左移一個數碼管,輸入正確顯示“–OPEN–”,輸入錯誤顯示“–EEEE–”,
3)設計一個重新輸入按鈕K6,在輸入未全或者錯誤(沒達到3次)時,恢復輸入,按下后顯示“PP------”
4)作業時鐘1khz;連續3次輸錯密碼則鎖死,只有重啟電路;連續2次錯誤點亮警報燈,
5 ) 用按鍵k7設定密碼,設定方式:舊密碼,輸入兩次,輸入前顯示為“OP------”,正確后提示輸入新密碼:“NP------”,連續輸入2次,以上出錯均顯示“–EEEE–”,可按K7恢復設定,或者K6,

二、設計題目與要求

  1. 學會在Quartus Ⅱ環境中運用VHDL語言設計方法構建具有一定邏輯功能的模塊,并能運用圖形設計方法完成頂層原理圖的設計,
  2. 掌握數字密碼鎖的主要功能與在電路板中的實作,
  3. 運用Quartus Ⅱ軟體中的仿真功能對所設計的數字密碼鎖的各個模塊及頂層電路的功能進行仿真分析,

三、總體設計

3.1基本原理

  1. 設計輸入
    本次大作業使用文本輸入的方式,采用VHDL語言撰寫各個模塊:消抖模塊、動態掃描顯示模塊、密碼比較模塊、密碼鎖控制模塊、計數模塊、譯碼模塊、密碼暫存器模塊,將每個模塊生成元件加入元件庫,最后將電路得到設計模塊采用原理圖的方式輸入,這種輸入方式直觀,且便于電路的觀察與修改,
  2. 設計處理
    本次大作業使用文本輸入的方式,采用VHDL語言撰寫各個模塊:消抖模塊、動態掃描顯示模塊、密碼比較模塊、密碼鎖控制模塊、計數模塊、譯碼模塊、密碼暫存器模塊,將每個模塊生成元件加入元件庫,最后將電路得到設計模塊采用原理圖的方式輸入,這種輸入方式直觀,且便于電路的觀察與修改,
  3. 設計驗證
    設計驗證即時序仿真和功能仿真,器件編程,板載測驗
    器件編程是指將設計處理中產生的編程資料下載到具體的可編程器件中,如果之前的步驟都滿足設計的要求,就可以將配接器產生的配置或下載檔案通過CPLD/FPGA編程器或下載電纜載入目標芯片CPLD或FPGA中,
    本次使用芯片為:FPGA10K20TC144-4
    開發環境:Quartus II 9.0 sp2 Web Edition

3.2總體結構分析與設計

根據層次化設計理論,該設計問題自頂向下可以分為消抖模塊、動態掃描顯示模塊、密碼比較模塊、密碼鎖控制模塊、計數模塊、譯碼模塊、密碼暫存器模塊,

四、實驗與仿真

4.1消抖模塊

因為按下FPGA的按鍵時,彈簧片最低震動頻率不會低于50 HZ,所以,兩次下降沿出現的時間差不會超過20ms,也就是說,當我們檢測到一次下降沿/上升沿之后,再在20ms內檢測是否有下降沿/上升沿產生,如果有,則重新檢測,如果沒有,則說明按鍵穩定,(一般而言,按鈕被釋放比按鈕被按下去的反彈要少很多)

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

entity E_shaking is
	port(clk:in std_logic;		--時鐘頻率,基準頻率為1000HZ,對應實驗板pin128
		DIN:in std_logic;		--按鍵
		Dout:out std_logic);		--輸出,若為1,表示按鍵按下,若為0,表示按鍵未按下
end entity;
  
architecture one of E_shaking is
signal count:integer range 0 to 20;	--計數
	begin
	process(clk)
	begin
		if(rising_edge(clk)) then	--上升沿
			if(DIN='0') then			--按鍵初始為1
				count<=count+1;
				if(count=20) then	--對應現實20ms
					Dout<='1';		--判斷是否有一段持續20ms的'0'狀態,若有即代表按下
				else
					Dout<='0';		--若無代表沒按下
				end if;
			else
				count<=0;
			end if;
		end if;
	end process;
end one;

4.2 密碼比較模塊

將輸入的兩個24位二進制代碼比較,相同輸出1,不同輸出0,

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

entity compare is
port(acc : in std_logic_vector(23 downto 0);
	old : in std_logic_vector(23 downto 0);
	yes : out std_logic);
end compare;

architecture beha of compare is
begin
	yes <= '1' when acc = old else '0';
end beha;

4.3譯碼模塊

將BCD碼譯為七段數碼管顯示

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

entity decode is
port(datain:in std_logic_vector(3 downto 0);
	dataout:out std_logic_vector(6 downto 0));
end entity;

architecture beha of decode is
begin
	process(datain)
	begin
	case datain is
	when "0000" => dataout <= "0111111";-- 0
	when "0001" => dataout <= "0000110";-- 1
	when "0010" => dataout <= "1011011";-- 2
	when "0011" => dataout <= "1001111";-- 3
	when "0100" => dataout <= "1100110";-- 4
	when "0101" => dataout <= "1101101";-- 5
	when "0110" => dataout <= "1110011";-- P
	when "0111" => dataout <= "1111001";-- E
	when "1000" => dataout <= "0110111";-- N
	when others => dataout <= "1000000";-- "-"
	end case;
	end process;
end beha;

4.4密碼寄存模塊

Set端為使能端,控制是否修改密碼,高電平有效,clk為作業時鐘基準1000HZ,acc為當前輸入的密碼,old為舊密碼輸出給控制器,default_code初始設定為初始密碼,

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

entity code_register is
port(set,clk : in std_logic;
	acc : in std_logic_vector(23 downto 0);
	old : out std_logic_vector(23 downto 0));
end code_register;

architecture beha of code_register is
signal code : std_logic_vector(23 downto 0);
signal default_code : std_logic_vector(23 downto 0):="010101010101010101010101";
signal Q,isold : std_logic := '1';

begin
	process(clk)
	begin
		if(rising_edge(clk))then
			Q<=set;
			if(Q='0' and set = '1')then
				code<=acc;
				isold<='0';
			end if;
			
			if(isold = '0')then
				default_code<=code;
				old<=code;
			else
				old<=default_code;
			end if;
		end if;
	end process;
end beha;

4.5計數模塊

cnt為上一模塊的密碼輸入,每輸入一次給一高電平,結構體內以cnt為敏感信號量,yes是密碼正確時給高電平,將錯誤次數清零,當密碼錯誤次數達2時給alarm高電平輸出到display模塊顯示警報燈,達3次時deadlock輸出為1,display模塊顯示“EEEEEE”,死鎖,此時所有按鍵失效,只有重新上電,

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

entity counter is
port(cnt : in std_logic;
	yes : in std_logic;
	alarm : buffer std_logic;
	deadlock : out std_logic );
end counter;

architecture beha of counter is
signal change : integer range 0 to 3 :=0; --記錄錯誤次數
begin
	process(cnt)
	begin
		if(rising_edge(cnt))then
			change <= change+1;
		end if;

		if(yes = '1')then
			change<=0;
		end if;

		if(change = 2)then
			alarm<='1';
			deadlock<='0';
		elsif(change = 3)then
			deadlock<='1';
		else
			deadlock<='0';
			alarm<='0';
		end if;
	end process;
end beha;

4.6控制模塊

clk為作業時鐘1000HZ,K0-K7為消抖后的按鍵輸入,old是來自code_register模塊的舊密碼輸入,acc是當前輸入的密碼,達到六位時送入比較器比較,recode信號是否修改暫存器所存盤的密碼,C是計數信號,se代表在修改密碼時的三次密碼比較只要有一次出錯就賦值為‘1’給display模塊顯示“-EEEE-”,rs代表兩次新密碼都正確時改為‘1’,B[2…0]當前輸入密碼的位數,

在重置密碼模式中,要輸入兩次舊密碼,兩次新密碼,每當Bi=”110”時按下一次重新輸入按鈕K6,統計密碼輸入次數的integer變數count加1,當count=1時將data值賦給暫存器R1,并比較R1與暫存器模塊里面存盤的密碼;當count=2時將data值賦給暫存器R2,并比較R1與R2;當count=3時將data值賦給暫存器R3,將RS賦值為‘1’;當count=4時將data值賦給暫存器R4,并比較R3與R4,

上面3次比較只要有一次出現錯誤則將密碼輸入和控制器模塊的阻塞信號量blocking賦值為’1’,將信號量SE賦值為‘1’,此時K0~K6按鍵全部失效,只有按下K7退出設計密碼模式將blocking賦值為’0’,才能再次設計密碼,

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

entity contral is
port (clk,K0,K1,K2,K3,K4,K5,K6,K7 : in std_logic;
	acc : buffer std_logic_vector(23 downto 0);--當前輸入的密碼達到六位時輸出,
	reset : buffer std_logic := '1'; --兩次新密碼和兩次舊密碼都正確時改為‘0’,
	recode : out std_logic := '0';--是否修改暫存器所存盤的密碼
	c : out std_logic;
	se,rs : out std_logic:='0';--se代表在修改密碼時的三次密碼比較只要有一次出錯就賦值為‘1’,rs代表兩次新密碼都正確時改為‘1’,
	B : buffer std_logic_vector(2 downto 0);--當前輸入密碼的位數,
	old : in std_logic_vector(23 downto 0));--舊密碼,從暫存器中來,
end contral;

architecture beha of contral is
signal key0,key1,key2,key3,key4,key5,key6,key7 : std_logic;
signal cnt : integer range 0 to 4 :=0;	
signal r1,r2,r3,r4 : std_logic_vector(23 downto 0);
signal lock : std_logic:='0';

begin
	process(clk)
	begin
		if(rising_edge(clk))then
			key0<=K0;key1<=K1;key2<=K2;key3<=K3;key4<=K4;key5<=K5;key6<=K6;key7<=K7;
			
			if(lock = '0')then
				if(key0 = '0' and K0 = '1')then
					B<=B+1;
					acc(23 downto 4)<=acc(19 downto 0);
					acc(3 downto 0)<="0000";
				end if;
				
				if(key1 = '0' and K1 = '1')then
					B<=B+1;
					acc(23 downto 4)<=acc(19 downto 0);
					acc(3 downto 0)<="0001";
				end if;
				
				if(key2 = '0' and K2 = '1')then
					B<=B+1;
					acc(23 downto 4)<=acc(19 downto 0);
					acc(3 downto 0)<="0010";
				end if;
				
				if(key3 = '0' and K3 = '1')then
					B<=B+1;
					acc(23 downto 4)<=acc(19 downto 0);
					acc(3 downto 0)<="0011";
				end if;
				
				if(key4 = '0' and K4 = '1')then
					B<=B+1;
					acc(23 downto 4)<=acc(19 downto 0);
					acc(3 downto 0)<="0100";
				end if;
				
				if(key5 = '0' and K5 = '1')then
					B<=B+1;
					acc(23 downto 4)<=acc(19 downto 0);
					acc(3 downto 0)<="0101";
				end if;
				
				if(key6 = '0' and K6 = '1')then
					B<="000";				
					if(reset = '1')then
						cnt<=cnt+1;
						if(cnt = 4)then
							cnt<=0;
						else
							recode<='0';
						end if;
					else
						recode<='0';
					end if;
				end if;
			end if;
			    	
			if(key7 = '0' and K7 = '1')then
				recode<='0';
				lock<='0';
				cnt<=0;
				c<='0';
				B<="000";
				reset<=not reset;
			end if;	
                
			if(B = "000" and lock = '0')then
				if(cnt = 1)then
					r1<=acc;
					rs<='0';
					if(acc = old)then--第一次比較
						se<='0';
						rs<='1';
					else
						se<='1';
						lock<='1';
					end if;
				elsif(cnt = 2)then
					r2<=acc;
					if(r1 = acc)then --第二次比較
						se<='0';
						rs<='1';
						c<='1';
					else
						se<='1';
						lock<='1';
					end if;
				elsif(cnt = 3)then
					r3<=acc;
					se<='0';
					rs<='1';
				elsif(cnt = 4)then
					rs<='1';
					r4<=acc;
					if(r3 = acc)then--第三次比較
						recode<='1';
						se<='0';
						rs<='1';
					else
						recode<='0';
						se<='1';
						rs<='0';
					end if;
				else
					se<='0';
					rs<='0';
				end if;
			end if;
		end if;
	end process;
end beha;

4.7動態掃描顯示模塊

clk為作業時鐘基準為1000HZ,cmp為比較模塊送來的密碼驗證,modifycode_mode密碼修改模式,se與rs的作用同控制模塊,K0-K7為消抖后的按鍵輸入與控制模塊的輸入同步,用于顯示每次按鍵的輸入數值,sel為片選信號,共有8個,低電平有效,8個數碼區的片選全部賦值為0了,這樣8個數碼管就全部有效,同時顯示(片選的意思是選擇哪一個數碼管有效),

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

entity display is
port(clk,cmp,modifycode_mode,deadlock,se,rs : in std_logic;
	K0,K1,K2,K3,K4,K5,K6,K7: in std_logic;
	B : in std_logic_vector(2 downto 0);
	c : in std_logic;
	cnt : out std_logic;
	sel : buffer std_logic_vector(7 downto 0);
	BCD : buffer std_logic_vector(3 downto 0));
end display;

architecture beha of display is
signal code1,code2,code3,code4,code5,code6:std_logic_vector(3 downto 0):="1001";
signal code : std_logic_vector(3 downto 0);
signal cnt8 : integer range 0 to 7;
signal input,test,input1,input2 : std_logic:='0';
begin	
	process(clk)
	begin
		if(rising_edge(clk)) then
			test <= K0 or K1 or K2 or K3 or K4 or K5 or K6 or K7;
		end if;
	end process;
	
	process(test,clk)
	begin
		if(rising_edge(test))then
			code6(3 downto 0)<=code5(3 downto 0);
			code5(3 downto 0)<=code4(3 downto 0);
			code4(3 downto 0)<=code3(3 downto 0);
			code3(3 downto 0)<=code2(3 downto 0);
			code2(3 downto 0)<=code1(3 downto 0);
			code1(3 downto 0)<=code(3 downto 0);
			end if;
		if(K6 = '1' or k7 = '1')then
			code6(3 downto 0)<="1001";
			code5(3 downto 0)<="1001";
			code4(3 downto 0)<="1001";
			code3(3 downto 0)<="1001";
			code2(3 downto 0)<="1001";
			code1(3 downto 0)<="1001";
		end if;
		if(B = "111")then
			code6(3 downto 0)<="1001";
			code5(3 downto 0)<="1001";
			code4(3 downto 0)<="1001";
			code3(3 downto 0)<="1001";
			code2(3 downto 0)<="1001";
			code1(3 downto 0)<="1001";
		end if;
	end process;
	
	process(clk)
	begin
		if(K0 = '1') then code <="0000";
			elsif(K1 = '1')then code <="0001";
			elsif(K2 = '1')then code <="0010";
			elsif(K3 = '1')then code <="0011";
			elsif(K4 = '1')then code <="0100";
			elsif(K5 = '1')then code <="0101";
			end if;
	end process;
	
	process(clk)
	begin
		if(rising_edge(clk))then
			if(cnt8 = 7)then
				cnt8<=0;
			else
				cnt8<=cnt8+1;
			end if;
			
			if(deadlock = '1')then
				case cnt8 is
				when 0 => sel <="11111110";BCD<="0111";
				when 1 => sel <="11111101";BCD<="0111";
				when 2 => sel <="11111011";BCD<="0111";
				when 3 => sel <="11110111";BCD<="0111";
				when 4 => sel <="11101111";BCD<="0111";
				when 5 => sel <="11011111";BCD<="0111";
				when 6 => sel <="10111111";BCD<="0111";
				when 7 => sel <="01111111";BCD<="0111";
				end case;
			else
				if(modifycode_mode = '0')then 
					if(B = "110")then
						if(cmp = '1')then
							cnt<='0';
							case cnt8 is
							when 0 => sel <="11111110";BCD<="1001";
							when 1 => sel <="11111101";BCD<="1001";
							when 2 => sel <="11111011";BCD<="1000";
							when 3 => sel <="11110111";BCD<="0111";
							when 4 => sel <="11101111";BCD<="0110";
							when 5 => sel <="11011111";BCD<="0000";
							when 6 => sel <="10111111";BCD<="1001";
							when 7 => sel <="01111111";BCD<="1001";
							end case;
						else
							cnt<='1';
							case cnt8 is
							when 0 => sel <="11111110";BCD<="1001";
							when 1 => sel <="11111101";BCD<="1001";
							when 2 => sel <="11111011";BCD<="0111";
							when 3 => sel <="11110111";BCD<="0111";
							when 4 => sel <="11101111";BCD<="0111";
							when 5 => sel <="11011111";BCD<="0111";
							when 6 => sel <="10111111";BCD<="1001";
							when 7 => sel <="01111111";BCD<="1001";
							end case;
						end if;
					else
						cnt<='0';
						case cnt8 is
							when 0 => sel <="11111110";BCD<=code1;
							when 1 => sel <="11111101";BCD<=code2;
							when 2 => sel <="11111011";BCD<=code3;
							when 3 => sel <="11110111";BCD<=code4;
							when 4 => sel <="11101111";BCD<=code5;
							when 5 => sel <="11011111";BCD<=code6;
							when 6 => sel <="10111111";BCD<="0110";
							when 7 => sel <="01111111";BCD<="0110";
						end case;
					end if;
				else
					cnt<='0';
					if(se = '1')then
						case cnt8 is
							when 0 => sel <="11111110";BCD<="1001";
							when 1 => sel <="11111101";BCD<="1001";
							when 2 => sel <="11111011";BCD<="0111";
							when 3 => sel <="11110111";BCD<="0111";
							when 4 => sel <="11101111";BCD<="0111";
							when 5 => sel <="11011111";BCD<="0111";
							when 6 => sel <="10111111";BCD<="1001";
							when 7 => sel <="01111111";BCD<="1001";
						end case;
					else
						if(c='0')then 
							case cnt8 is
							when 0 => sel <="11111110";BCD<=code1;
							when 1 => sel <="11111101";BCD<=code2;
							when 2 => sel <="11111011";BCD<=code3;
							when 3 => sel <="11110111";BCD<=code4;
							when 4 => sel <="11101111";BCD<=code5;
							when 5 => sel <="11011111";BCD<=code6;
							when 6 => sel <="10111111";BCD<="0110";
							when 7 => sel <="01111111";BCD<="0000";
							end case;
						elsif(B = "110" and c='1')then 
							case cnt8 is
							when 0 => sel <="11111110";BCD<=code1;
							when 1 => sel <="11111101";BCD<=code2;
							when 2 => sel <="11111011";BCD<=code3;
							when 3 => sel <="11110111";BCD<=code4;
							when 4 => sel <="11101111";BCD<=code5;
							when 5 => sel <="11011111";BCD<=code6;
							when 6 => sel <="10111111";BCD<="0110";
							when 7 => sel <="01111111";BCD<="1000";
							end case;
						else
							if(rs = '0')then
								case cnt8 is
								when 0 => sel <="11111110";BCD<=code1;
								when 1 => sel <="11111101";BCD<=code2;
								when 2 => sel <="11111011";BCD<=code3;
								when 3 => sel <="11110111";BCD<=code4;
								when 4 => sel <="11101111";BCD<=code5;
								when 5 => sel <="11011111";BCD<=code6;
								when 6 => sel <="10111111";BCD<="0110";
								when 7 => sel <="01111111";BCD<="0000";
								end case;
							elsif(rs = '1')then
								case cnt8 is
								when 0 => sel <="11111110";BCD<=code1;
								when 1 => sel <="11111101";BCD<=code2;
								when 2 => sel <="11111011";BCD<=code3;
								when 3 => sel <="11110111";BCD<=code4;
								when 4 => sel <="11101111";BCD<=code5;
								when 5 => sel <="11011111";BCD<=code6;
								when 6 => sel <="10111111";BCD<="0110";
								when 7 => sel <="01111111";BCD<="1000";
								end case;
							end if;
						end if;
					end if;
				end if;
			end if;
		end if;
	end process;
end beha;

五、設計結論與分析

系統測驗結論:基本實作了題目要求的功能,不過方式有些許出入,

優點:完成了基本功能和補充內容中的功能,

不足:沒有在修改密碼后自動跳回上鎖界面,

可擴展性分析 :

  1. 可以設定任意位的密碼(不超過6位);

  2. 可以設定管理員模式,在用戶忘記密碼是可進入管理員模式修改密碼或解除死鎖,

六、小結與心得體會

  1. 要養成看API或者說明檔案的習慣;

  2. 在最后除錯的時候數碼管顯示一直有問題,在同學的幫助下發現是0/1表示的問題;

  3. 動態掃描就是數碼管不斷變化,當變化速度超過人眼的識別范圍,看起來就像數碼管一直顯示,需要一個七位段選信號和一個八位片選信號,然后這個信號對應比較麻煩,

  4. 板載實驗中,數碼管數字跳的太快或者太慢的問題,在數碼管后邊有頻率說明,但是沒有直觀感受,切換引腳多試幾次就明白了;

  5. 不可以使用在行程中對信號量的賦值作為判斷條件,因為行程中的所有信號量只有在行程結束時才會被賦值,

  6. 多時鐘問題,

    在寫代碼程序,在控制模塊的行程使用了多個時鐘信號來滿足不同的功能,

    例如:在主行程中同時使用了判斷條件(rising_edge(clk))和(rising_edge(K)),這個錯誤主要是由于一個process不可以由兩個時鐘觸發,會產生競爭冒險,
    解決方法:利用信號的值在行程結束以后才會更新的特點,利用暫存器來判斷信號是否出現上升沿,

七、使用方法

  1. 密碼鎖默認密碼為555555,
  2. 輸入密碼未3達六位是可按K6重新輸入,
  3. 密碼錯誤兩次警報燈亮起,錯誤三次進入死鎖,死鎖后只有重新上電才會恢復,
  4. 開鎖后按任意鍵自動上鎖,
  5. 按下K7進入修改密碼模式,每輸入一次密碼按K6確認,前兩次為舊密碼輸入,后兩次為新密碼輸入,輸入四次后按下K7退出修改密碼模式,密碼修改成功后只能使用新密碼開鎖,舊密碼失效,

后記

個人能力有限,代碼難免有錯誤、不足和冗余歡迎大家指正,在自己能力范圍內會盡量修改,希望能和大家一起討論,交流學習,

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/401698.html

標籤:其他

上一篇:復習330+天,我總結了一份對大多數人都適用的復習經驗

下一篇:C++中map/set和unordered_map/unordered_set的區別及其適用情況

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more