主頁 > 軟體設計 > 基于FPGA的籃球計分器

基于FPGA的籃球計分器

2021-10-30 10:02:59 軟體設計

一、籃球計分器的功能

按照籃球賽賽制進行設計,須具有24秒倒計時功能,十二分鐘計時功能,暫停功能,進球計分功能(1分,2分,3分)等,

二、具體實作方法

這個籃球計分器的實作采用top-down思想,具體分為6個模塊 分別為 控制模塊、計分模塊、計時模塊、24s倒計時模塊、按鍵消抖模塊、數碼管顯示模塊,

這個籃球計分器的輸入根據功能分析有以下幾個:系統時鐘、復位信號、暫停信號、加分信號(one、two、three)、控制給哪個隊伍加分的信號;輸出信號由于只有在數碼管上顯示,所以輸出信號就只有數碼管的段選與位選

三、各個模塊的實作方式

(1)、top模塊

top模塊主要是要了解各個模塊之間的連接方式,具體如下圖所示:

根據上圖所示,top模塊代碼應該為:

module top(
	input	clk,	//系統時鐘
	input	rst,	//復位信號
	input	stop,	//計時暫停 (撥碼按鍵)
	input	team,	//選擇加分的隊伍 (撥碼按鍵)
	input	ctrl,	//切換擋位	(按鍵)
	input	one,	//加一分	(按鍵)
	input	two,	//加兩分	(按鍵)
	input	three,	//加三分	(按鍵)
	
	output	wire [3:0] sel,	//數碼管位選
	output	wire [6:0] seg 	//數碼管段選
    );
	wire 		key_one;
	wire 		key_two;
	wire 		key_three;
	
	wire [15:0] date1;
	wire [15:0] date2;
	wire [15:0] date3;

	wire			en;
	wire		key_ctrl;
	wire  [2:0] out_ctrl;
	
//計分模塊
	xiaodou s0 (
		.clk(clk), 
		.rst(rst), 
		.key_in(one), 
		.key_flag(key_one)
	);
	xiaodou s1 (
		.clk(clk), 
		.rst(rst), 
		.key_in(two), 
		.key_flag(key_two)
	);
	xiaodou s2 (
		.clk(clk), 
		.rst(rst), 
		.key_in(three), 
		.key_flag(key_three)
	);
	jifen s3 (
		.clk(clk), 
		.rst(rst), 
		.key_one(key_one), 
		.key_two(key_two), 
		.key_three(key_three), 
		.team(team), 
		.date2(date2)
	);
	
//計時模塊
	jishi a0 (
		.clk(clk), 
		.rst(rst), 
		.stop(stop), 
		.date1(date1)
	);
//倒計時模塊
	daojishi b0 (
		.clk(clk), 
		.rst(rst), 
		.en(en), 
		.date3(date3)
	);
//控制模塊
	xiaodou c0 (
		.clk(clk), 
		.rst(rst), 
		.key_in(ctrl), 
		.key_flag(key_ctrl)
	);
	ctrl c1(
		.clk(clk), 
		.rst(rst), 
		.key_ctrl(key_ctrl), 
		.en(en), 
		.ctrl(out_ctrl)
	);
//顯示模塊
	xianshi d0 (
		.clk(clk), 
		.rst(rst), 
		.ctrl(out_ctrl), 
		.date1(date1), 
		.date2(date2), 
		.date3(date3), 
		.sel(sel), 
		.seg(seg)
	);
endmodule

(2)、控制模塊

控制模塊主要功能是切換擋位,本模塊他的輸入是有:系統時鐘、復位信號和經過按鍵消抖后的一個脈沖信號;其輸出是一個控制數碼管顯示的一個信號和倒計時模塊的使能信號en,由于我們要控制倒計時模塊何時開始倒計時,所以要引入這個使能信號,也就是按下ctrl按鈕切換到倒計時模塊時就開始倒計時,

具體代碼如下:

