Verilog核心语法速查:可综合写法、运算符陷阱与SV增强(附模板)

Verilog核心语法速查:可综合写法、运算符陷阱与SV增强(附模板)

📚 目录导航

  • [1. 概述](#1. 概述)
    • [1.1 为什么需要这份速查手册](#1.1 为什么需要这份速查手册)
    • [1.2 本文学习路径](#1.2 本文学习路径)
    • [1.3 可综合vs不可综合](#1.3 可综合vs不可综合)
  • [2. 模块与端口](#2. 模块与端口)
    • [2.1 模块定义(Verilog-2001标准)](#2.1 模块定义(Verilog-2001标准))
    • [2.2 参数化模块](#2.2 参数化模块)
    • [2.3 模块实例化](#2.3 模块实例化)
  • [3. 数据类型与常量](#3. 数据类型与常量)
    • [3.1 常用数据类型](#3.1 常用数据类型)
    • [3.2 数字常量表示](#3.2 数字常量表示)
    • [3.3 向量与数组](#3.3 向量与数组)
  • [4. 运算符速查](#4. 运算符速查)
    • [4.1 运算符优先级](#4.1 运算符优先级)
    • [4.2 常见运算符陷阱](#4.2 常见运算符陷阱)
  • [5. 过程块与赋值](#5. 过程块与赋值)
    • [5.1 initial vs always](#5.1 initial vs always)
    • [5.2 阻塞 vs 非阻塞](#5.2 阻塞 vs 非阻塞)
    • [5.3 连续赋值 assign](#5.3 连续赋值 assign)
  • [6. 流程控制](#6. 流程控制)
    • [6.1 条件分支](#6.1 条件分支)
    • [6.2 循环语句](#6.2 循环语句)
    • [6.3 完备性设计](#6.3 完备性设计)
  • [7. SystemVerilog工程化增强](#7. SystemVerilog工程化增强)
    • [7.1 统一数据类型 logic](#7.1 统一数据类型 logic)
    • [7.2 语义化过程块](#7.2 语义化过程块)
    • [7.3 枚举与结构体](#7.3 枚举与结构体)
    • [7.4 接口(Interface)](#7.4 接口(Interface))
  • [8. 工程化实战案例](#8. 工程化实战案例)
    • [8.1 参数化加法器](#8.1 参数化加法器)
    • [8.2 通用计数器](#8.2 通用计数器)
    • [8.3 多路选择器](#8.3 多路选择器)
  • [9. 常见问题与调试技巧](#9. 常见问题与调试技巧)
    • [9.1 综合警告处理](#9.1 综合警告处理)
    • [9.2 仿真调试技巧](#9.2 仿真调试技巧)
  • [10. 精选学习资源](#10. 精选学习资源)

1. 概述

1.1 为什么需要这份速查手册

在Verilog/SystemVerilog硬件设计中,语法繁多且容易混淆,特别是对于初学者和需要快速查阅的工程师。本速查手册旨在提供:

✅ 快速查阅: 高频使用的语法结构,一目了然
✅ 可综合导向: 重点关注可综合(Synthesizable) 的语法子集
✅ 最佳实践: 结合业界推荐的编码规范
✅ 现代化特性: 引入SystemVerilog的工程化增强特性

传统Verilog学习的痛点:

  • 语法规则多,容易记混
  • 不清楚哪些语法可综合,哪些仅用于仿真
  • 缺乏系统的最佳实践指导
  • 传统教材与现代工程实践脱节

1.2 本文学习路径

本文将按照以下路径帮助您快速掌握Verilog核心语法:

  1. 理解模块化设计的基本结构
  2. 掌握数据类型和运算符的正确使用
  3. 学习过程块和赋值的黄金法则
  4. 了解流程控制的完备性设计
  5. 进阶到SystemVerilog的现代化特性
  6. 通过实战案例巩固知识

📖 扩展学习资源:

1.3 可综合vs不可综合

理解哪些语法可以被综合工具转换为实际硬件电路至关重要:

语法类别 可综合 不可综合(仅仿真)
过程块 always @(*), always @(posedge clk) initial (部分FPGA支持ROM初始化)
赋值 assign, =, <= 带延时的赋值 #10
循环 for (固定边界) while, forever, repeat
数据类型 wire, reg, logic real, time, event
系统任务 - $display, $monitor, $finish

💡 黄金法则: 设计RTL代码时,始终以可综合为目标,仿真专用代码仅在Testbench中使用。


2. 模块与端口

📖 本章扩展学习:

2.1 模块定义(Verilog-2001标准)

特点: 推荐使用ANSI风格(端口声明直接写在括号内),简洁且不易出错。

verilog 复制代码
module adder (
    input  wire [7:0] a,
    input  wire [7:0] b,
    output wire [7:0] sum,
    output wire       cout
);
    assign {cout, sum} = a + b;
endmodule

💡 代码要点:

  • ✅ 使用ANSI-C风格端口声明(Verilog-2001标准)
  • ✅ 明确指定端口方向:inputoutputinout
  • ✅ 明确指定数据类型:wire(组合逻辑)、reg(时序逻辑)
  • ✅ 使用位宽声明:[MSB:LSB],如 [7:0] 表示8位

❌ 避免使用旧式风格:

verilog 复制代码
module adder (a, b, sum, cout);
    input  [7:0] a, b;
    output [7:0] sum;
    output cout;
    // 端口声明与定义分离,容易出错
endmodule

2.2 参数化模块

特点: 使用 parameter 提高模块复用性,实现可配置的设计。

verilog 复制代码
module counter #(
    parameter WIDTH = 8,
    parameter MAX_VAL = 255
)(
    input  wire                clk,
    input  wire                rst_n,
    output reg  [WIDTH-1:0]    cnt
);
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n)
            cnt <= {WIDTH{1'b0}};
        else if (cnt == MAX_VAL)
            cnt <= {WIDTH{1'b0}};
        else
            cnt <= cnt + 1'b1;
    end
endmodule

💡 参数使用要点:

  • parameter:可在实例化时重载
  • localparam:模块内部常量,不可重载
  • ✅ 使用参数定义位宽、深度等可配置项
  • ✅ 参数名使用大写或下划线分隔

2.3 模块实例化

位置映射方式(不推荐):

verilog 复制代码
counter u_cnt8 (clk, rst_n, cnt_val);

✅ 名称映射方式(推荐):

verilog 复制代码
counter #(
    .WIDTH(16),
    .MAX_VAL(65535)
) u_cnt16 (
    .clk(sys_clk),
    .rst_n(sys_rst_n),
    .cnt(cnt_val)
);

优点:

  • ✅ 端口连接清晰,不易出错
  • ✅ 端口顺序可任意调整
  • ✅ 便于代码审查和维护

3. 数据类型与常量

📖 本章扩展学习:

3.1 常用数据类型

类型 关键字 说明 适用场景 综合结果
线网 wire 物理连线,不能存储电荷 assign 赋值,模块互连 组合逻辑
寄存器 reg 数据存储单元(仿真语义) always, initial 块中赋值 可能是寄存器或组合逻辑
参数 parameter 模块级常量,可重载 定义位宽、状态机状态 常量
局部参 localparam 模块内部常量,不可外部重载 定义内部状态码 常量
整数 integer 32位有符号整数 循环变量、仿真计数 寄存器(32位)

💡 重要概念:

  • ⚠️ reg 不一定综合成寄存器!在组合逻辑 always @(*) 中使用 reg 会综合成组合逻辑
  • wire 只能用于 assign 连续赋值和模块端口连接
  • reg 可以在 always 块中赋值,但不能用于 assign

wire vs reg 对比表:

对比项 wire reg
赋值方式 assign 连续赋值 always 块中赋值
驱动源 必须有驱动源 可在过程块中赋值
综合结果 组合逻辑 取决于always块类型
默认值 z(高阻) x(未知)

3.2 数字常量表示

格式: [位宽]'[进制][数值]

verilog 复制代码
8'd10          // 8位十进制数10
8'h0A          // 8位十六进制数0A (等于十进制10)
4'b1010        // 4位二进制数1010
1'b1           // 1位二进制数1
32'hFFFF_0000  // 32位十六进制,下划线增加可读性
'hFF           // 位宽未指定,默认32位

💡 常量使用要点:

  • ✅ 明确指定位宽,避免位宽不匹配警告
  • ✅ 使用下划线 _ 分隔长数字,提高可读性
  • ✅ 十六进制常用于掩码和配置值
  • ⚠️ 不指定位宽时默认为32位,可能导致意外的位宽扩展

特殊值:

verilog 复制代码
4'bxxxx        // 4位不定值(don't care)
4'bzzzz        // 4位高阻态
4'b10x1        // 混合值:1、0、x

3.3 向量与数组

向量(Vector):

verilog 复制代码
reg  [7:0] data;      // 8位向量,MSB=7, LSB=0
wire [0:7] data_rev;  // 8位向量,MSB=0, LSB=7(不推荐)

// 位选择
assign bit_3 = data[3];

// 部分选择
assign low_nibble = data[3:0];   // 低4位
assign high_nibble = data[7:4];  // 高4位

数组(Array):

verilog 复制代码
reg [7:0] mem [0:255];  // 256个8位寄存器(存储器)
wire [3:0] bus [0:15];  // 16个4位线网

// 访问数组元素
assign data_out = mem[addr];

💡 向量vs数组:

  • 向量 :单个多位信号,如 reg [7:0] data 是一个8位信号
  • 数组 :多个信号的集合,如 reg [7:0] mem[0:255] 是256个8位信号

4. 运算符速查

📖 本章扩展学习:

类别 运算符 说明 示例 优先级
算术 +, -, *, /, % 加减乘除模 sum = a + b;
按位 &, ` , ^`, `~` 与、或、异或、取反 y = a & b;
归约 &, ` , ^, ~^` 单目运算,缩减为1位 all_ones = &data;
逻辑 &&, ` , !` 逻辑与、或、非(结果1/0)
关系 ==, !=, >, <, >=, <= 等于、不等于、大小比较 if (cnt == 10)
移位 <<, >>, <<<, >>> 逻辑/算术左移、右移 y = a << 2;
拼接 {a, b} 位拼接 y = {a[3:0], b[3:0]};
复制 {n{a}} 位复制 y = {4{2'b10}};
条件 ? : 三目运算符 y = sel ? a : b; 最低

4.1 运算符优先级

从高到低排列:

  1. () 括号
  2. !, ~, 单目运算符
  3. *, /, % 乘除模
  4. +, - 加减
  5. <<, >> 移位
  6. <, <=, >, >= 关系
  7. ==, != 相等
  8. &, ^, | 按位运算
  9. &&, || 逻辑运算
  10. ? : 条件运算符

💡 最佳实践: 使用括号明确运算顺序,提高代码可读性。

4.2 常见运算符陷阱

陷阱1:按位 vs 逻辑运算符

verilog 复制代码
wire a = 4'b0010;
wire b = 4'b0100;

// 按位与:逐位进行AND运算
assign y1 = a & b;   // 结果:4'b0000

// 逻辑与:先判断真假,再进行AND
assign y2 = a && b;  // 结果:1'b1 (两者都非0,所以为真)

陷阱2:归约运算符

verilog 复制代码
wire [3:0] data = 4'b1111;

// 归约与:所有位进行AND
assign all_ones = &data;   // 结果:1'b1

// 归约或:所有位进行OR
assign any_one = |data;    // 结果:1'b1

// 归约异或:所有位进行XOR(奇偶校验)
assign parity = ^data;     // 结果:1'b0

陷阱3:移位运算

verilog 复制代码
// 逻辑移位:补0
assign y1 = 8'b1010_0101 >> 2;   // 结果:8'b0010_1001

// 算术移位:保持符号位
assign y2 = 8'sb1010_0101 >>> 2; // 结果:8'sb1110_1001 (有符号数)

陷阱4:位拼接与复制

verilog 复制代码
// 位拼接
assign y1 = {4'b1010, 4'b0101};  // 结果:8'b1010_0101

// 位复制
assign y2 = {4{2'b10}};          // 结果:8'b1010_1010

// 常用于符号扩展
assign extended = {{8{data[7]}}, data};  // 8位扩展到16位

5. 过程块与赋值

📖 本章扩展学习:

5.1 initial vs always

过程块类型 执行次数 主要用途 可综合性
initial 仿真开始执行一次 Testbench初始化、信号赋初值 ❌ 不可综合(部分FPGA支持ROM初始化)
always 循环执行 描述硬件行为(组合/时序逻辑) ✅ 可综合

initial块示例(仅用于仿真):

verilog 复制代码
initial begin
    clk = 0;
    rst_n = 0;
    #100 rst_n = 1;
end

always块示例(可综合):

verilog 复制代码
always @(posedge clk) begin
    q <= d;
end

5.2 阻塞 vs 非阻塞

这是Verilog中最重要的概念之一,直接影响综合结果和仿真行为。

特性 阻塞赋值 (=) 非阻塞赋值 (<=)
执行方式 顺序执行,立即更新 并行执行,时间步结束时更新
适用场景 组合逻辑 always @(*) 时序逻辑 always @(posedge clk)
综合结果 组合逻辑 寄存器
类比 软件中的赋值 硬件中的触发器

✅ 正确示例:组合逻辑使用阻塞赋值

verilog 复制代码
always @(*) begin
    sum = a + b;      // 阻塞赋值
    cout = sum[8];
end

✅ 正确示例:时序逻辑使用非阻塞赋值

verilog 复制代码
always @(posedge clk or negedge rst_n) begin
    if (!rst_n)
        q <= 8'h00;   // 非阻塞赋值
    else
        q <= d;
end

❌ 错误示例:时序逻辑使用阻塞赋值

verilog 复制代码
// 错误!会导致仿真与综合不一致
always @(posedge clk) begin
    b = a;   // 阻塞赋值
    c = b;   // c会得到a的新值,而不是b的旧值
end

💡 黄金法则(Clifford E. Cummings):

  1. ✅ 组合逻辑使用阻塞赋值 =
  2. ✅ 时序逻辑使用非阻塞赋值 <=
  3. ❌ 不要在同一个always块中混用两种赋值
  4. ❌ 不要在多个always块中对同一变量赋值

5.3 连续赋值 assign

特点: 用于描述组合逻辑,右侧任何信号变化都会立即更新左侧。

verilog 复制代码
// 简单逻辑
assign y = a & b;

// 条件赋值
assign y = sel ? a : b;

// 位拼接
assign {cout, sum} = a + b;

// 多个assign语句
assign data_out = enable ? data_in : 8'hzz;
assign valid_out = enable & valid_in;

assign vs always @(*) 对比:

对比项 assign always @(*)
语法 连续赋值语句 过程块
左侧类型 必须是 wire 必须是 reg
适用场景 简单组合逻辑 复杂组合逻辑(if/case)
可读性 简洁 结构化

💡 选择建议:

  • ✅ 简单逻辑(1-2行):使用 assign
  • ✅ 复杂逻辑(if/case/多行):使用 always @(*)

6. 流程控制

📖 本章扩展学习:

6.1 条件分支

if-else vs case 对比:

对比项 if-else case
优先级 有优先级(级联判断) 无优先级(并行判断)
综合结果 级联MUX 并行MUX
适用场景 条件有优先级关系 多路选择,条件互斥
性能 延迟较大 延迟较小

if-else 示例:

verilog 复制代码
always @(*) begin
    if (rst_n == 0)
        y = 0;
    else if (sel == 2'b00)
        y = d0;
    else if (sel == 2'b01)
        y = d1;
    else
        y = d2;
end

case 语句模板(推荐):

verilog 复制代码
always @(*) begin
    case (sel)
        2'b00: y = d0;
        2'b01: y = d1;
        2'b10: y = d2;
        2'b11: y = d3;
        default: y = 8'h00;  // ✅ 必须加default防止锁存器
    endcase
end

💡 case语句要点:

  • ✅ 必须添加 default 分支,避免产生锁存器
  • ✅ 所有分支都要给输出赋值
  • ✅ 使用 casez 处理不定值(?
  • ✅ 使用 casex 处理不定值和高阻(x, z

casez 示例(优先级编码器):

verilog 复制代码
always @(*) begin
    casez (req)
        4'b1???: grant = 4'b1000;  // 最高优先级
        4'b01??: grant = 4'b0100;
        4'b001?: grant = 4'b0010;
        4'b0001: grant = 4'b0001;
        default: grant = 4'b0000;
    endcase
end

6.2 循环语句

特点: for 循环在编译时展开 ,用于批量实例化或逻辑复制,必须有固定边界

✅ 可综合的for循环:

verilog 复制代码
// 位反转
integer i;
always @(*) begin
    for (i=0; i<8; i=i+1) begin
        y[i] = a[7-i];
    end
end

// 奇偶校验
integer j;
always @(*) begin
    parity = 0;
    for (j=0; j<8; j=j+1) begin
        parity = parity ^ data[j];
    end
end

❌ 不可综合的循环:

verilog 复制代码
// while循环:不可综合
while (cnt < 100) begin
    cnt = cnt + 1;
end

// forever循环:不可综合(仅用于testbench)
forever begin
    #10 clk = ~clk;
end

💡 循环使用要点:

  • ✅ 循环边界必须是常量或参数
  • ✅ 循环变量使用 integer 类型
  • ✅ 循环体会被完全展开成并行逻辑
  • ⚠️ 避免过大的循环次数,会导致综合时间过长

6.3 完备性设计

完备性(Completeness) 是指所有可能的输入组合都有明确的输出定义,避免产生锁存器。

❌ 不完备的设计(产生锁存器):

verilog 复制代码
always @(*) begin
    if (en)
        y = a;
    // 缺少else分支,en=0时y保持原值 -> 锁存器!
end

✅ 完备的设计:

verilog 复制代码
// 方法1:补全else分支
always @(*) begin
    if (en)
        y = a;
    else
        y = 8'h00;
end

// 方法2:提前赋默认值
always @(*) begin
    y = 8'h00;  // 默认值
    if (en)
        y = a;
end

完备性检查清单:

  • ✅ if语句必须有else分支
  • ✅ case语句必须有default分支
  • ✅ 所有输出信号在所有分支都要赋值
  • ✅ 使用Lint工具检查潜在的锁存器

7. SystemVerilog工程化增强

📖 本章扩展学习:

7.1 统一数据类型 logic

传统Verilog的问题:

verilog 复制代码
wire  a;  // 只能用于assign
reg   b;  // 只能用于always,但不一定是寄存器

SystemVerilog的解决方案:

systemverilog 复制代码
logic c;  // 既可以用于assign,也可以用于always

💡 使用规则:

  • 单驱动信号 :一律使用 logic
  • 多驱动信号 (三态总线):保留 wire
  • 端口声明 :推荐使用 logic

logic vs wire/reg 对比:

特性 wire reg logic
assign驱动
always驱动
多驱动
推荐使用 三态总线 不推荐 所有单驱动信号

7.2 语义化过程块

SystemVerilog提供更清晰的过程块语义,编译器会进行额外检查。

Verilog SystemVerilog 用途 编译器检查
always @(*) always_comb 组合逻辑 检查是否推断锁存器
always @(posedge clk) always_ff @(posedge clk) 时序逻辑 检查是否有时钟
always @(...) always_latch 锁存器 明确意图

always_comb 示例:

systemverilog 复制代码
always_comb begin
    sum = a + b;
    cout = sum[8];
end

always_ff 示例:

systemverilog 复制代码
always_ff @(posedge clk or negedge rst_n) begin
    if (!rst_n)
        q <= 8'h00;
    else
        q <= d;
end

💡 优势:

  • ✅ 语义更清晰,代码可读性强
  • ✅ 编译器会检查是否符合预期(如组合逻辑不应有锁存器)
  • ✅ 自动推导敏感列表,避免遗漏信号

7.3 枚举与结构体

枚举类型(Enum):

systemverilog 复制代码
// 类型安全的状态机
typedef enum logic [2:0] {
    IDLE  = 3'b001,
    READ  = 3'b010,
    WRITE = 3'b100
} state_e;

state_e current_state, next_state;

always_ff @(posedge clk) begin
    current_state <= next_state;
end

结构体(Struct):

systemverilog 复制代码
// 打包结构体(可综合)
typedef struct packed {
    logic [7:0]  addr;
    logic [31:0] data;
    logic        we;
    logic        valid;
} axi_packet_t;

axi_packet_t tx_packet, rx_packet;

// 访问成员
assign addr_out = tx_packet.addr;

💡 优势:

  • ✅ 类型安全,防止赋值错误
  • ✅ 代码可读性强,状态名/字段名直观
  • ✅ 仿真时显示符号名而非数值
  • ✅ 便于代码维护和扩展

7.4 接口(Interface)

传统Verilog的问题:

verilog 复制代码
// 端口列表冗长,容易出错
module slave (
    input  wire        clk,
    input  wire        valid,
    input  wire [7:0]  addr,
    input  wire [31:0] data,
    output wire        ready
);

SystemVerilog Interface:

systemverilog 复制代码
// 定义接口
interface axi_if;
    logic        clk;
    logic        valid;
    logic [7:0]  addr;
    logic [31:0] data;
    logic        ready;
endinterface

// 使用接口
module slave (axi_if.slave bus);
    always_ff @(posedge bus.clk) begin
        if (bus.valid)
            bus.ready <= 1'b1;
    end
endmodule

💡 优势:

  • ✅ 简化端口连接,减少错误
  • ✅ 便于协议复用和维护
  • ✅ 支持modport定义不同视角

8. 工程化实战案例

📖 本章扩展学习:

8.1 参数化加法器

verilog 复制代码
module param_adder #(
    parameter WIDTH = 8
)(
    input  wire [WIDTH-1:0] a,
    input  wire [WIDTH-1:0] b,
    input  wire             cin,
    output wire [WIDTH-1:0] sum,
    output wire             cout
);
    assign {cout, sum} = a + b + cin;
endmodule

8.2 通用计数器

verilog 复制代码
module generic_counter #(
    parameter WIDTH = 8,
    parameter MAX_VAL = 255
)(
    input  wire                clk,
    input  wire                rst_n,
    input  wire                en,
    output reg  [WIDTH-1:0]    cnt,
    output wire                tc  // Terminal count
);
    always @(posedge clk or negedge rst_n) begin
        if (!rst_n)
            cnt <= {WIDTH{1'b0}};
        else if (en) begin
            if (cnt == MAX_VAL)
                cnt <= {WIDTH{1'b0}};
            else
                cnt <= cnt + 1'b1;
        end
    end
    
    assign tc = (cnt == MAX_VAL);
endmodule

8.3 多路选择器

verilog 复制代码
module mux #(
    parameter WIDTH = 8,
    parameter CHANNELS = 4
)(
    input  wire [WIDTH-1:0]           data_in [0:CHANNELS-1],
    input  wire [$clog2(CHANNELS)-1:0] sel,
    output reg  [WIDTH-1:0]           data_out
);
    always @(*) begin
        data_out = data_in[sel];
    end
endmodule

9. 常见问题与调试技巧

📖 本章扩展学习:

9.1 综合警告处理

常见综合警告:

警告类型 原因 解决方法
Latch inferred 组合逻辑不完备 添加else/default分支
Width mismatch 位宽不匹配 明确指定位宽
Multi-driven 多驱动冲突 检查赋值语句
Unused signal 信号未使用 删除或注释说明

9.2 仿真调试技巧

技巧1:使用$display打印调试信息

verilog 复制代码
always @(posedge clk) begin
    $display("Time=%0t cnt=%d", $time, cnt);
end

技巧2:使用$monitor监控信号变化

verilog 复制代码
initial begin
    $monitor("Time=%0t a=%b b=%b sum=%b", $time, a, b, sum);
end

技巧3:波形分析

  • 检查时钟和复位信号
  • 检查关键信号的时序关系
  • 使用标记(marker)定位问题时刻

10. 精选学习资源

本地资源:

-**

在线资源:

掌握Verilog核心语法是硬件设计的基础,建议结合实际项目反复练习,逐步形成良好的编码习惯。

相关推荐
步达硬件6 小时前
【FPGA】Verilog HDL编辑、RTL仿真、网表生成主流软件
fpga开发
太爱学习了16 小时前
XILINX SRIOIP核详解、FPGA实现及仿真全流程(Serial RapidIO Gen2 Endpoint v4.1)
fpga开发·srio·dsp
HIZYUAN1 天前
嵌入式开发踩坑记: AG32硬件设计指南(一)
stm32·单片机·嵌入式硬件·fpga开发·硬件设计·最小系统·agm ag32
上海全爱科技1 天前
全爱科技推出 摩尔线程E300+FPGA开发板HOUYI-1000V
科技·fpga开发
扣脑壳的FPGAer1 天前
Xilinx远程更新之axi-quad-spi IP core
fpga开发
Troke1 天前
串行数据与并行数据转换(1)
fpga开发
s1ckrain1 天前
数字逻辑笔记—同步时序电路
笔记·fpga开发·嵌入式
s09071361 天前
使用xilinx的fir IP核实现LFM信号匹配滤波的详细过程及原理
fpga开发·xilinx·fir·zynq·脉冲压缩
XINVRY-FPGA1 天前
XC2C256-7VQG100I Xilinx CoolRunner-II CPLD FPGA
单片机·嵌入式硬件·fpga开发·硬件工程·dsp开发·fpga