module ha(key_clk, rst, HexSwitch, seg1_1_1, en1);
input key_clk;
input rst;
input [1:0] HexSwitch; // 新增的HexSwitch输入端口
output [3:0] seg1_1_1;
output [3:0] en1;
wire c;
wire[4:0] data;
wire[7:0] BCD;
wire[7:0] seg1_1;
wire[7:0] seg2_2;
wire[3:0] en1;
wire[7:0] seg1_1_1;
// 将按键信号连接到计数器的时钟输入
// 假设key_button是按键信号,debounce是消抖模块
CNT10 cnt(.CLK(key_clk), .RST(rst), .COUT(c), .DOUT(data));
BCD_CONVERT bcd01(.A(data), .D(BCD)); // 注意:这里A的位宽应该与data相同
// 根据HexSwitch的值选通HEX0和HEX1
seven_segment_display HEX0(.bcd(BCD[3:0]), .seg(seg1_1));
seven_segment_display HEX1(.bcd(BCD[7:4]), .seg(seg2_2));
smg_select smgselection(.hexswitch(HexSwitch), .seg1(seg1_1), .seg2(seg2_2),.seg11(seg1_1_1),.en(en1));
endmodule
module CNT10(CLK,RST,COUT,DOUT);
input CLK,RST;
output[4:0] DOUT;
output COUT;
reg[4:0] Q1; reg COUT;
assign DOUT = Q1;
always @(posedge CLK or negedge RST)
begin
if(!RST) Q1 <= 0;
else if(Q1 < 31) Q1 <= Q1+1;
else Q1 <= 4'b0000;
end
always@(Q1)
if(Q1 == 5'd31) COUT = 1'b1; else COUT = 1'b0;
endmodule
module BCD_CONVERT(A,D);
input[4:0] A; output[7:0] D;
reg[7:0] D;
always @(*) begin
D[7:4] = A/10;
D[3:0] = A%10;
end
endmodule
module seven_segment_display(bcd,seg);
input[3:0] bcd;
output[7:0] seg;
reg[7:0] seg;
// 定义七段数码管段到BCD码的映射
always @(*) begin
case(bcd)
4'b0000://0
seg=8'b0000_0011;
4'b0001://1
seg=8'b1001_1111;
4'b0010://2
seg=8'b0010_0101;
4'b0011://3
seg=8'b0000_1101;
4'b0100://4
seg=8'b1001_1001;
4'b0101://5
seg=8'b0100_1001;
4'b0110://6
seg=8'b0100_0001;
4'b0111://7
seg=8'b0001_1111;
4'b1000://8
seg=8'b0000_0001;
4'b1001://9
seg=8'b0000_1001;
default://杩欓噷浠呯紪璇戜簡0-9杩欏嚑涓暟瀛?
seg=8'b1111_1111; // 无效输入
endcase
end
endmodule
module smg_select(hexswitch, seg1, seg2,seg11,en);
input[1:0] hexswitch;
input[7:0] seg1;
input[7:0] seg2;
output seg11;
output[3:0] en;
reg[7:0] seg11;
reg[3:0] en;
always @(*) begin
if (hexswitch == 2'b01) begin
seg11 = seg1;
en = 4'b1110;
end else if (hexswitch == 2'b10) begin
seg11 = seg2;
en = 4'b1101;
end else begin
en = 4'b1111;
end
end
endmodule
input key_clk;
input rst;
input [1:0] HexSwitch; // 新增的HexSwitch输入端口
output [3:0] seg1_1_1;
output [3:0] en1;
wire c;
wire[4:0] data;
wire[7:0] BCD;
wire[7:0] seg1_1;
wire[7:0] seg2_2;
wire[3:0] en1;
wire[7:0] seg1_1_1;
// 将按键信号连接到计数器的时钟输入
// 假设key_button是按键信号,debounce是消抖模块
CNT10 cnt(.CLK(key_clk), .RST(rst), .COUT(c), .DOUT(data));
BCD_CONVERT bcd01(.A(data), .D(BCD)); // 注意:这里A的位宽应该与data相同
// 根据HexSwitch的值选通HEX0和HEX1
seven_segment_display HEX0(.bcd(BCD[3:0]), .seg(seg1_1));
seven_segment_display HEX1(.bcd(BCD[7:4]), .seg(seg2_2));
smg_select smgselection(.hexswitch(HexSwitch), .seg1(seg1_1), .seg2(seg2_2),.seg11(seg1_1_1),.en(en1));
endmodule
module CNT10(CLK,RST,COUT,DOUT);
input CLK,RST;
output[4:0] DOUT;
output COUT;
reg[4:0] Q1; reg COUT;
assign DOUT = Q1;
always @(posedge CLK or negedge RST)
begin
if(!RST) Q1 <= 0;
else if(Q1 < 31) Q1 <= Q1+1;
else Q1 <= 4'b0000;
end
always@(Q1)
if(Q1 == 5'd31) COUT = 1'b1; else COUT = 1'b0;
endmodule
module BCD_CONVERT(A,D);
input[4:0] A; output[7:0] D;
reg[7:0] D;
always @(*) begin
D[7:4] = A/10;
D[3:0] = A%10;
end
endmodule
module seven_segment_display(bcd,seg);
input[3:0] bcd;
output[7:0] seg;
reg[7:0] seg;
// 定义七段数码管段到BCD码的映射
always @(*) begin
case(bcd)
4'b0000://0
seg=8'b0000_0011;
4'b0001://1
seg=8'b1001_1111;
4'b0010://2
seg=8'b0010_0101;
4'b0011://3
seg=8'b0000_1101;
4'b0100://4
seg=8'b1001_1001;
4'b0101://5
seg=8'b0100_1001;
4'b0110://6
seg=8'b0100_0001;
4'b0111://7
seg=8'b0001_1111;
4'b1000://8
seg=8'b0000_0001;
4'b1001://9
seg=8'b0000_1001;
default://杩欓噷浠呯紪璇戜簡0-9杩欏嚑涓暟瀛?
seg=8'b1111_1111; // 无效输入
endcase
end
endmodule
module smg_select(hexswitch, seg1, seg2,seg11,en);
input[1:0] hexswitch;
input[7:0] seg1;
input[7:0] seg2;
output seg11;
output[3:0] en;
reg[7:0] seg11;
reg[3:0] en;
always @(*) begin
if (hexswitch == 2'b01) begin
seg11 = seg1;
en = 4'b1110;
end else if (hexswitch == 2'b10) begin
seg11 = seg2;
en = 4'b1101;
end else begin
en = 4'b1111;
end
end
endmodule