module ctrl(
	input	clk,
	input	rst,
	input	key_ctrl,
	
	output  reg 	en,
	output	reg [2:0] ctrl
    );
	
	reg [1:0] cnt;

	always@(posedge clk or negedge rst) begin
		if(rst==0)
			cnt<=0;
		else if(cnt=='d2&&key_ctrl == 1) 
			cnt<=0;
		else if(key_ctrl == 1)
			cnt<=cnt+1'd1;
	end

	always@(posedge clk or negedge rst) begin
		if(rst==0) begin
			ctrl<=0;
			en<=0;
		end
		else if(cnt==0) begin
			ctrl<=3'b000;
			en <=0;
		end
		else if(cnt==1) begin
			ctrl<=3'b001;
			en<=0;
		end
		else if(cnt=='d2) begin
			ctrl<=3'b010;
			en<=1;
		end
	end
endmodule

(3)、計時模塊

計時模塊的主要功能是12分鐘的計時并將現在所及的時間轉化為16位的輸出信號(輸出信號為BCD碼前八位表示分鐘,后八位表示秒數), 計時模塊的輸入主要有:系統時鐘、復位信號和一個暫停信號(stop)輸出只有一個位寬為16位的資料信號;此模塊中的暫停信號(stop)我們可以在一秒鐘的計數器中加一個信號當stop拉高時停止記數,這樣就可以將其暫停;

在此模塊要注意如何將目前所及的時間轉化為BCD碼,在這里我使用的是BCD計數器,將分鐘和秒數分開,分別用兩個8位的資料來記錄它們的資料,最后將其合并;

具體代碼如下:

module jishi(
	input	clk,
	input	rst,
	input	stop,
	
	output	[15:0] date1
    );
	
	localparam TIME_1S='d49_999_999;
	/* localparam TIME_1S='d4; */
	
	reg [25:0] cnt_1s;
	reg [7:0] dout_1;
	reg [7:0] dout_2;

//一秒鐘的計數器
	always@(posedge clk or negedge rst) begin
		if(rst==0)
			cnt_1s<='d0;
		else if(cnt_1s == TIME_1S)
			cnt_1s<='d0;
		else if(stop==0)
			cnt_1s<= cnt_1s + 1'd1;
		else 
			cnt_1s<=cnt_1s;
	end
	
//當前的秒數 并轉化為bcd碼
	always@(posedge clk or negedge rst)begin
		if(rst==0)
			dout_2<=1'd0;
		else if(dout_2[7:4]==4'b0101&&dout_2[3:0]==4'b1001&&cnt_1s == TIME_1S)
			dout_2<=1'd0;
		else if(dout_2[3:0]==4'b1001&&cnt_1s == TIME_1S) begin
			dout_2[3:0]<=0;
			dout_2[7:4]<=dout_2[7:4]+1'd1;
		end
		else if(cnt_1s == TIME_1S)
			dout_2[3:0]<=dout_2[3:0]+1'b1;
	end
//當前的分鐘數并轉化為bcd碼
	always@(posedge clk or negedge rst)begin
		if(rst==0)
			dout_1<=1'd0;
		else if(dout_1[7:4]==4'b0001&&dout_1[3:0]==4'b0010&&cnt_1s == TIME_1S)
			dout_1<=1'd0;
		else if(dout_1[3:0]==4'b1001&&cnt_1s == TIME_1S) begin
			dout_1[3:0]<=0;
			dout_1[7:4]<=dout_1[7:4]+1'd1;
		end
		else if(dout_2[7:4]==4'b0101&&dout_2[3:0]==4'b1001&&cnt_1s == TIME_1S)
			dout_1[3:0]<=dout_1[3:0]+1'b1;
	end
	
	assign date1={dout_1[7:0],dout_2[7:0]};
endmodule

(4)、計分模塊

計分模塊的主要功能是計算并記錄目前兩隊的分數并將其轉化為16位的輸出信號;本模塊的輸入有:系統時鐘、復位信號和三個經過消抖后的計分信號(key_one、key_two、key_three)輸出只有一個位寬為16位的資料信號

這里將資料轉化為BCD碼是要注意:由于我們不知道所加的分數是多少,所以有可能在加分后個位的分數大于9,所以此時BCD計數器在進位時要這要改寫:

else if(dout_1[3:0] >= 4'b1001)     begin
			dout_1[3:0] <= dout_1[3:0]-'d9;
			dout_1[7:4] <= dout_1[7:4] + 1'b1;
		end

此模塊代碼如下:

module jifen(
	input	clk,	//系統時鐘
	input	rst,	//復位信號
	input	key_one,	//加一分
	input	key_two,	//加兩分
	input	key_three,	//加三分
	input	team, //控制給那個隊伍加分
	
	output	wire	[15:0] date2	//輸出的資料
    );
	
	/* reg [6:0] score1;	//目前該加幾分
	reg [6:0] score2;	//目前該加幾分 */
	reg [7:0] dout_1;
	reg [7:0] dout_2;

//計算加分并將其轉化為bcd碼

//第一隊
	always@(posedge clk or negedge rst) begin
		if(rst==0)
			dout_1 <= 8'b00000000;
		else if(dout_1[3:0] >= 4'b1001)     begin
			dout_1[3:0] <= dout_1[3:0]-'d9;
			dout_1[7:4] <= dout_1[7:4] + 1'b1;
		end
		else  if(key_one == 1'b1 && team == 0)     begin
			dout_1[7:4] <= dout_1[7:4];
			dout_1[3:0] <= dout_1[3:0] + 1'b1;
		end
		else  if(key_two == 1'b1 && team == 0)     begin             
			dout_1[7:4] <= dout_1[7:4];
			dout_1[3:0] <= dout_1[3:0] + 'd2;
		end
		else  if(key_three == 1'b1 && team == 0)     begin
			dout_1[7:4] <= dout_1[7:4];
			dout_1[3:0] <= dout_1[3:0] + 'd3;
		end
	end

//第二隊
	always@(posedge clk or negedge rst) begin
		if(rst==0)
			dout_2 <= 8'b00000000;
		else if(dout_2[3:0] >= 4'b1001)       
		begin
			dout_2[3:0] <= dout_2[3:0]-'d9;
			dout_2[7:4] <= dout_2[7:4] + 1'b1;
		end
		else  if(key_one == 1'b1 && team == 1)     begin
			dout_2[7:4] <= dout_2[7:4];
			dout_2[3:0] <= dout_2[3:0] + 1'b1;
		end
		else  if(key_two == 1'b1 && team == 1)     begin             
			dout_2[7:4] <= dout_2[7:4];
			dout_2[3:0] <= dout_2[3:0] + 'd2;
		end
		else  if(key_three == 1'b1 && team == 1)     begin             
			dout_2[7:4] <= dout_2[7:4];
			dout_2[3:0] <= dout_2[3:0] + 'd3;
		end
	end
	
//將bcd碼轉為將要賦值的資料
	assign date2={dout_1[7:0],dout_2[7:0]};
	
endmodule

(5)、倒計時模塊

倒計時模塊的主要功能是24s的倒計時并將目前的時間轉化為BCD碼;本模塊的輸入是系統時鐘、復位信號和一個有控制模塊輸出的使能信號(用來控制何時開始倒計時);輸出是一個16位的資料信號(BCD碼)用來表示目前的時間

本模塊中同樣采用BCD計數器將資料信號轉化為BCD碼,不過與之前不同的是采用減法記數;

本模塊代碼如下:

module daojishi(
	input	clk,//系統時鐘
	input	rst,//復位信號
	input	en,//判斷何時開始倒計時 由控制模塊輸入
	
	output	[15:0]  date3	//輸出的資料信號
    );
	
	localparam TIME_001S='d499999;	
	/* localparam TIME_001S='d4; */
  
	reg [7:0] dout_1;
	reg [7:0] dout_2;
	
	reg [18:0] cnt_001s;
	

	always@(posedge clk or negedge rst) begin
		if(rst==0)
			cnt_001s<=0;
		else if(en==0)
			cnt_001s<=0;
		else if(cnt_001s == TIME_001S)
			cnt_001s<=0;
		else
			cnt_001s<=cnt_001s +1;
	end
	
	always@(posedge clk or negedge rst) begin
		if(rst==0)
			dout_2<=8'b0000_0000;
		else if(en==0)
			dout_2<=8'b0000_0000;
		else if(dout_1==0&&dout_2==0&&cnt_001s == TIME_001S) 
			dout_2<=dout_2;
		else if(dout_2==0&&cnt_001s == TIME_001S)
			dout_2<=8'b1001_1001;
		else if(dout_2[3:0]==0&&cnt_001s == TIME_001S) begin
			dout_2[7:4]<=dout_2[7:4] - 1'b1;
			dout_2[3:0]<=4'b1001;
		end
		else if(cnt_001s == TIME_001S)
			dout_2[3:0]<=dout_2[3:0] - 1'b1;
	end
	
	always@(posedge clk or negedge rst) begin
		if(rst==0)
			dout_1<=8'b0010_0100;
		else if(en==0)
			dout_1<=8'b0010_0100;
		else if(dout_1==0&&cnt_001s == TIME_001S)
			dout_1<=dout_1;
		else if(dout_1[3:0]==0&&cnt_001s == TIME_001S) begin
			dout_1[7:4]<=dout_1[7:4] - 1'b1;
			dout_1[3:0]<=4'b1001;
		end
		else if(dout_2==0&&cnt_001s == TIME_001S)
			dout_1[3:0]<=dout_1[3:0] - 1'b1;
	end
	
	assign date3={dout_1[7:0],dout_2[7:0]};
endmodule

(6)、按鍵消抖模塊

按鍵消抖模塊的主要功能是將一個輸入的按鍵信號濾波轉化為一個脈沖信號;具體實作辦法可以參見小梅哥《零基礎輕松學習FPGA,小梅哥FPGA設計思想與驗證方法視頻教程》

具體代碼如下:

module xiaodou(
	input	clk,
	input	rst,
	input	key_in,
	
	output	reg 	key_flag		//濾波后的信號(脈沖信號)
    );
	
		localparam
		IDEL	= 4'b0001,
		FILTER0	= 4'b0010,
		DOWN	= 4'b0100,
		FILTER1	= 4'b1000;
		
	reg [3:0] state;
	
	reg 	key_tem0;
	reg 	key_tem1;
	
	wire 	nedge;
	wire 	pedge;
	
	reg [19:0]	cnt;	//二十毫秒計數器
	reg			en_cnt;	//計數器使能信號
	reg 		cnt_full;//計數器記滿信號
	
//邊沿檢測	
	always@(posedge clk or negedge rst) begin
		if(rst==0) begin
			key_tem0<=0;
			key_tem1<=0;
		end
		else begin
			key_tem0 <= key_in;
			key_tem1 <= key_tem0;
		end
	end
	
	assign	nedge = !key_tem0 & key_tem1;		//下降沿
	assign	pedge =  key_tem0 & (!key_tem1);	//上升沿
	
//一段式狀態機
	always@(posedge clk or negedge rst )begin
	if(rst==0)  begin
		state <= IDEL;
		en_cnt <= 1'b0;
		key_flag<=1'd0;
	end
	else 
		case(state)
			IDEL:
				begin
					key_flag<=1'b0;
					if(nedge) begin
						state <=	FILTER0;
						en_cnt <= 1'b1; //計數器記數
					end
					else	
						state <=	IDEL;
				end
			FILTER0:
				if(cnt_full) begin
					state<= DOWN;
					en_cnt<=1'b0;
					key_flag<=1'b1;
				end
				else if(pedge) begin
					state<= IDEL;
					en_cnt <= 1'b0;
				end
				else
					state<= FILTER0;
			DOWN:
				begin
					key_flag<=1'b0;
					if(pedge)	begin
						state<=FILTER1;
						en_cnt<=1'b1;
					end
					else
						state<= DOWN;
				end
			FILTER1:
				if(cnt_full) begin
					state<= IDEL;
					en_cnt<=1'b0;
					key_flag<=1'b0;
				end
				else if(nedge) begin
					state<= DOWN;
					en_cnt <= 1'b0;
				end
				else
					state<= FILTER1;
			default: begin
				state<=IDEL;
				en_cnt<=1'b0;
				key_flag<=1'b0;
			end
		endcase		
	end
	
//二十毫秒計數器
	always@(posedge clk or negedge rst) begin
		if(rst==0)
			cnt <= 20'd0;
		else if(en_cnt)
			cnt <= cnt + 1'b1;
		else
			cnt<= 20'd0;
	end
	always@(posedge clk or negedge rst) begin
		if(rst==0)
			cnt_full <= 1'b0;
		else if(cnt == 'd999_999)
			cnt_full <= 1'b1;
		else
			cnt_full <= 1'b0;
	end

endmodule

(7)、數碼管顯示模塊

數碼管顯示模塊的主要功能是將輸入其中的16位資料信號通過動態掃描的方式輸出在數碼管上,本模塊的輸入有系統時鐘、復位信號、由控制模塊輸入的控制信號和由計時、計分、倒計時三個模塊輸出的資料信號,輸出也就是整個計分器的輸出:4位的數碼管位選sel和7位的數碼管段選seg

本模塊通過譯碼器的方式來實作資料選擇:

always@(posedge clk or negedge rst) begin
		if(rst==0)
			disp_data<=0;
		else 
			case(ctrl)
				3'b000:disp_data<=date1;
				3'b001:disp_data<=date2;
				3'b010:disp_data<=date3;
				default:disp_data<=0;
			endcase
	end

本模塊的代碼如下:

module xianshi(
	input	clk,
	input	rst,
	input	[2:0]	ctrl,
	input	[15:0] date1,//資料信號
	input	[15:0] date2,//資料信號
	input	[15:0] date3,//資料信號
	
	output	reg [3:0]  sel, // 數碼管位選(選擇當前要顯示的數碼管)
	output	reg [6:0]  seg // 數碼管段選(選擇當前要顯示的內容)
    );
		reg [14:0] cnt_1;	//分頻記數的計數器
		reg		   clk_out;	//分頻后的時鐘信號
		/* reg [3:0]	sel_r;	//表示那個數碼管亮 */
		reg [3:0]	date_tmp;
		reg [15:0] disp_data;
		
	localparam TIME='d24999;
	/* localparam TIME='d4; */
	
	always@(posedge clk or negedge rst) begin
		if(rst==0)
			disp_data<=0;
		else 
			case(ctrl)
				3'b000:disp_data<=date1;
				3'b001:disp_data<=date2;
				3'b010:disp_data<=date3;
				default:disp_data<=0;
			endcase
	end
	//cnt_1的記數模塊
		always@(posedge clk or negedge rst) begin
			if(rst==0)
				cnt_1 <= 15'd0;
			else if(cnt_1 ==TIME)
				cnt_1 <= 15'd0;
			else 
				cnt_1 <= cnt_1+1'd1;
		end
		
	//時鐘分頻模塊
		always@(posedge clk or negedge rst) begin
			if(rst==0)
				clk_out<=1'b0;
			else if(cnt_1== TIME)
				clk_out<=~clk_out;
			else	
				clk_out<=clk_out;
		end
		
	//移位暫存器
		always@(posedge clk_out or negedge rst) begin
			if(rst==0)
				sel<=4'b0001;
			else if(sel==4'b1000)
				sel<=4'b0001;
			else	
				sel<=sel<<1;  
			/* if(rst==0)
				sel_r<=4'b0001;
			else 
				sel_r<={sel_r[2:0],sel_r[3]}; */
		end

	//四選一多路器
		always@(*) begin
			case(sel)
				4'b0001 : date_tmp <= disp_data[3:0]; 
				4'b0010 : date_tmp <= disp_data[7:4]; 
				4'b0100 : date_tmp <= disp_data[11:8]; 
				4'b1000 : date_tmp <= disp_data[15:12]; 
				default:date_tmp<=4'b0000;
			endcase
		end
		
	//字典(譯碼器)
		always@(*) begin
			case(date_tmp)
				4'h0:seg<=7'b1000000;
				4'h1:seg<=7'b1111001;
				4'h2:seg<=7'b0100100;
				4'h3:seg<=7'b0110000;
				4'h4:seg<=7'b0011001;
				4'h5:seg<=7'b0010010;
				4'h6:seg<=7'b0000010;
				4'h7:seg<=7'b1111000;
				4'h8:seg<=7'b0000000;
				4'h9:seg<=7'b0010000;
				4'ha:seg<=7'b0001000;
				4'hb:seg<=7'b0000011;
				4'hc:seg<=7'b1000110;
				4'hd:seg<=7'b0100001;
				4'he:seg<=7'b0000110;
				4'hf:seg<=7'b0001110;
			endcase
		end
		
	//	

endmodule

四、總結

本人是剛入門FPGA的一名在讀大學生,由于初學代碼也表現出冗長,凌亂等諸多問題,望見諒,

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

標籤:其他

上一篇:軟體開發公司的作業流程以及Git的使用詳細介紹

下一篇:HTML5在線電影網站設計 黑色的影視傳媒公司網站(6頁) HTML+CSS+JavaScript

標籤雲
其他(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