一、第一期部分题目

代码如下:
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

最低0.47元/天 解锁文章
2418

被折叠的 条评论
为什么被折叠?



