实验九 8位硬件加法器的设计

module key_led(clock,key,led,hex,bin,seg,dig,ledin,data);
input clock;							//系统时钟(48MHz)
input[7:0] key;							//按键输入(KEY1~KEY8)
output[7:0] led;						//LED输出(LED1~LED8)
output[15:0]hex;						//4位16进制数输出(在数码管1~4显示)
output[3:0]bin;							//4位2进制数输出(在LED1~LED4显示)
output[7:0]seg;							//数码管段码输出
output[7:0]dig;							//数码管位码输出
input[3:0]ledin;						//LED显示输入(在LED5~LED8显示)
input[15:0]data;						//数码管显示输出(在数码管5~8显示)

reg[15:0]hex_r;
reg[3:0]bin_r;
reg[7:0]seg_r;		
reg[7:0]dig_r;		

reg[16:0]count;							//时钟分频计数器
reg[7:0]dout1,dout2,dout3,buff;			//消抖寄存器
reg[2:0]cnt3;						    //数码管扫描计数器	
reg[3:0]disp_dat;				    	//数码管扫描显存		
reg div_clk;							//分频时钟,用于消抖和扫描
								 									
wire[7:0]key_edge;					//按键消抖输出

//信号输出
assign hex = hex_r;
assign bin = bin_r;
assign seg = seg_r;
assign dig = dig_r;
assign led = ~{ledin,bin_r};		        

//时钟分频部分
always @(posedge clock)
begin
	if (count < 17'd120000)
	begin
 	    count <= count + 1'b1;
 	    div_clk <= 1'b0;
 	end
 	else
 	begin
 	    count <= 17'd0;
 	    div_clk <= 1'b1;
 	end
end

//按键消抖部分
always @(posedge clock)
begin
	if(div_clk)
	begin
		dout1 <= key;
		dout2 <= dout1;
		dout3 <= dout2;
	end	
end

//按键边沿检测部分
always @(posedge clock)
begin
	buff <= dout1 | dout2 | dout3;
end

assign key_edge = ~(dout1 | dout2 | dout3) & buff;

//4位16进制数输出部分
always @(posedge clock)							//按键1
begin
	if(key_edge[0])	
		hex_r[15:12] <= hex_r[15:12] + 1'b1;
end

always @(posedge clock)							//按键2
begin
	if(key_edge[1])	
		hex_r[11:8] <= hex_r[11:8] + 1'b1;
end

always @(posedge clock)							//按键3
begin
	if(key_edge[2])	
		hex_r[7:4] <= hex_r[7:4] + 1'b1;
end

always @(posedge clock)							//按键4
begin
	if(key_edge[3])	
		hex_r[3:0] <= hex_r[3:0] + 1'b1;
end

//4位2进制数输出部分

always @(posedge clock)							//按键5
begin
	if(key_edge[4])	
		bin_r[0] <= ~bin_r[0];
end

always @(posedge clock)							//按键6
begin
	if(key_edge[5])	
		bin_r[1] <= ~bin_r[1];
end

always @(posedge clock)							//按键7
begin
	if(key_edge[6])	
		bin_r[2] <= ~bin_r[2];
end

always @(posedge clock)							//按键8
begin
	if(key_edge[7])	
		bin_r[3] <= ~bin_r[3];
end

//数码管扫描显示部分
always @(posedge clock)   				//定义上升沿触发进程
begin
	if(div_clk)
		cnt3 <= cnt3 + 1'b1;
end

always @(posedge clock)   						
begin
	if(div_clk)
	begin
		case(cnt3)							//选择扫描显示数据
			3'd0:disp_dat = hex_r[15:12];	//第一个数码管
			3'd1:disp_dat = hex_r[11:8];	//第二个数码管
			3'd2:disp_dat = hex_r[7:4];		//第三个数码管
			3'd3:disp_dat = hex_r[3:0];		//第四个数码管
			3'd4:disp_dat = data[15:12];	//第五个数码管
			3'd5:disp_dat = data[11:8];		//第六个数码管
			3'd6:disp_dat = data[7:4];		//第七个数码管
			3'd7:disp_dat = data[3:0];		//第八个数码管
		endcase
		case(cnt3)							//选择数码管显示位
			3'd0:dig_r = 8'b01111111;		//选择第一个数码管显示
			3'd1:dig_r = 8'b10111111;		//选择第二个数码管显示
			3'd2:dig_r = 8'b11011111;		//选择第三个数码管显示
			3'd3:dig_r = 8'b11101111;		//选择第四个数码管显示
			3'd4:dig_r = 8'b11110111;		//选择第五个数码管显示
			3'd5:dig_r = 8'b11111011;		//选择第六个数码管显示
			3'd6:dig_r = 8'b11111101;		//选择第七个数码管显示
			3'd7:dig_r = 8'b11111110;		//选择第八个数码管显示
		endcase	
	end
end

always @(disp_dat)
begin
	case(disp_dat)						//七段译码
		4'h0:seg_r = 8'hc0;				//显示0
		4'h1:seg_r = 8'hf9;				//显示1
		4'h2:seg_r = 8'ha4;				//显示2
		4'h3:seg_r = 8'hb0;				//显示3
		4'h4:seg_r = 8'h99;				//显示4
		4'h5:seg_r = 8'h92;				//显示5
		4'h6:seg_r = 8'h82;				//显示6
		4'h7:seg_r = 8'hf8;				//显示7
		4'h8:seg_r = 8'h80;				//显示8
		4'h9:seg_r = 8'h90;				//显示9
		4'ha:seg_r = 8'h88;				//显示a
		4'hb:seg_r = 8'h83;				//显示b
		4'hc:seg_r = 8'hc6;				//显示c
		4'hd:seg_r = 8'ha1;				//显示d
		4'he:seg_r = 8'h86;				//显示e
		4'hf:seg_r = 8'h8e;				//显示f
	endcase
end

endmodule

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值