蓝桥杯FPGA赛道积分赛

一、第一期部分题目

代码如下: 

module led(
input wire clk,
input wire rst,
input wire  key1,
output wire  [7:0]led 
);


/*
always @(posedge clk or negedge rst)begin
	if(!rst)begin
	  led<=8'b1111_1111;
	end else begin
	if(key1==0)
	led<=8'b0101_0101;
	end 
end 
*/


assign led=(key1==0)?8'b0101_0101:8'b1111_1111;
endmodule

 

 

//状态机实现
module seg(
input wire clk,
input wire rst,
input wire [3:0]key,
output reg led1,
output  wire  [7:0]seg,
output  wire   [7:0]scl
);
 wire [3:0] key_value;
 reg  [31:0] dsp_data;
 //状态定义
 localparam IDLE=2'b00;
 localparam ON=2'b01;
 localparam OFF=2'b10;
 //状态切换的条件
 wire IDLE_ON;
 wire  ON_OFF;
 wire  OFF_ON;
 
 reg [1:0]cstatus;
 reg [1:0]nstatus;

 key key_inst(
 .sys_clk(clk),
 .sys_rst(rst),
 .key_in(key),
 .key_data(key_value) 
);

segdisplay segdisplay_inst
(
		.clk(clk)							,
	 	.rst(rst)							,
		.seg_number_in(dsp_data)		,
		.seg_number(seg)					,
		.seg_choice(scl)					
); 
assign IDLE_ON=(cstatus==IDLE&&key_value==4'b0001);
assign ON_OFF=(cstatus==ON&&key_value==4'b0001);
assign OFF_ON=(cstatus==OFF&&key_value==4'b0001);
//初始状态
always @(posedge clk or negedge rst)begin
	if(!rst)
		cstatus<=IDLE;
	else
		cstatus<=nstatus;
end 
//状态切换
always @(*)begin
  case(cstatus)
  IDLE:begin if(IDLE_ON) nstatus<=ON ;else  nstatus<=cstatus ; end 
  ON:begin if(ON_OFF) nstatus<=OFF ;else  nstatus<=cstatus  ;end 
  OFF:begin if(OFF_ON) nstatus<=ON ;else  nstatus<=cstatus ; end 
  default:nstatus<=IDLE;
  endcase
end
always @(*)begin
 case(cstatus)
	IDLE:begin dsp_data<={4'd10,4'd10,4'd10,4'd10,4'd10,4'd10,4'd10,4'd10}; led1<=1;end 
	ON:begin dsp_data<={4'd10,4'd10,4'd10,4'd10,4'd10,4'd10,4'd10,4'd1}; led1<=0; end 
	OFF:begin dsp_data<={4'd10,4'd10,4'd10,4'd10,4'd10,4'd10,4'd10,4'd0}; led1<=1; end 
	default:dsp_data<={4'd10,4'd10,4'd10,4'd10,4'd10,4'd10,4'd10,4'd10};
 endcase
end 
endmodule

按键驱动

module key(
    input   wire                sys_clk,
    input   wire                sys_rst,
    input   wire    [3:0]       key_in,
	 output reg      [3:0]		  key_data 
);

//按键键值定义
localparam  KEY_VAL_S1 =4'b0001;
localparam  KEY_VAL_S2 =4'b0010;
localparam  KEY_VAL_S3 =4'b0100;
localparam  KEY_VAL_S4=4'b1000;
localparam  KEY_VAL_NL=4'b1111;

localparam  KEY_COUNT_MAX =20'd500000;
//按键状态定义
localparam  IDLE      =3'd0;//无按键
localparam  PRESS     =3'd1;//有按键,确定哪个按键
localparam  RELEASE   =3'd2;//按键弹起

//按键扫描计数器,每隔0.01秒扫描一次按键
reg [19:0]   key_count;
//寄存器的定义用来存储不同的状态
reg [3:0]    key_status;

//按键计数更新
always@(posedge sys_clk or negedg
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值