|
module Top_Qiangdaqi(
input clk,//主頻信號(hào),50MHZ
input rst_n,//低電平復(fù)位
//input [2:0]kint,//按鍵輸入
input PLA_A,PLA_B,PLA_C,//按鍵輸入
//input key_ctrl,//主持人按鍵
output led_d0=0,led_d1,led_d2,led_d3,
output buzzer,//蜂鳴器
output [5:0]seg_sel,
output [7:0]seg_data
);
/*-----------------------按鍵信號(hào)鎖存,消抖,LED顯示-----------------------*/
/*--------記錄按鍵狀態(tài)--------*/
reg key_rst;
always @(posedge clk or negedge rst_n)begin
if(!rst_n)key_rst <= 1'b1;//低電平復(fù)位,key_rst信號(hào)為1
else key_rst <= PLA_C&PLA_B&PLA_A;//按鍵按下時(shí),key_rst信號(hào)為0
end
reg key_rst_r;
always @(posedge clk or negedge rst_n)begin
if(!rst_n)key_rst_r <= 1'b1;
else key_rst_r <= key_rst;//上升沿將key_rst信號(hào)鎖存到key_rst_r里
end
/*--------添加20MS消抖--------*/
wire key_clr=key_rst_r &(~key_rst);//key_rst由1變?yōu)?時(shí),key_clr 的值變?yōu)楦?維持一個(gè)時(shí)鐘周期,模擬按鍵情況
reg [19:0]c;//1KHZ---[15:0]clk_1k+[3:0]counter_delay
always @(posedge clk or negedge rst_n)begin
if(!rst_n) c <= 20'd0;
else if(key_clr) c <= 20'd0;
else c <= c+1'b1;
end
reg [2:0] reg_key;
always @(posedge clk or negedge rst_n)begin
if(!rst_n) reg_key <= 3'b111;//低電平復(fù)位,三個(gè)按鍵全部賦高電平
else if(c==20'hffffff)//滿20ms,將按鍵值鎖存到reg_key,20'hffffff=1111_1111_1111_1111_1111
reg_key <= {PLA_C,PLA_B,PLA_A};
end
//時(shí)鐘上升沿時(shí)將reg_key的信號(hào)鎖存到reg_key_r里
reg [2:0]reg_key_r;
always @(posedge clk or negedge rst_n)begin
if(!rst_n) reg_key_r <= 3'b111;
else reg_key_r <= reg_key;
end
/*--------控制LED顯示--------*/
wire [2:0] led_swt=reg_key_r[2:0]&(~reg_key[2:0]);
reg d0;reg d1;reg d2;reg d3;
always @(posedge clk or negedge rst_n)begin
if(!rst_n)begin//全亮
d0 <= 1'b0;
d1 <= 1'b0;
d2 <= 1'b0;
d3 <= 1'b0;
end
else begin//按鍵控制LED翻轉(zhuǎn)
if(led_swt[1]&led_swt[2])d0 <= ~d0;//倒計(jì)時(shí)觸發(fā)燈
//兩個(gè)按鍵同時(shí)按下也不會(huì)因?yàn)閕f語(yǔ)句對(duì)LED有干擾
if(led_swt[0]&(!led_swt[1])&(!led_swt[2])&led_d2==1'b0&led_d3==1'b0)d1 <= ~d1;
if(led_swt[1]&(!led_swt[0])&(!led_swt[2])&led_d1==1'b0&led_d3==1'b0)d2 <= ~d2;
if(led_swt[2]&(!led_swt[0])&(!led_swt[1])&led_d1==1'b0&led_d2==1'b0)d3 <= ~d3;
// if(led_swt[0]&led_d2==1'b0&led_d3==1'b0)d1 <= ~d1;
// if(led_swt[1]&led_d1==1'b0&led_d3==1'b0)d2 <= ~d2;
// if(led_swt[2]&led_d1==1'b0&led_d2==1'b0)d3 <= ~d3;
end
end
assign led_d0=d0?1'b1:1'b0;
assign led_d1=d1?1'b1:1'b0;
assign led_d2=d2?1'b1:1'b0;
assign led_d3=d3?1'b1:1'b0;
/*-----------------------數(shù)碼管顯示-----------------------*/
reg [31:0]tc;//時(shí)間計(jì)數(shù)器
reg flag_1HZ;//計(jì)數(shù)使能標(biāo)志位
always @(posedge clk or negedge rst_n)begin
if(!rst_n)begin
tc <= 32'd0;
flag_1HZ <= 1'b0;
end
else if(tc>=32'd49_999_999)begin
tc <= 32'd0;
flag_1HZ <= 1'b1;//上升沿
end
else begin
tc <= tc+32'd1;
flag_1HZ <= 1'b0;
end
end
//蜂鳴器節(jié)拍時(shí)鐘信號(hào)
wire clk_8;
clk_div U1(
.clk(clk),
.f(8),
.clk_out(clk_8)
);
wire [3:0]count_0;
wire t0;
wire en;
count_m10 U2(
.clk(clk),
.clk_8(clk_8),
.rst_n(rst_n),
.flag_1HZ(flag_1HZ),
.clr(1'b0),
.data(count_0),
.t(t0),
.buzzer(buzzer),
.led_d0(led_d0),
.led_d1(led_d1),
.led_d2(led_d2),
.led_d3(led_d3),
.PLA_A(PLA_A),
.PLA_B(PLA_B),
.PLA_C(PLA_C),
.en(en)
);
// wire [3:0]count_1;
// wire t1;
// count_m10 count10_m1(
// .clk(clk),
// .rst_n(rst_n),
// .flag_1HZ(t0),
// .clr(1'b0),
// .data(count_1),
// .t(t1)
// );
//
//譯碼模塊
wire[7:0] seg_data_0;
seg_decoder U3(
.bin_data (count_0),
.seg_data (seg_data_0)
);
seg_scan U4(
.clk(clk),
.rst_n(rst_n),
.en(en),
.seg_sel(seg_sel),
.seg_data(seg_data),
.seg_data_0 ({1'b1,seg_data_0}),
.led_d0 (led_d0),
.led_d1 (led_d1),
.led_d2 (led_d2),
.led_d3 (led_d3)
);
// wire clk_1k,clk_1,clk_8;
// wire [4:0]kout;
// clk_div U1(
// .clk(clk),
// .f(1000),
// .clk_out(clk_1k)
// );
//
// clk_div U2(
// .clk(clk),
// .f(1),
// .clk_out(clk_1)
// );
//
// key_clr U4(.clk_1k(clk_1k),.kint(kint),.kout(key_out));
// key_sel U5(.clk_1k(clk_1k),.clk_1(clk_1));
endmodule
|
評(píng)分
-
查看全部評(píng)分
|