日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

FPGA篮球计分设计

發布時間:2024/1/8 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 FPGA篮球计分设计 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

消抖模塊

module key_module
(
?? ?//輸入端口
?? ?clk,rst_n,KEY,
?? ?//輸出端口
?? ?key_out
); ?
?
//---------------------------------------------------------------------------
//--?? ?外部端口聲明
//---------------------------------------------------------------------------
input?? ??? ??? ??? ??? ??? ?clk;?? ??? ??? ??? ?//時鐘的端口
input?? ??? ??? ??? ??? ??? ?rst_n;?? ??? ??? ??? ?//復位的端口,低電平復位
input?? ??? ? ?? ?[3:0]?? ??? ?KEY;?? ??? ??? ??? ??? ?//對應板上的KEY
output?? ??? ? ?? ?[3:0]?? ??? ?key_out;?? ??? ??? ??? ?//消抖完成輸出按鍵

//---------------------------------------------------------------------------
//--?? ?內部端口聲明
//---------------------------------------------------------------------------
reg?? ??? ?[26:0]?? ?time_cnt;?? ??? ??? ?//用來計數按鍵延遲的定時計數器
reg?? ??? ?[26:0]?? ?time_cnt_n;?? ??? ??? ?//time_cnt的下一個狀態
reg?? ??? ? [3:0] ?? ??? ??? ?key_reg;?? ??? ??? ??? ?//用來接收按鍵信號的寄存器
reg?? ??? ? [3:0] ?? ??? ??? ?key_reg_n;?? ??? ??? ?//key_reg的下一個狀態


//設置定時器的時間為20ms,計算方法為 ?(20*10^6)ns / (1/50)ns ?50MHz為開發板晶振
parameter SET_TIME_20MS = 27'd1_000_000;?? ?
//parameter SET_TIME_20MS = 27'd1_0;?? ?

//---------------------------------------------------------------------------
//--?? ?邏輯功能實現?? ?
//---------------------------------------------------------------------------
//時序電路,用來給time_cnt寄存器賦值
always @ (posedge clk, negedge rst_n)
begin
?? ?if(!rst_n)?? ??? ??? ??? ??? ??? ??? ??? ?//判斷復位
?? ??? ?time_cnt <= 27'h0;?? ??? ??? ??? ?//初始化time_cnt值
?? ?else
?? ??? ?time_cnt <= time_cnt_n;?? ??? ??? ?//用來給time_cnt賦值
end

//組合電路,實現20ms的定時計數器
always @ (*)
begin
?? ?if(time_cnt == SET_TIME_20MS)?? ??? ?//判斷20ms時間
?? ??? ?time_cnt_n = 27'h0;?? ??? ??? ??? ?//如果到達20ms,定時計數器將會被清零
?? ?else
?? ??? ?time_cnt_n = time_cnt + 1'b1;//如果未到20ms,定時計數器將會繼續累加
end

//時序電路,用來key_reg寄存器賦值
always @ (posedge clk, negedge rst_n)
begin
?? ?if(!rst_n)?? ??? ??? ??? ??? ??? ??? ??? ?//判斷復位
?? ??? ?key_reg <= 4'b0000;?? ??? ??? ??? ??? ?//初始化key_reg值
?? ?else
?? ??? ?key_reg <= key_reg_n;?? ??? ??? ?//用來給key_reg賦值
end

//組合電路,每20ms接收一次按鍵的值
always @ (*)
begin
?? ?if(time_cnt == SET_TIME_20MS)?? ??? ?//判斷20ms時間
?? ??? ?key_reg_n <= KEY;?? ??? ??? ??? ??? ?//如果到達20ms,接收一次按鍵的值
?? ?else
?? ??? ?key_reg_n <= key_reg;?? ??? ??? ?//如果未到20ms,保持原狀態不變
end

assign key_out = key_reg & (~key_reg_n);//判斷按鍵有沒有按下

endmodule
分屏模塊

