实现8位串行加法器,每周期处理1位,保留进位链,逐位完成多位加法运算。
串行加法器结构: a[i] → ┐ b[i] → ├─ FA ──→ sum[i] c → ┘ └──→ c_next 每周期: 1. 取 a[bit_idx] 和 b[bit_idx] 2. sum_bit = a_bit ^ b_bit ^ c 3. c_next = (a_bit & b_bit) | (a_bit & c) | (b_bit & c) 4. 存 c_next → c,sum[bit_idx] ← sum_bit 5. bit_idx++ 8周期后:carry_out = c
// Serial Adder - 逐位串行加法器
// 每周期处理1位,保留进位,逐位完成多位加法
module serial_adder(
input wire clk,
input wire rst,
input wire start,
input wire [7:0] a,
input wire [7:0] b,
output reg [7:0] sum,
output reg carry_out,
output reg done
);
reg [3:0] bit_idx;
reg c;
reg running;
always @(posedge clk or posedge rst) begin
if (rst) begin
sum <= 8'd0;
carry_out <= 1'b0;
done <= 1'b0;
bit_idx <= 4'd0;
c <= 1'b0;
running <= 1'b0;
end else begin
done <= 1'b0;
if (start && !running) begin
// Start new computation
running <= 1'b1;
bit_idx <= 4'd0;
c <= 1'b0;
sum <= 8'd0;
end
if (running) begin
if (bit_idx < 4'd8) begin
reg abit, bbit, s;
abit = a[bit_idx[2:0]];
bbit = b[bit_idx[2:0]];
s = abit ^ bbit ^ c;
c <= (abit & bbit) | (abit & c) | (bbit & c);
sum[bit_idx[2:0]] <= s;
bit_idx <= bit_idx + 4'd1;
end else begin
carry_out <= c;
done <= 1'b1;
running <= 1'b0;
end
end
end
end
endmodule
测试3组数据:(1) 123+89=212, carry=0 (2) 200+100=44, carry=1 (3) 255+1=0, carry=1。所有结果与预期完全一致。
本实验所有Verilog代码已通过Verilator编译验证,功能行为正确。测试用例覆盖核心功能路径,确保设计满足规格要求。
串行加法器在面积受限场景(如ASIC加密模块、低功耗MCU)中仍有应用。现代处理器使用超前进位(CLA)或进位选择加法器实现高速并行加法,但串行加法器帮助理解进位传播的本质。2024年RISC-V的Tiny核心仍使用串行ALU以节省面积。
尝试修改代码中的关键参数,观察仿真结果变化:
💡 Verilator会在位宽不匹配时给出Warning,这是学习的好机会
在现有基础上增加新功能:
🔧 增量开发:每次只改一个地方,验证通过后再改下一个
| 语法 | 说明 | 示例 |
|---|---|---|
reg [7:0] | 8位寄存器 | reg [7:0] data; |
wire | 组合逻辑连线 | wire valid = cnt > 5; |
always @(posedge clk) | 时序逻辑 | 上升沿触发 |
always @(*) | 组合逻辑 | 敏感列表自动推导 |
localparam | 局部常量 | localparam DIV = 50000000; |
case | 多分支选择 | 注意default分支 |
$display | 仿真打印 | 不可综合,仅仿真用 |
本设计在典型FPGA上的资源占用估算:LUT约20-120个,FF约30-100个,无BRAM/DSP依赖(特殊模块除外)。时钟频率可达50-100MHz+。Verilator仿真速度约5-10M周期/秒。