FPGA - 240102 - FPGA期末速成

  • 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
    1. 在FPGA构成的数字系统中,为什么通常需要要配备一个PROM或E2PROM?
  • 因为常用的FPGA的结构是基于SRAM的,掉电后芯片内的信息将消失,所以配备一个PROM或E2PROM,使得上电后,FPGA的信息由外部加载到芯片中,使得FPGA成为用户需要功能的芯片。
  • // 2
    1. FPGA的基本结构主要包括哪些组成部分?
  • 输入/输出模块IOB,用于存放编程数据的SRAM,可编程逻辑块CLB,互连资源IR。
  • // 3
    1. 什么是组合逻辑和时序逻辑?两者的区别有哪些?
  • 组合逻辑指有常见逻辑门构成的,不需要时钟驱动的电路;
  • 时序电路是指包含寄存器等需要时钟驱动的电路;
  • 两者最主要的区别在于是否需要时钟触发。
  • // 4
    1. 简述阻塞赋值与非阻塞赋值的不同。
  • 符号分别为“=”和“<=”;
  • (1)阻塞赋值:赋值立刻完成;完成该赋值语句后才能执行下一句的操作;硬件没有对应的电路,因而综合结果未知。
  • (2)非阻塞赋值:赋值不是立刻完成的,而是在块结束时才完成;块内的多条赋值语句在块结束时同时赋值;硬件有对应的电路。
  • // 5
    1. 简述Verilog HD设计中不同层次的抽象。
  • Verilog HD设计中,抽象级别可以分为五级:
  • (1)系统级(system level): 用高级语言结构(如case语句)实现的设计模块外部性能的模型;
  • (2)算法级(algorithmic level): 用高级语言结构实现的设计算法模型(写出逻辑表达式);
  • (3)RTL级(register transfer level): 描述数据在寄存器之间流动和如何处理这些数据的模型;
  • (4)门级(gate level): 描述逻辑门(如与门、非门、或门、与非门、三态门等)以及逻辑门之间连接的模型;
  • (5)开关级(switch level): 描述器件中三极管和储存节点及其之间连接的模型。
  • // 1
    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
    1. 用Verilog HDL设计一个分频电路,要求输入、输出信号分别为10MHz和500KHz的方波,具有异步清零功能。 模块名:module fdivision(RESET,F10M,F500K);
<占个坑>
  • // 3
    1. 用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
    1. 用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
    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
    1. 简述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
    FPGA - 240102 - FPGA期末速成_第1张图片
  • 2
    FPGA - 240102 - FPGA期末速成_第2张图片
  • 3
    FPGA - 240102 - FPGA期末速成_第3张图片

参考链接


作者 | 乐意奥AI

你可能感兴趣的:(FPGA,fpga)