一、解题思路
- 什么是全加器?
全加器就是考虑进位的加法运算器。
一位全加器有Ci-1,Ai,Bi,Si,Ci。
输入端有Ci-1,Ai,Bi。
Ci-1:前一次运算后是否有进位,有进位则为1,无进位则为0.
Ai:被加数
Bi:加数
输出端:Si,Ci
Si:输出结果
Ci:输出本次运算的进位
全加器真值表:
下面就8bit数值进行逻辑结果上的梳理:
通过这7个全加器我们就可以得到8 bit 数中 1 的个数。
二、代码实现
module add_8 (
input [3:0] key ,
output sel ,
output reg [7:0] seg_dig
);
wire s0,s1,s2,s3,s4,s5,s6;
wire c0,c1,c2,c3,c4,c5,c6;
reg [7:0] data_in ;
wire [3:0] data_out;
//位选信号
assign sel = 1'b0;
//段选信号
always @(*) begin
case(data_out)
4'd0: seg_dig <= 8'b1100_0000;
4'd1: seg_dig <= 8'b1111_1001;
4'd2: seg_dig <= 8'b1010_0100;
4'd3: seg_dig <= 8'b1011_0000;
4'd4: seg_dig <= 8'b1001_1001;
4'd5: seg_dig <= 8'b1001_0010;
4'd6: seg_dig <= 8'b1000_0010;
4'd7: seg_dig <= 8'b1111_1000;
4'd8: seg_dig <= 8'b1000_0000;
4'd9: seg_dig <= 8'b1001_0000;
default:seg_dig<=8'b1100_0000;
endcase
end
//输入8bit数
always @(*) begin
if(key[0] == 1'b0)begin
data_in = 8'b1101_0100;//4个1
end
else if (key[1] == 1'b0)begin
data_in = 8'b0111_1100;//5个1
end
else if(key[2] == 1'b0)begin
data_in = 8'b1111_0011;//6个1
end
else if(key[3] == 1'b0)begin
data_in = 8'b0110_0001;//3个1x
end
else begin
data_in = 8'b0000_0000;
end
end
assign {c0,s0}= data_in[0] + data_in[1] + data_in[2];
assign {c1,s1}= data_in[3] + data_in[4] + data_in[5];
assign {c2,s2}= s0 + s1 + data_in[6];
assign {c3,s3}= s2 + data_in[7] + 1'b0 ;
assign {c4,s4}= c0 + c1 + c2 ;
assign {c5,s5}= s4 + c3 + 1'b0 ;
assign {c6,s6}= c5 + c4 + 1'b0 ;
assign data_out = {c6,s6,s5,s3};
endmodule
三、仿真
1、仿真代码
`timescale 1ns/1ps
module tb_add_8;
reg [3:0] tb_key ;
wire tb_sel ;
wire tb_seg_dig;
parameter CYCLE = 20; // 时钟周期
initial begin
tb_key = 4'b0001;
#(CYCLE * 100);
tb_key = 4'b0010;
#(CYCLE * 100);
tb_key = 4'b0100;
#(CYCLE * 100);
tb_key = 4'b1000;
#(CYCLE * 100);
$stop;
end
add_8 u_add_8(
.key (tb_key),
.sel (tb_sel),
.seg_dig (tb_seg_dig)
);
endmodule
2、仿真截图
四、演示视频
使用1 bit 全加器,计算一个8 bit 数中 1 的个数