FPGA - 240102 - FPGA期末速成
2024-01-02 07:06:40
TAG
- F P G A 、期末、速成 FPGA、期末、速成 FPGA、期末、速成
- // – 习题1 – //
- CPLD(Complex Programmable Logic Device)是 Complex PLD 的简称,一种较 PLD 为复杂的逻辑元件。
- CPLD 逻辑资源多寄存器少,FPGA 逻辑弱而寄存器多,这正好与控制密集型系统与数据密集型系统相对应。
- CPLD 是基于乘积项结构的可编程逻辑器件,FPGA 是基于查找表结构的可编程逻辑器件。
- //
- 在 FPGA(Field-Programmable Gate Array —— 现场可编程门阵列)中,使用 LUT(查找表)来实现组合逻辑电路的功能。
- 在 FPGA 器件中,LUT 主要用于实现组合电路,在实现结构上一个 4 输入的查找表相当于一个 16 位的RAM。
- 通常而言,FPGA 逻辑块之间是分布式互连,其特点是等延时,而 CPLD 逻辑块之间是集中式的互连,其延时与系统布局有关。
- FPGA 一般是基于 SRAM 的配置方式,配置方法相对灵活。
- 基于SRAM(Static Random-Access Memory)的 FPGA 器件之所以需要在每次上电后进行一次配置,是因为 SRAM 是一种易失性存储器,其存储的配置信息会在断电时丢失。
- //
- ASIC(Application-Specific Integrated Circuit)是指应用特定集成电路,是一种定制化设计的集成电路,专为特定应用领域或任务而设计。
- //
- GAL 是比 FPGA 逻辑规模更小的可编程逻辑器件。
- GAL(Generic Array Logic)是一种可编程逻辑器件,属于复杂的数字集成电路(IC)家族。它是一种与FPGA(Field-Programmable Gate Array)类似的可编程逻辑设备,但规模相对较小。
- //
- PLA(Programmable Logic Array):PLA 包含一个可编程的 AND 阵列和一个可编程的 OR 阵列。
- PAL:在 PAL 中,用户主要通过编程 AND 阵列来实现逻辑功能,而 OR 阵列是固定的,无法由用户直接编程。
- SPLD(Simple Programmable Logic Device)
- PLA、PAL、GAL 等 SPLD 器件更适合于实现大规模的组合逻辑而不是时序逻辑电路。
- //
- RTL 是 Register Transfer Level(寄存器传输级)的缩写,它是数字电路设计的一种抽象级别。RTL 描述了数字电路中的数据流和控制流,强调在时钟周期内数据是如何从一个寄存器传输到另一个寄存器的。
- //
- 若 Verilog HDL 模块中的输入/输出信号类型缺省,则该信号为 wire 型,具有无数据存储特性。
- 在数字电路设计中,双向信号通常用于特定情况,如总线或双工通信,但在模块级别的设计中,一般使用单向信号来更好地控制信号的流向。
- //
- = 阻塞赋值:顺序执行
- <= 非阻塞赋值:并行执行
- //
- A. 系统级描述 B. 算法级描述 C. 门级描述 D. RTL级描述
用Verilog语言,四种描述分别描述一位全加器
// 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
-
- 在FPGA构成的数字系统中,为什么通常需要要配备一个PROM或E2PROM?
- 因为常用的FPGA的结构是基于SRAM的,掉电后芯片内的信息将消失,所以配备一个PROM或E2PROM,使得上电后,FPGA的信息由外部加载到芯片中,使得FPGA成为用户需要功能的芯片。
- //
2
-
- FPGA的基本结构主要包括哪些组成部分?
- 输入/输出模块IOB,用于存放编程数据的SRAM,可编程逻辑块CLB,互连资源IR。
- //
3
-
- 什么是组合逻辑和时序逻辑?两者的区别有哪些?
- 组合逻辑指有常见逻辑门构成的,不需要时钟驱动的电路;
- 时序电路是指包含寄存器等需要时钟驱动的电路;
- 两者最主要的区别在于是否需要时钟触发。
- //
4
-
- 简述阻塞赋值与非阻塞赋值的不同。
- 符号分别为“=”和“<=”;
- (1)阻塞赋值:赋值立刻完成;完成该赋值语句后才能执行下一句的操作;硬件没有对应的电路,因而综合结果未知。
- (2)非阻塞赋值:赋值不是立刻完成的,而是在块结束时才完成;块内的多条赋值语句在块结束时同时赋值;硬件有对应的电路。
- //
5
-
- 简述Verilog HD设计中不同层次的抽象。
- Verilog HD设计中,抽象级别可以分为五级:
- (1)系统级(system level): 用高级语言结构(如case语句)实现的设计模块外部性能的模型;
- (2)算法级(algorithmic level): 用高级语言结构实现的设计算法模型(写出逻辑表达式);
- (3)RTL级(register transfer level): 描述数据在寄存器之间流动和如何处理这些数据的模型;
- (4)门级(gate level): 描述逻辑门(如与门、非门、或门、与非门、三态门等)以及逻辑门之间连接的模型;
- (5)开关级(switch level): 描述器件中三极管和储存节点及其之间连接的模型。
- //
1
-
- 用Verilog HDL设计2位sel控制的4选1多路选择器。 模块名:module mux4_1 (out, in0, in1, in2, in3, sel);
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
-
- 用Verilog HDL设计一个分频电路,要求输入、输出信号分别为10MHz和500KHz的方波,具有异步清零功能。 模块名:module fdivision(RESET,F10M,F500K);
<占个坑>
- //
3
-
- 用Verilog HDL设计七人投票表决器。 模块名: module voter7(pass,vote);
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
-
- 用Verilog HDL设计8位的同步置数同步清零计数器: 模块名: module count4(out, data, load, reset, clk);
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
- // – 习题2 – //
- 过程语句 - always
- 连续语句 - assign
- //
- 块语句有两种,一种是begin-end语句,用来标志顺序执行的语句;一种是fork-join语句,通常用来标志并行执行的语句。
- //
- 在EDA的IP核中,软IP是可编程语言描述的,灵活性较高;固IP结合了硬件和嵌入式软件;硬IP以硬件电路形式存在,性能最高。
- //
- MAX7000系列是由Altera(现在是Intel)公司生产的CPLD(可编程逻辑器件)而不是FPGA(现场可编程门阵列)结构。
- //
- 不完整的 if 语句,其综合结果可实现 时序逻辑电路。
- //
1
-
- 请写出以下英文缩写的中文全称:EDA,ASIC,HDL,FPGA,CPLD。
- EDA: 电子设计自动化(Electronic Design Automation)
- ASIC: 定制集成电路(Application-Specific Integrated Circuit)
- HDL: 硬件描述语言(Hardware Description Language)
- FPGA: 现场可编程门阵列(Field-Programmable Gate Array)
- CPLD: 可编程逻辑器件(Complex Programmable Logic Device)
- //
2
-
- 简述Verilog HD设计中的结构描述、数据流描述和行为描述。
- 结构描述:通过调用库中元件(如逻辑门、晶体管)或设计好的模块来完成设计实体功能,描述只表示元件(模块)和元件(模块)之间的互联。
- 数据流(Data Flow)描述:描述数据在寄存器、逻辑门之间传输和处理的过程,主要使用持续赋值语句(assign),通过表达式、操作符和操作数来设计电路。
- 行为(Behavioral)描述:对设计实体的数学模型描述,无需知道具体电路结构,只需描述清楚输入与输出信号的行为。
- //
- 一般来说,与门、或门、与非门、或非门等支持多个输入,而非门、异或门、异或非门等通常只有一个或两个输入。
- //
// 结构描述:(门原语)
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
- 按要求给出Verilog语言代码
程序的逻辑功能为:8位的同步清零、同步置数的计数器。
程序注释:
①定义模块名为AAA,端口为out、data、load、reset、clk
②定义out为输出端口,out为8位宽的二进制数
③定义data为输入端口,data为8位宽的二进制数
④定义load、reset、clk为输入端口
⑤定义out为八位宽的reg型变量
⑥过程语句,敏感变量为时钟clk,上升沿触发方式
⑦条件语句,同步清零信号为低电平时,对out清零
⑧条件语句,同步置数信号为高电平时,把data的值赋给out,完成置数操作
⑨若同步清零信号、同步置数信号无效时,完成计数操作。
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
- Moore 莫尔型:输出只依赖于状态而不依赖于其输入信号
- Mealy 米里型:输出不仅依赖状态而且依赖于它的输入
- //
- 利用有限状态机,以格雷码编码方式设计一个从输出信号序列中检测出101信号的序列检测器,其状态转移图如下图所示。 模块名:module fsm_seq101(clk, clr, x, z);
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
- // – 习题3 – //
- 1.用for语句和移位运算符实现两个8位二进制数a和b的乘法运算。 模块名:module mult_8(outcome, a, b);
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
- 2.用Verilog HDL设计8位的带异步清零(低电平有效)、同步置数(高电平有效)的计数器。 模块名: module count8(out, data, load, reset, clk);
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
实现细节
- 无
参考示意图
-
1 -
2 -
3
参考链接
- 无
作者 | 乐意奥AI
文章来源:https://blog.csdn.net/CodeToLiao/article/details/135330845
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!