TAG
- F P G A 、期末、速成 FPGA、期末、速成 FPGA、期末、速成// A. 系统级描述:
module full_adder (
input A, B, Cin,
output Sum, Cout
);
// 系统级描述中可以使用高级的抽象,不关注具体电路实现细节
assign {Sum, Cout} = A + B + Cin;
endmodule
// B. 算法级描述:
module full_adder (
input A, B, Cin,
output Sum, Cout
);
// 算法级描述关注操作的算法,但不涉及具体的硬件结构
always_comb begin
Sum = A ^ B ^ Cin;
Cout = (A & B) | (B & Cin) | (A & Cin);
end
endmodule
// C. 门级描述:
module full_adder (
input A, B, Cin,
output Sum, Cout
);
// 门级描述涉及具体的逻辑门实现
wire w1, w2, w3, w4;
assign w1 = A ^ B;
assign w2 = w1 ^ Cin;
assign w3 = A & B;
assign w4 = w3 | (w1 & Cin);
assign {Sum, Cout} = {w2, w4};
endmodule
// D. RTL级描述(寄存器传输级描述):
module full_adder (
input wire A, B, Cin,
output wire Sum, Cout
);
// RTL级描述涉及到数据传输和寄存器的操作
reg [1:0] sum_reg;
always @(posedge clk or posedge rst) begin
if (rst) begin
sum_reg <= 2'b0;
end else begin
sum_reg <= A + B + Cin;
end
end
assign {Sum, Cout} = sum_reg;
endmodule
这些描述层级从高到低,系统级描述抽象程度高,而RTL级描述更接近硬件实现。
1
2
3
4
5
1
module mux4_1 (
output reg out,
input wire in0, in1, in2, in3,
input wire [1:0] sel
);
always @(sel or in0 or in1 or in2 or in3) begin
case (sel)
2'b00: out = in0;
2'b01: out = in1;
2'b10: out = in2;
2'b11: out = in3;
default: out = 1'b0; // Optional default case
endcase
end
endmodule
2
<占个坑>
3
module voter7 (
input [6:0] vote, // 输入七个人的投票,使用二进制编码表示
output reg pass // 输出表决结果
);
always @(posedge clk or negedge rst) begin
if (~rst) begin
// 在复位时可以对pass进行初始化,例如 pass <= 1'b0;
end else begin
// 在这里实现表决逻辑,这里只是一个简单的例子
// 如果超过半数的人投赞成票(1),则 pass 置为 1,否则为 0
pass <= (vote >= 4);
end
end
endmodule
4
module count4(
output reg [7:0] out,
input [7:0] data,
input load,
input reset,
input clk
);
always @(posedge clk or posedge reset) begin
if (reset) begin
out <= 8'b0; // 同步清零
end else if (load) begin
out <= data; // 同步置数
end else begin
out <= out + 1; // 计数
end
end
endmodule
1
2
// 结构描述:(门原语)
module FullAdder (input A, input B, input Cin, output Sum, output Cout);
xor f1(t1, A, B);
xor f2(sum, t1, Cin);
and f3(t3, A, B);
and f4(t4, A, Cin);
and f5(t5, B, Cin);
or f6(Cout, t3, t4, t5);
endmodule
// 数据流描述:(表达式)
module FullAdder (input A, input B, input Cin, output Sum, output Cout);
assign {Cout, Sum} = A + B + Cin;
endmodule
// 行为描述:(块语句等高级抽象语言)
module FullAdder (input A, input B, input Cin, output reg Sum, output reg Cout);
always @(A or B or Cin) begin
Sum = A ^ B ^ Cin;
Cout = (A & B) | (B & Cin) | (A & Cin);
end
endmodule
3
module AAA(
output reg [7:0] out,
input [7:0] data,
input load,
input reset,
input clk
);
// 同步不需要 ` or negedge reset or posedge load`,不然就变成异步了
always @(posedge clk) begin
if (~reset) begin
out <= 8'b00000000; // 同步清零
end else if (load) begin
out <= data; // 同步置数
end else begin
out <= out + 1; // 计数操作
end
end
endmodule
4
module fsm_seq101(
input clk, clr, x,
output reg z
);
parameter s0 = 2'b 00;
parameter s1 = 2'b 01;
parameter s2 = 2'b 11;
parameter s3 = 2'b 10;
reg [1:0] now,next;
always @(posegde clk or negedge clr) begin
if (~clr) now = s0;
else now = next;
end
always @(posegde clk or negedge clr) begin
if (~clr) next = s0;
else begin
case (x) // 只是表示当前进行到第几步而已
s0: x ? next = s1 : s0;
s1: x ? next = s1 : s2;
s2: x ? next = s3 : s0;
s3: x ? next = s1 : s2;
default: next = s0;
endcase
end
end
always @(posedge clk or negedge clr) begin
if (~clr) z = 0;
else begin
z = now == s3 ? 1 : 0;
end
end
endmodule
module mult_8(
output reg [15:0] outcome, // 输出乘法结果,16位宽度
input [7:0] a, // 输入数 a,8位宽度
input [7:0] b // 输入数 b,8位宽度
);
reg [15:0] temp,i; // 用于保存中间结果
always @(a or b) begin
temp = 16'b0; // 初始化中间结果为0
for (i = 0; i < 8; i = i + 1) begin
if (b[i]) // 如果 b 的当前位为1,则将 a 左移相应的位数,并加到中间结果上
temp = temp + (a << i);
end
outcome = temp; // 将最终结果输出
end
endmodule
module count8(
output reg [7:0] out, // 输出计数器结果
input [7:0] data, // 同步置数数据
input load, // 同步置数使能信号,高电平有效
input reset, // 异步清零信号,低电平有效
input clk // 时钟信号
);
always_ff @(posedge clk or negedge reset) begin
if (~reset) // 异步清零
out <= 8'b0;
else if (load) // 同步置数
out <= data;
else
out <= out + 1; // 正常计数
end
endmodule
实现细节
参考示意图
参考链接
作者 | 乐意奥AI