在FPGA设计里,原语(Primitive)是最基础的硬件单元,比如逻辑门、触发器、IO缓冲器等都属于原语。它们对应着FPGA芯片内部实际的物理结构。使用原语能够让设计更贴近硬件底层,对时序和资源的利用进行精确控制。下面结合不同类型的原语,详细介绍其使用方法。
1. 基本逻辑门原语
基本逻辑门原语包括`AND`、`OR`、`NOT`、`XOR`等,可直接映射到FPGA内部的查找表(LUT)资源。
verilog示例
module logic_gate_primitives (
input wire a, b,
output wire and_out, or_out, not_out, xor_out
);
// AND门原语
AND2 U1 (.O(and_out), .A(a), .B(b));
// OR门原语
OR2 U2 (.O(or_out), .A(a), .B(b));
// NOT门原语
INV U3 (.O(not_out), .I(a));
// XOR门原语
XOR2 U4 (.O(xor_out), .A(a), .B(b));
endmodule
-----------------------------------------------------
VHDL示例:
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity logic_gate_primitives is
Port (
a, b : in STD_LOGIC;
and_out, or_out, not_out, xor_out : out STD_LOGIC
);
end logic_gate_primitives;
architecture Behavioral of logic_gate_primitives is
-- 声明原语组件
component AND2
Port ( A : in STD_LOGIC;
B : in STD_LOGIC;
O : out STD_LOGIC);
end component;
component OR2
Port ( A : in STD_LOGIC;
B : in STD_LOGIC;
O : out STD_LOGIC);
end component;
component INV
Port ( I : in STD_LOGIC;
O : out STD_LOGIC);
end component;
component XOR2
Port ( A : in STD_LOGIC;
B : in STD_LOGIC;
O : out STD_LOGIC);
end component;
begin
-- 实例化原语
U1: AND2 port map (A => a, B => b, O => and_out);
U2: OR2 port map (A => a, B => b, O => or_out);
U3: INV port map (I => a, O => not_out);
U4: XOR2 port map (A => a, B => b, O => xor_out);
end Behavioral;
2. 触发器原语
触发器原语用于存储二进制数据,常见的有D触发器、JK触发器等。
Verilog示例:
verilog
module flip_flop_primitive (
input wire clk, rst_n, d,
output wire q
);
// 正边沿触发的D触发器,带异步复位(低电平有效)
FDCE
.INIT(1'b0) // 初始值为0
) U1 (
.Q(q), // 输出
.C(clk), // 时钟
.CE(1'b1), // 时钟使能(始终使能)
.CLR(rst_n),// 复位(低电平有效)
.D(d) // 数据输入
);
endmodule
3. IO缓冲器原语
IO缓冲器原语用于芯片内外的信号传输,常见的有`IBUF`(输入缓冲器)、`OBUF`(输出缓冲器)、`IOBUF`(双向缓冲器)。
Verilog示例:
verilog
module io_buffer_primitive (
inout wire io_pin, // 双向IO引脚
input wire direction, // 方向控制(1=输出,0=输入)
input wire data_out, // 输出数据
output wire data_in // 输入数据
);
// 双向IO缓冲器原语
IOBUF U1(
.O(data_in), // 输出数据到内部逻辑
.IO(io_pin), // 双向IO引脚
.I(data_out), // 输入数据从内部逻辑
.T(~direction) // 三态控制(低电平使能输出)
);
endmodule
4. 高速收发器原语
高速收发器原语用于高速串行通信。
Verilog示例:
module gtx_transceiver (
input wire tx_clk, rx_clk,
input wire [15:0] tx_data,
output wire [15:0] rx_data,
input wire reset,
output wire tx_out_clk, rx_out_clk
);
// 高速收发器原语(以Xilinx GTX为例)
GTXE2_CHANNEL
// 配置参数(简化)
.TX_LINE_RATE(10.3125), // 传输速率(Gbps)
.RX_LINE_RATE(10.3125), // 接收速率(Gbps)
.FAMILY("Kintex-7") // FPGA系列
) GTX_CHANNEL (
// 时钟接口
.GTREFCLK0(tx_clk),
.GTREFCLK1(rx_clk),
// 发送接口
.TXD(tx_data),
.TXOUTCLK(tx_out_clk),
// 接收接口
.RXD(rx_data),
.RXOUTCLK(rx_out_clk),
// 控制接口
.RESET(reset),
.PMA_RST_DONE(),
.INIT_DONE()
);
endmodule
原语使用注意事项
1. 厂商依赖性:原语是特定FPGA厂商定义的,不同厂商的原语名称和参数可能不同,因此代码的可移植性较差。
2. 参数配置:大多数原语都有参数可以配置,如触发器的初始值、IO缓冲器的驱动强度等,使用时需要根据需求进行设置。
3. 时序约束:使用原语时,需要额外添加时序约束,确保设计满足时序要求。
4. 优先使用HDL:在大多数情况下,建议优先使用HDL(Verilog或VHDL)描述逻辑,只有在需要精确控制硬件资源或优化性能时才使用原语。
原文始发于微信公众号(详谈FPGA开发):FPGA开发中如何使用原语
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论