module div(clk,ext_rst_n,mclk
? ? );
?? ?input ? ? ? ? ? clk ? ?;//輸入時鐘
?? ?input ? ? ? ? ? ext_rst_n ? ? ?;//復位端口
?? ?output ? ? ?reg mclk ? ? ? ? ? ;//輸出1Hz
?? ?
?? ?reg ? ? ?[31:0] cnt ? ? ? ? ? ?;//存放計數器的值
?? ?parameter TIME= ? 32'd5000_0000;//時鐘100MHz
//分頻模塊,使得輸入時鐘為25MHz輸出時鐘為1Hz
?? ?always@ (posedge clk or negedge ext_rst_n)begin
?? ??? ?if(!ext_rst_n)begin
?? ??? ??? ?mclk <=1'b0;
?? ??? ??? ?cnt <=32'd0;
?? ??? ?end
?? ??? ?else if(cnt ==TIME-1'b1)begin
?? ??? ??? ?mclk <=~mclk;
?? ??? ??? ?cnt <=1'b0;
?? ??? ?end
?? ??? ?else begin
?? ??? ??? ?cnt <=cnt + 1'b1;
?? ??? ?end
?? ?end
endmodule

控制模塊

module control(clk,ext_rst_n,switch1,switch2,en_cnt,en_24s
? ? );
?? ?input ? ? ? clk;?? ??? ?//輸入時鐘
?? ?input ? ? ? ext_rst_n ?;?? ??? ?//復位信號
?? ?input ? ? ? switch1 ? ?;?? ??? ?//暫停開關
?? ?input ? ? ? switch2 ? ?; ? ? ? ?//24s使能開關
?? ?output ?reg en_cnt ? ? ;?? ??? ?//暫停計數使能位
?? ?output ?reg en_24s ? ? ; ? ? ? ?//24s使能位
?? ?
?? ?reg ?[31:0] cnt ? ? ? ?; ? ? ? ?//存放計數器的值
?? ?parameter TIME = 32'd10000_0000;
?? ?//數碼管特殊狀態閃爍計數器模塊
?? ?always@(posedge clk or negedge ext_rst_n)begin
?? ??? ?if(ext_rst_n==1'b0)begin
?? ??? ??? ?cnt <=25'd0;
?? ??? ?end
?? ??? ?else if(cnt ==TIME-1'b1)begin
?? ??? ??? ?cnt <=1'b0;
?? ??? ?end
?? ??? ?else begin
?? ??? ??? ?cnt <=cnt + 1'b1;
?? ??? ?end
?? ?end
?? ?//停止計數器計時模塊
?? ?always @(posedge clk or negedge ext_rst_n)begin
?? ??? ?if(ext_rst_n==1'b0)begin
?? ??? ??? ?en_cnt<=1'b0;
?? ??? ?end
?? ??? ?else if(switch1==1'b0)begin
?? ??? ??? ?en_cnt<=1'b1;
?? ??? ?end
?? ??? ?else begin
?? ??? ??? ?en_cnt<=1'b0;
?? ??? ?end
?? ?end
?? ?//開啟24s倒計時
?? ?always@(posedge clk or negedge ext_rst_n)begin
?? ??? ?if(ext_rst_n==1'b0)begin
?? ??? ??? ?en_24s <=1'b0;
?? ??? ?end
?? ??? ?else if(switch2==1'b0)begin
?? ??? ??? ?en_24s <=1'b1;
?? ??? ?end
?? ??? ?else begin
?? ??? ??? ?en_24s <=1'b0;
?? ??? ?end
?? ?end
endmodule
12分鐘模塊

module counter_12min(clk,mclk,ext_rst_n,en_24s,en_cnt,times_12m,led
? ? );
?? ?input ? ? ? ? ? clk ? ? ? ;//系統時鐘
?? ?input ? ? ? ? ? mclk ? ? ? ? ? ? ?;//時鐘信號
?? ?input ? ? ? ? ? ext_rst_n ? ? ? ? ;//復位信號
?? ?input ? ? ? ? ? en_24s ? ? ? ? ? ?;//24s使能位
?? ?input ? ? ? ? ? en_cnt ? ? ? ? ? ?;//計數器停止使能位
?? ?output reg[15:0]times_12m ? ? ? ? ;//15-12分高位 11-8 分低位 7-4秒高位 3-0秒低位
?? ?output ? ? ? ? ?led ? ? ? ? ? ? ? ;//led指示狀態
?? ?
?? ?assign led =(times_12m==16'h0000);
?? ?
?? ?//計數器模塊高位 分鐘計時
?? ?always@(posedge mclk or negedge ext_rst_n)begin
?? ??? ?if(!ext_rst_n)begin
?? ??? ??? ?times_12m[15:12] <=4'h1;?? ??? ?
?? ??? ?end
?? ??? ?else if(en_24s==1'b1)begin
?? ??? ??? ?times_12m[15:12] <=4'h1;
?? ??? ?end
?? ??? ?else if(en_cnt==1'b1)begin
?? ??? ??? ?times_12m[15:12] <=times_12m[15:12];
?? ??? ?end
?? ??? ?else if({times_12m[15:12],times_12m[11:8]}==8'h00)begin
?? ??? ??? ?times_12m[15:12] <=4'h0;?
?? ??? ?end
?? ??? ?else if({times_12m[7:4],times_12m[3:0]}==8'h00) begin
?? ??? ??? ?if(times_12m[11:8]==4'h0)begin
?? ??? ??? ??? ?times_12m[15:12] <=times_12m[15:12]-1'b1;
?? ??? ??? ?end
?? ??? ??? ?else begin
?? ??? ??? ??? ?times_12m[15:12] <=times_12m[15:12];
?? ??? ??? ?end
?? ??? ?end
?? ??? ?else begin
?? ??? ??? ?times_12m[15:12] <=times_12m[15:12];
?? ??? ?end
?? ?end
?? ?//計數器模塊低位 分鐘計時
?? ?always@(posedge mclk or negedge ext_rst_n)begin
?? ??? ?if(!ext_rst_n)begin
?? ??? ??? ?times_12m[11:8] <=4'h1; ? ?
?? ??? ?end
?? ??? ?else if(en_24s==1'b1)begin
?? ??? ??? ?times_12m[11:8] <=4'h1;
?? ??? ?end
?? ??? ?else if(en_cnt==1'b1)begin
?? ??? ??? ?times_12m[11:8] <=times_12m[11:8];
?? ??? ?end
?? ??? ?else if({times_12m[15:12],times_12m[11:8]}==8'h00)begin
?? ??? ??? ?times_12m[11:8] <=4'h0;?
?? ??? ?end
?? ??? ?else if({times_12m[7:4],times_12m[3:0]}==8'h00) begin
?? ??? ??? ?if(times_12m[11:8]==4'h0)begin
?? ??? ??? ??? ?times_12m[11:8] <=4'h9;
?? ??? ??? ?end
?? ??? ??? ?else begin?
?? ??? ??? ??? ?times_12m[11:8] <=times_12m[11:8]-1'b1;
?? ??? ??? ?end
?? ??? ?end
?? ??? ?else begin
?? ??? ??? ?times_12m[11:8] <=times_12m[11:8];
?? ??? ?end
?? ?end
?? ?//計數器模塊高位 秒計時
?? ?always@(posedge mclk or negedge ext_rst_n)
?? ?begin
?? ??? ?if(!ext_rst_n)begin
?? ??? ??? ?times_12m[7:4] <=4'h5;?? ?
?? ??? ?end
?? ??? ?else if(en_24s==1'b1)begin
?? ??? ??? ?times_12m[7:4] <=4'h5;
?? ??? ?end
?? ??? ?else if(en_cnt==1'b1)begin
?? ??? ??? ?times_12m[7:4] <=times_12m[7:4];
?? ??? ?end
?? ??? ?else if({times_12m[7:4],times_12m[3:0]}==8'h00)begin
?? ??? ??? ?if({times_12m[15:12],times_12m[11:8]}==8'h00)begin
?? ??? ??? ??? ?times_12m[7:4] <=4'h0;
?? ??? ??? ?end
?? ??? ??? ?else begin
?? ??? ??? ??? ?times_12m[7:4] <=4'h5;
?? ??? ??? ?end
?? ??? ?end
?? ??? ?else if(times_12m[3:0]==4'h0)begin
?? ??? ??? ?times_12m[7:4] <=times_12m[7:4]-1'b1;
?? ??? ?end
?? ??? ?else begin
?? ??? ??? ?times_12m[7:4] <=times_12m[7:4];
?? ??? ?end
?? ?end
?? ?//計數器模塊低位 秒計時
?? ?always@(posedge mclk or negedge ext_rst_n)begin
?? ??? ?if(!ext_rst_n)begin
?? ??? ??? ?times_12m[3:0] <=4'h9; ? ?
?? ??? ?end
?? ??? ?else if(en_24s==1'b1)begin
?? ??? ??? ?times_12m[3:0] <=4'h9;
?? ??? ?end
?? ??? ?else if(en_cnt==1'b1)begin
?? ??? ??? ?times_12m[3:0] <=times_12m[3:0];
?? ??? ?end
?? ??? ?else if({times_12m[7:4],times_12m[3:0]}==8'h00) begin
?? ??? ??? ?if({times_12m[15:12],times_12m[11:8]}==8'h00)begin
?? ??? ??? ??? ?times_12m[3:0] <=4'h0;
?? ??? ??? ?end
?? ??? ??? ?else begin
?? ??? ??? ??? ?times_12m[3:0] <=4'h9;
?? ??? ??? ?end
?? ??? ?end
?? ??? ?else if(times_12m[3:0]==4'h0)begin
?? ??? ??? ?times_12m[3:0] <=4'h9;
?? ??? ?end
?? ??? ?else begin
?? ??? ??? ?times_12m[3:0] <=times_12m[3:0]-1'b1;
?? ??? ?end
?? ?end
?? ?
endmodule

24秒模塊

module counter_24(clk,mclk,ext_rst_n,en_24s,en_cnt,times_24s,led
? ? );
?? ?input ? ? ? ? ? ? clk ? ? ? ;//系統時鐘
?? ?input ? ? ? ? ? ? mclk ? ? ? ? ? ? ?;//時鐘信號
?? ?input ? ? ? ? ? ? ext_rst_n ? ? ? ? ;//復位信號
?? ?input ? ? ? ? ? ? en_24s ? ? ? ? ? ?;//24s使能位
?? ?input ? ? ? ? ? ? en_cnt ? ? ? ? ? ?;//計數器停止使能位
?? ?output reg [15:0] times_24s ? ? ? ? ;
?? ?output ? ? ? ? ? ?led ? ? ? ? ? ? ? ;//led指示狀態
?? ?
?? ?assign led =(times_24s==16'h0000);
?
?? ?reg ? ? ?[31:0] cnt ? ? ? ? ? ?;//存放計數器的值
?? ?parameter TIME= ? 32'd10000_0000;
?? ?always@ (posedge clk or negedge ext_rst_n)begin
?? ??? ?if(!ext_rst_n)begin
?? ??? ??? ?cnt <=32'd0;
?? ??? ?end
?? ??? ?else if(cnt ==TIME-1'b1)begin
?? ??? ??? ?cnt <=1'b0;
?? ??? ?end
?? ??? ?else begin
?? ??? ??? ?cnt <=cnt + 1'b1;
?? ??? ?end
?? ?end
?? ?//計數器模塊高位 秒計時(99)
?? ?always@(posedge clk or negedge ext_rst_n)begin
?? ??? ?if(!ext_rst_n)begin
?? ??? ??? ?times_24s[7:4] <=4'h9;?? ??? ?
?? ??? ?end
?? ??? ?else if(en_24s==1'b0)begin
?? ??? ??? ?times_24s[7:4] <=4'h9;
?? ??? ?end
?? ??? ?else if(en_cnt==1'b1)begin
?? ??? ??? ?times_24s[7:4] <=times_24s[7:4];
?? ??? ?end
?? ??? ?else if(cnt%(TIME/100)==0)begin
?? ??? ??? ?if({times_24s[7:4],times_24s[3:0]}==8'h00)begin
?? ??? ??? ??? ?if({times_24s[15:12],times_24s[11:8]}==8'h00)begin
?? ??? ??? ??? ??? ?times_24s[7:4] <=4'h0;?
?? ??? ??? ??? ?end
?? ??? ??? ??? ?else begin
?? ??? ??? ??? ??? ?times_24s[7:4] <=4'h9;
?? ??? ??? ??? ?end
?? ??? ??? ?end
?? ??? ??? ?else if(times_24s[3:0]==4'h0)begin
?? ??? ??? ??? ?times_24s[7:4] <=times_24s[7:4]-1'b1;
?? ??? ??? ?end
?? ??? ??? ?else begin
?? ??? ??? ??? ?times_24s[7:4] <=times_24s[7:4];
?? ??? ??? ?end
?? ??? ?end
?? ??? ?else begin
?? ??? ??? ?times_24s[7:4] <=times_24s[7:4];
?? ??? ?end?? ?
?? ?end
?? ?//計數器模塊低位 秒計時(99)
?? ?always@(posedge clk or negedge ext_rst_n)begin
?? ??? ?if(!ext_rst_n)begin
?? ??? ??? ?times_24s[3:0] <=4'h9;
?? ??? ?end
?? ??? ?else if(en_24s==1'b0)begin
?? ??? ??? ?times_24s[3:0] <=4'h9;
?? ??? ?end
?? ??? ?else if(en_cnt==1'b1)begin
?? ??? ??? ?times_24s[3:0] <=times_24s[3:0];
?? ??? ?end
?? ??? ?else if(cnt%(TIME/100)==0)begin
?? ??? ??? ?if({times_24s[7:4],times_24s[3:0]}==8'h00) begin
?? ??? ??? ??? ?if({times_24s[15:12],times_24s[11:8]}==8'h00)begin
?? ??? ??? ??? ??? ?times_24s[3:0] <=4'h0;?
?? ??? ??? ??? ?end
?? ??? ??? ??? ?else begin
?? ??? ??? ??? ??? ?times_24s[3:0] <=4'h9;
?? ??? ??? ??? ?end
?? ??? ??? ?end
?? ??? ??? ?else if(times_24s[3:0]==4'h0)begin
?? ??? ??? ??? ?times_24s[3:0] <=4'h9;
?? ??? ??? ?end
?? ??? ??? ?else begin
?? ??? ??? ??? ?times_24s[3:0] <=times_24s[3:0]-1'b1;
?? ??? ??? ?end
?? ??? ?end
?? ??? ?else begin
?? ??? ??? ?times_24s[3:0] <=times_24s[3:0];
?? ??? ?end
?? ?end
?? ?//計數器模塊高位 秒計時
?? ?always@(posedge mclk or negedge ext_rst_n)
?? ?begin
?? ??? ?if(!ext_rst_n)begin
?? ??? ??? ?times_24s[15:12] <=4'h2;?? ??? ?
?? ??? ?end
?? ??? ?else if(en_24s==1'b0)begin
?? ??? ??? ?times_24s[15:12] <=4'h2;
?? ??? ?end
?? ??? ?else if(en_cnt==1'b1)begin
?? ??? ??? ?times_24s[15:12] <=times_24s[15:12];
?? ??? ?end
?? ??? ?else if({times_24s[15:12],times_24s[11:8]}==8'h00)begin
?? ??? ??? ?times_24s[15:12] <=4'h0;?
?? ??? ?end
?? ??? ?else if(times_24s[11:8]==4'h0)begin
?? ??? ??? ?times_24s[15:12] <=times_24s[15:12]-1'b1;
?? ??? ?end
?? ??? ?else begin
?? ??? ??? ?times_24s[15:12] <=times_24s[15:12];
?? ??? ?end
?? ?end
?? ?//計數器模塊低位 秒計時
?? ?always@(posedge mclk or negedge ext_rst_n)begin
?? ??? ?if(!ext_rst_n)begin
?? ??? ??? ?times_24s[11:8] <=4'h3;
?? ??? ?end
?? ??? ?else if(en_24s==1'b0)begin
?? ??? ??? ?times_24s[11:8] <=4'h3;
?? ??? ?end
?? ??? ?else if(en_cnt==1'b1)begin
?? ??? ??? ?times_24s[11:8] <=times_24s[11:8];
?? ??? ?end
?? ??? ?else if({times_24s[15:12],times_24s[11:8]}==8'h00) begin
?? ??? ??? ?times_24s[11:8] <=4'h0;
?? ??? ?end
?? ??? ?else if(times_24s[11:8]==4'h0)begin
?? ??? ??? ?times_24s[11:8] <=4'h9;
?? ??? ?end
?? ??? ?else begin
?? ??? ??? ?times_24s[11:8] <=times_24s[11:8]-1'b1;
?? ??? ?end
?? ?end
endmodule

計分模塊

module soring(clk,ext_rst_n,key_press,en_sore,sore,led
? ? );
?? ?input ? ? ? ? ? ? clk ? ;//時鐘信號
?? ?input ? ? ? ? ? ? ext_rst_n ? ? ;//復位信號
/* ?? ?input ? ? ? ? ? ? key_down ? ? ?;//切換記分
?? ?input ? ? ? ? ? ? key_left ? ? ?;//1分
?? ?input ? ? ? ? ? ? key_entr ? ? ?;//2分
?? ?input ? ? ? ? ? ? key_righ ? ? ?;//3分 */
?? ?input ? ? ? ? ? ? en_sore ? ? ? ;//積分使能位
?? ?input?? ??? ?[3:0] key_press?? ?;?? ?
?? ?output ? ? [15:0] sore ? ? ? ? ?;//15-8 7-0分別為兩個隊的分數
?? ?output reg ?[1:0] led ? ? ? ? ? ;//
?? ?
?? ?//計分標志模塊
?? ?reg sore_f;
?? ?always@(posedge clk or negedge ext_rst_n)begin
?? ??? ?if(ext_rst_n==1'b0)begin
?? ??? ??? ?sore_f<=1'b0;
?? ??? ?end
?? ??? ?else if(en_sore==1'b0)begin
?? ??? ??? ?sore_f<=1'b0;
?? ??? ?end
?? ??? ?else if(key_press[3]==1'b1)begin
?? ??? ??? ?sore_f<=~sore_f;
?? ??? ?end
?? ??? ?else begin
?? ??? ??? ?sore_f<=sore_f;
?? ??? ?end
?? ?end
?? ?//led指示模塊
?? ?always@(posedge clk or negedge ext_rst_n)begin
?? ??? ?if(ext_rst_n==1'b0)begin
?? ??? ??? ?led<=2'b11;
?? ??? ?end
?? ??? ?else if(en_sore==1'b0)begin
?? ??? ??? ?led<=led;
?? ??? ?end
?? ??? ?else if(sore_f==1'b0)begin
?? ??? ??? ?led<=2'b10;
?? ??? ?end
?? ??? ?else begin
?? ??? ??? ?led<=2'b01;
?? ??? ?end
?? ?end
?? ?//第一隊比分
?? ?reg [7:0] sore_1;
?? ?assign sore[15:12]=sore_1/10;
?? ?assign sore[11:8]=sore_1%10;
?? ?always@(posedge clk or negedge ext_rst_n)begin
?? ??? ?if(ext_rst_n==1'b0)begin
?? ??? ??? ?sore_1<=8'h00;
?? ??? ?end
?? ??? ?else if(en_sore==1'b0)begin
?? ??? ??? ?sore_1<=sore_1;
?? ??? ?end
?? ??? ?else if(sore_1==8'd99)begin
?? ??? ??? ?sore_1<=8'h00;
?? ??? ?end
?? ??? ?else if(key_press[0]==1'b1&&sore_f==1'b0)begin
?? ??? ??? ?sore_1<=sore_1+1'b1;
?? ??? ?end
?? ??? ?else if(key_press[1]==1'b1&&sore_f==1'b0)begin
?? ??? ??? ?sore_1<=sore_1+2'b10;
?? ??? ?end
?? ??? ?else if(key_press[2]==1'b1&&sore_f==1'b0)begin
?? ??? ??? ?sore_1<=sore_1+2'b11;
?? ??? ?end
?? ??? ?else begin
?? ??? ??? ?sore_1<=sore_1;
?? ??? ?end
?? ?end
?? ?//第二隊比分
?? ?reg [7:0] sore_2;
?? ?assign sore[7:4]=sore_2/10;
?? ?assign sore[3:0]=sore_2%10;
?? ?always@(posedge clk or negedge ext_rst_n)begin
?? ??? ?if(ext_rst_n==1'b0)begin
?? ??? ??? ?sore_2<=8'h00;
?? ??? ?end
?? ??? ?else if(en_sore==1'b0)begin
?? ??? ??? ?sore_2<=sore_2;
?? ??? ?end
?? ??? ?else if(sore_2==8'd99)begin
?? ??? ??? ?sore_2<=8'h00;
?? ??? ?end
?? ??? ?else if(key_press[0]==1'b1&&sore_f==1'b1)begin
?? ??? ??? ?sore_2<=sore_2+1'b1;
?? ??? ?end
?? ??? ?else if(key_press[1]==1'b1&&sore_f==1'b1)begin
?? ??? ??? ?sore_2<=sore_2+2'b10;
?? ??? ?end
?? ??? ?else if(key_press[2]==1'b1&&sore_f==1'b1)begin
?? ??? ??? ?sore_2<=sore_2+2'b11;
?? ??? ?end
?? ??? ?else begin
?? ??? ??? ?sore_2<=sore_2;
?? ??? ?end
?? ?end
endmodule

顯示模塊

odule seg
(?? ?
?? ?clk,
?? ?rst_n,
?? ?num1,
?? ?num2,
?? ?num3,
?? ?num4,
?? ?SEG1,
?? ?AN1
);

input ?? ??? ??? ??? ??? ??? ?clk;?? ??? ??? ??? ??? ?
input?? ??? ??? ??? ??? ??? ?rst_n;?? ??? ??? ??? ??? ?
input?? ? ?? ??? ?[ 3:0]?? ??? ?num1;?? ??? ??? ?
input?? ? ?? ??? ?[ 3:0]?? ??? ?num2;?? ?
input?? ? ?? ??? ?[ 3:0]?? ??? ?num3;?? ??? ??? ?
input?? ? ?? ??? ?[ 3:0]?? ??? ?num4;?? ??? ?
output reg ?? ?[ 3:0] ?? ??? ??? ?AN1 =2'b0;?? ??? ??? ??? ??? ?
output reg ?? ?[ 7:0] ?? ??? ??? ?SEG1 = 8'h0;?? ??? ??? ??? ?

reg?? ??? ??? ?[26:0]?? ??? ?cnt1=0;?? ??? ??? ??? ??? ??? ??? ?
reg?? ??? ??? ? [1:0]?? ??? ??? ?led_cnt=0;?? ??? ??? ??? ??? ??? ??? ?
reg ?? ??? ?[ 3:0]?? ??? ?led_data=0;?? ??? ??? ??? ?
?
parameter SEC_TIME_PAR = 100_000; //定義數碼管動態掃描時間
?
always @ (posedge clk or negedge rst_n) ?
begin
?? ?if(!rst_n)?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?
?? ??? ?cnt1 <= 27'h0;?? ??? ??? ??? ??? ??? ??? ?
?? ?else?? ?if(cnt1 == SEC_TIME_PAR )?? ?//掃描時間計數器,記到SEC_TIME_PAR時,清零,重新計數?? ??? ?
?? ??? ?cnt1 = 27'h0;?? ??? ??? ??? ??? ??? ?
?? ?else
?? ??? ?cnt1 = cnt1 + 27'h1;?? ??? ??? ?//重新計數?? ??? ??? ??? ?
end
?
?

always @ (posedge clk or negedge rst_n) ?
begin
?? ?if(!rst_n)?? ??? ??? ??? ??? ??? ??? ??? ??? ?
?? ??? ?led_cnt <= 1'b0;?? ??? ??? ??? ??? ??? ?
?? ?else if(cnt1 == SEC_TIME_PAR )?? ??? ??? ??? ??? ?
?? ??? ?led_cnt = led_cnt + 1'b1;?? ??? ?//選擇計數器加1,依次為0 ?1 ?2 3 .....?? ??? ?
?? ?else
?? ??? ?led_cnt = led_cnt;?? ??? ??? ??? ??? ?
end
?

always @ (*)
begin
?? ?case(led_cnt)
?? ??? ?0 : led_data = num1;?? ??? ?//顯示?? ??? ?
?? ??? ?1 : led_data = num2;?? ??? ?//顯示?? ?
?? ??? ?2 : led_data = num3;?? ??? ?//顯示?? ??? ?
?? ??? ?3 : led_data = num4;?? ??? ?//顯示?? ??? ??? ?
?? ??? ?default: led_data = 2'b0;?? ??? ??? ??? ??? ?
?? ?endcase
end
?

always @ (*)
begin
?? ?case (led_cnt) ?
?? ??? ?0 : AN1 = 4'b1000; ?? ??? ?//循環選通兩個數碼管的位選?? ??? ??? ?
?? ??? ?1 : AN1 = 4'b0100; ?
?? ??? ?2 : AN1 = 4'b0010; ?? ??? ?//循環選通兩個數碼管的位選?? ??? ??? ?
?? ??? ?3 : AN1 = 4'b0001; ?? ??? ?
?? ?default : AN1 = 4'b0;?? ??? ??? ??? ?
?? ?endcase ?? ?
end
?
?

always @ (*)
begin
? case(led_data)
?? ??? ?0 ?: SEG1[7:0] = 8'b00111111; ? //數碼管譯碼?? ?
?? ??? ?1 ?: SEG1[7:0] = 8'b00000110; ??? ?//數碼管譯碼
?? ??? ?2 ?: SEG1[7:0] = 8'b01011011; ? //數碼管譯碼
?? ??? ?3 ?: SEG1[7:0] = 8'b01001111; ? //數碼管譯碼
?? ??? ?4 ?: SEG1[7:0] = 8'b01100110; ??? ?//數碼管譯碼
?? ??? ?5 ?: SEG1[7:0] = 8'b01101101; ? //數碼管譯碼
?? ??? ?6 ?: SEG1[7:0] = 8'b01111101; ? //數碼管譯碼
?? ??? ?7 ?: SEG1[7:0] = 8'b00000111; ? //數碼管譯碼
?? ??? ?8 ?: SEG1[7:0] = 8'b01111111; ? //數碼管譯碼
?? ??? ?9 ?: SEG1[7:0] = 8'b01101111; ??? ?//數碼管譯碼
?? ??? ?10 : SEG1[7:0] = 8'b00000000; ? //數碼管譯碼
?? ??? ?default :SEG1[7:0] = 8'b0;?? ?// ??? ?
? endcase
end
?
endmodule
顯示模塊2

module seg
(?? ?
?? ?clk,
?? ?rst_n,
?? ?num1,
?? ?num2,
?? ?num3,
?? ?num4,
?? ?SEG1,
?? ?AN1
);

input ?? ??? ??? ??? ??? ??? ?clk;?? ??? ??? ??? ??? ?
input?? ??? ??? ??? ??? ??? ?rst_n;?? ??? ??? ??? ??? ?
input?? ? ?? ??? ?[ 3:0]?? ??? ?num1;?? ??? ??? ?
input?? ? ?? ??? ?[ 3:0]?? ??? ?num2;?? ?
input?? ? ?? ??? ?[ 3:0]?? ??? ?num3;?? ??? ??? ?
input?? ? ?? ??? ?[ 3:0]?? ??? ?num4;?? ??? ?
output reg ?? ?[ 3:0] ?? ??? ??? ?AN1 =2'b0;?? ??? ??? ??? ??? ?
output reg ?? ?[ 7:0] ?? ??? ??? ?SEG1 = 8'h0;?? ??? ??? ??? ?

reg?? ??? ??? ?[26:0]?? ??? ?cnt1=0;?? ??? ??? ??? ??? ??? ??? ?
reg?? ??? ??? ? [1:0]?? ??? ??? ?led_cnt=0;?? ??? ??? ??? ??? ??? ??? ?
reg ?? ??? ?[ 3:0]?? ??? ?led_data=0;?? ??? ??? ??? ?
?
parameter SEC_TIME_PAR = 100_000; //定義數碼管動態掃描時間
?
always @ (posedge clk or negedge rst_n) ?
begin
?? ?if(!rst_n)?? ??? ??? ??? ??? ??? ??? ??? ??? ??? ?
?? ??? ?cnt1 <= 27'h0;?? ??? ??? ??? ??? ??? ??? ?
?? ?else?? ?if(cnt1 == SEC_TIME_PAR )?? ?//掃描時間計數器,記到SEC_TIME_PAR時,清零,重新計數?? ??? ?
?? ??? ?cnt1 = 27'h0;?? ??? ??? ??? ??? ??? ?
?? ?else
?? ??? ?cnt1 = cnt1 + 27'h1;?? ??? ??? ?//重新計數?? ??? ??? ??? ?
end
?
?

always @ (posedge clk or negedge rst_n) ?
begin
?? ?if(!rst_n)?? ??? ??? ??? ??? ??? ??? ??? ??? ?
?? ??? ?led_cnt <= 1'b0;?? ??? ??? ??? ??? ??? ?
?? ?else if(cnt1 == SEC_TIME_PAR )?? ??? ??? ??? ??? ?
?? ??? ?led_cnt = led_cnt + 1'b1;?? ??? ?//選擇計數器加1,依次為0 ?1 ?2 3 .....?? ??? ?
?? ?else
?? ??? ?led_cnt = led_cnt;?? ??? ??? ??? ??? ?
end
?

always @ (*)
begin
?? ?case(led_cnt)
?? ??? ?0 : led_data = num1;?? ??? ?//顯示?? ??? ?
?? ??? ?1 : led_data = num2;?? ??? ?//顯示?? ?
?? ??? ?2 : led_data = num3;?? ??? ?//顯示?? ??? ?
?? ??? ?3 : led_data = num4;?? ??? ?//顯示?? ??? ??? ?
?? ??? ?default: led_data = 2'b0;?? ??? ??? ??? ??? ?
?? ?endcase
end
?

always @ (*)
begin
?? ?case (led_cnt) ?
?? ??? ?0 : AN1 = 4'b1000; ?? ??? ?//循環選通兩個數碼管的位選?? ??? ??? ?
?? ??? ?1 : AN1 = 4'b0100; ?
?? ??? ?2 : AN1 = 4'b0010; ?? ??? ?//循環選通兩個數碼管的位選?? ??? ??? ?
?? ??? ?3 : AN1 = 4'b0001; ?? ??? ?
?? ?default : AN1 = 4'b0;?? ??? ??? ??? ?
?? ?endcase ?? ?
end
?
?

always @ (*)
begin
? case(led_data)
?? ??? ?0 ?: SEG1[7:0] = 8'b00111111; ? //數碼管譯碼?? ?
?? ??? ?1 ?: SEG1[7:0] = 8'b00000110; ??? ?//數碼管譯碼
?? ??? ?2 ?: SEG1[7:0] = 8'b01011011; ? //數碼管譯碼
?? ??? ?3 ?: SEG1[7:0] = 8'b01001111; ? //數碼管譯碼
?? ??? ?4 ?: SEG1[7:0] = 8'b01100110; ??? ?//數碼管譯碼
?? ??? ?5 ?: SEG1[7:0] = 8'b01101101; ? //數碼管譯碼
?? ??? ?6 ?: SEG1[7:0] = 8'b01111101; ? //數碼管譯碼
?? ??? ?7 ?: SEG1[7:0] = 8'b00000111; ? //數碼管譯碼
?? ??? ?8 ?: SEG1[7:0] = 8'b01111111; ? //數碼管譯碼
?? ??? ?9 ?: SEG1[7:0] = 8'b01101111; ??? ?//數碼管譯碼
?? ??? ?10 : SEG1[7:0] = 8'b00000000; ? //數碼管譯碼
?? ??? ?default :SEG1[7:0] = 8'b0;?? ?// ??? ?
? endcase
end
?
endmodule
頂層

module top(
input?? ??? ?clk,?? ??? ??? ?//100MHZ
input?? ??? ?ext_rst_n,

output?? ?[7:0] seg_cs_pin,
output?? ?[7:0] seg_data_0_pin,
output ?[7:0] seg_data_1_pin,

input ? ? ? ? switch0 ? ? ? ? ,//暫停開關 ? ? ?按鍵撥下為暫停
input ? ? ? ? switch1 ? ? ? ? ,//24s使能開關 ? 按鍵撥下為24S使能
input ? ? ? ? switch2 ? ? ? ? ,//顯示分數與節數切換位

input ? ? ? ? ? ? S1 ? ? ?,//切換記分
input ? ? ? ? ? ? S3 ? ? ?,//1分
input ? ? ? ? ? ? S2 ? ? ?,//2分
input ? ? ? ? ? ? S0 ? ? ?,//3分?

output?? ?[3:0]?? ?led

? ? );
?? ?
?? ?
?? ?
//左邊4個數碼管顯示分數 ? ? ?右邊4個數碼管顯示時間
wire key_score,key_score3,key_score2,key_score1;

?? ?wire ? [15:0] times_24s ? ? ? ;
?? ?wire ? [15:0] times_12m ? ? ? ;
?? ?wire ? [15:0] times_sore ? ? ?;
?? ?wire ? ? ? ? ?en_cnt ? ? ? ? ?;
?? ?wire ? ? ? ? ?en_24s ? ? ? ? ?;
?? ?wire?? ??? ? ?clk_1hz?? ??? ? ;
key_module key_inst
(
?? ?.clk?? ?(clk),
?? ?.rst_n?? ?(ext_rst_n),
?? ?.KEY?? ?({~S1,~S0,~S2,~S3}),
?? ?.key_out({key_score,key_score3,key_score2,key_score1})
); ?


?? ?//分頻100MHZ變為1HZ
?? ?div d1(
?? ?.clk(clk),
?? ?.ext_rst_n(ext_rst_n),
?? ?.mclk(clk_1hz)
? ? );

?? ?//控制電路
?? ?control con1(
?? ?.clk(clk),
?? ?.ext_rst_n(ext_rst_n),
?? ?.switch1(switch0),
?? ?.switch2(switch1),
?? ?//.switch3(switch2),
?? ?.en_cnt(en_cnt),
?? ?.en_24s(en_24s)
? ? );

?? ?//計分模塊
?? ?soring so1(
?? ?.clk(clk),
?? ?.ext_rst_n(ext_rst_n),
?? ?.key_press({key_score,key_score3,key_score2,key_score1}),
?? ?.en_sore(switch2),
?? ?.sore(times_sore),
?? ?.led(led[3:2])
? ? );

?? ?//12分鐘倒計時模塊
?? ?counter_12min c1(
?? ?.clk(clk),
?? ?.mclk(clk_1hz),
?? ?.ext_rst_n(ext_rst_n),
?? ?.en_24s(en_24s),
?? ?.en_cnt(en_cnt),
?? ?.times_12m(times_12m),
?? ?.led(led[0])
? ? );
?? ?
?? ?//24秒倒計時模塊
?? ?counter_24 c2(
?? ?.clk(clk),
?? ?.mclk(clk_1hz),
?? ?.ext_rst_n(ext_rst_n),
?? ?.en_24s(en_24s),
?? ?.en_cnt(en_cnt),
?? ?.times_24s(times_24s),
?? ?.led(led[1])
? ? );

//左邊4個數碼管顯示分數 ? ? ?右邊4個數碼管顯示時間

reg?? ??? ?[3:0]?? ?jieshu;

always@(posedge clk)
begin
if(!ext_rst_n)
?? ?jieshu <=1;
?? ?
else if(switch2==0)
?? ?begin
?? ?if(key_score1)
?? ??? ?jieshu <= jieshu + 1;
?? ?end
end
//switch2 撥下去后,顯示節數,此時按S3按鍵可以使得節數加1
wire?? ?[31:0] Disp_data;
assign Disp_data[15:0] = en_24s ? times_24s : times_12m;

assign Disp_data[31:16] = (switch2==0)?{12'd0,jieshu}: times_sore;

?? ?
?? ?
?? ?
//右邊4數碼管?? ?
seg seg_u1
(?? ?
?? ?.clk?? ??? ?(clk),
?? ?.rst_n?? ??? ?(ext_rst_n),
?? ?.num1?? ??? ?(Disp_data[3:0]),
?? ?.num2?? ??? ?(Disp_data[7:4]),
?? ?.num3?? ??? ?(Disp_data[11:8]),
?? ?.num4?? ??? ?(Disp_data[15:12]),
?? ?.SEG1?? ??? ?(seg_data_1_pin),
?? ?.AN1?? ??? ?(seg_cs_pin[7:4])
);?? ?


//左邊4個
seg seg_u2
(?? ?
?? ?.clk?? ??? ?(clk),
?? ?.rst_n?? ??? ?(ext_rst_n),
?? ?.num1?? ??? ?(Disp_data[19:16]),
?? ?.num2?? ??? ?(Disp_data[23:20]),
?? ?.num3?? ??? ?(Disp_data[27:24]),
?? ?.num4?? ??? ?(Disp_data[31:28]),
?? ?.SEG1?? ??? ?(seg_data_0_pin),
?? ?.AN1?? ??? ?(seg_cs_pin[3:0])
);?? ?
endmodule
?

總結

以上是生活随笔為你收集整理的FPGA篮球计分设计的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 高hnp视频| 少妇2做爰hd韩国电影 | 桃色激情网 | 日韩伊人久久 | 黄频在线看| 美女视频毛片 | 国产综合视频在线观看 | 激情视频亚洲 | 看av免费毛片手机播放 | 成人一级在线 | 日韩在线视频网 | 少妇做爰免费理伦电影 | 国产普通话bbwbbwbbw | 欧美成人看片黄a免费看 | 永久免费视频网站直接看 | 男同毛片 | 波多野结衣视频播放 | 日韩特一级 | 精品国产av一区二区 | 中文字幕一区二区人妻痴汉电车 | 久久精品福利 | 久久国产精品网站 | 中文字幕性 | 一本大道久久久久精品嫩草 | 欧美在线视频一区二区三区 | 爽爽窝窝午夜精品一区二区 | 亚洲综合久久婷婷 | babes性欧美69| 亚洲第一视频在线播放 | 日韩国产精品一区二区三区 | 中文字幕在线2021 | 国产一级色 | 最新中文字幕 | 免费性片 | 天天干天天爱天天射 | 91网站在线播放 | 日本一区二区三区成人 | 2018自拍偷拍| 久久黄色网 | 日韩美一级片 | 影音先锋毛片 | av一级| 69网址| 国产成人免费在线观看 | 19禁大尺度做爰无遮挡电影 | 波多av在线 | 国产精品国产三级国产普通话蜜臀 | 色噜噜狠狠成人中文 | 综合久久久久综合 | 蜜桃视频导航 | 福利视频一区二区三区 | 天天干狠狠干 | 国产欧美综合在线 | 好爽…又高潮了毛片免费看 | 亚洲综合久久婷婷 | 国产又粗又猛又爽又黄视频 | 蜜桃无码一区二区三区 | 成人网在线看 | 亚洲综合在线中文字幕 | www.插插 | 蜜臀视频在线播放 | 欧美日本黄色 | 成人黄色大片 | 美女脱了裤子让男人桶 | a视频网站 | 男男play呻吟动漫网站 | 亚洲一区二区三区在线免费观看 | 成年人在线视频免费观看 | 亚洲国产精品成人av | 五月婷激情 | 性做久久久久久久 | 无码人妻一区二区三区av | 国产一区精品在线 | 国产一区二区三区视频在线播放 | 久久久久国产一区二区三区 | 日韩xx视频| 久久久国产成人一区二区三区 | 午夜看黄神器 | 亚洲男人皇宫 | 亚洲激情偷拍 | 爱福利视频一区 | 日本视频一区二区三区 | 日本a在线免费观看 | 久热精品在线观看 | 欧美视频一区二区在线 | 久久机热 | 嫩草国产精品 | 午夜不卡福利视频 | 日韩一区二 | 国产绳艺sm调教室论坛 | a√在线| 九九热在线视频 | 日日干夜夜爱 | 国产伦精品一区二区三区视频免费 | 人妻熟女一区二区aⅴ水 | 久久黄色精品视频 | 六月综合网| 蜜臀一区 | 欧亚一区二区三区 |