赞
踩
D:\.lnk\ChineseTechnology\ChineseMedicine\相关文档\MT41K256M16-DDR3 SDRAM\MT41K256M16.pdf
-------------------------------------------------------------------
D:\.lnk\ChineseTechnology\ChineseMedicine\相关文档\MT41K256M16-DDR3 SDRAM\ug586_7Series_MIS.pdf
我接触到的DDR3 SDRAM的厂商是Micro(美光)旗下的MT41K256M16(TW-107)
Parameter:DDR3芯片举例:MT41K256M16-32Meg * 16 * 8banks;那么它的配置就是32Meg * 16 * 8banks,Refresh count为8K,Row address为32K(A[14:0]), Bank address为8(BA[2:0]), Column address为1K(A[9:0]), Page size为2KB;容量计算如下:
行数 * 列数 * 存储单元格位宽数 * bank数
(32*1024) * (1024) * 16 * 8 = 4096Mbits(512MBytes)
--------------------------------------------------
2^15 * 2^10 * 2^4 * 2^3(bit)
DDR3L Part Numbers:
DDR3L Part Numbers
比如:
MT41K512M8DA-107:P
MT41K
512M8 : Configuration is 512Meg * 8
DA : Package is 78-ball 8mm * 10.5mm FBGA (78代表引脚数量)
-107 : Speed Grade
Temperature
:p : Revision
256 Meg x 16 Functional Block Diagram:
Modules in example_design/sim Directory:
Name | Description |
---|---|
ddr2_model.v ddr3_model.v | These are the DDR2 and DDR3 SDRAM memory models. |
ddr2_model_parameters.vh ddr3_model_parameters.vh | These files contain the DDR2 and DDR3 SDRAM memory model parameter setting. |
sim.do | This is the ModelSim simulator script file. |
sim_tb_top.v/vhd | This is the simulation top file. |
7 Series FPGAs Memory Interface Solution:
【app_addr】: 信号线带 / 的是多位宽的
7 Series FPGAs Memory Interface Solution:这个解决方案可用是Xilinx中的IP核:Memory Interface Generator(MIG)
FPGA(可编程逻辑器件)内部的存储器和寄存器是两种不同类型的数字元素,用于不同的目的。下面是它们的主要区别:
总的来说,存储器用于存储大容量的数据,而寄存器用于存储小容量的临时数据。在FPGA中,存储器模块通常用于存储大规模数据,而寄存器被广泛用于存储状态、控制信号和计算中的中间结果。寄存器的高速访问使其成为执行计算和逻辑操作的关键组件。在FPGA设计中,工程师通常需要合理地分配和使用存储器和寄存器,以满足设计要求并优化性能。
SPARTAN-7 FPGAS
【SPARTAN-7】: 该系列不支持High-Speed Serial Transceivers
ARTIX-7 FPGAS
KINTEX-7 FPGAS
VIRTEX-7 FPGAS
【-】: 表示该V-7型号不支持
Zynq-7000 and Zynq-7000S SoCs
【高速串行收发器】: Zynq-7000中对应的为GTX、GTP
Kintex® UltraScale™ FPGAs
【System Monitor】: 系统监视器,即XADC
Virtex® UltraScale™ FPGAs
D:\.lnk\ChineseTechnology\ChineseMedicine\相关文档\FPGA官方文档\FPGA资源文档\ug473_7Series_Memory_Resources.pdf
我将先分别阐述BRAM和DRAM的特点,再就两者的区别进行叙述。
BRAM:Xilinx7系列的Block RAM可以存储最多36Kbits的数据,可以被配置成1个36Kb或2个独立的18Kb的RAM;可以对BRAM进行读和写的操作。输出有读或写期间读两种方式,其中写期间读有三种模式:WRIST_FIRST、READ_FIRST以及NO_CHANGE。
DRAM:当BRAM不够用时可以用CLB单元中SLICEMs中的LUT生成分布式RAM资源,SLICEM中的多个LUT可以以多种方式进行结合从而存储更多的数据。分布式RAM可以用来配置成单端口、简单双端口、真正双端口以及四端口RAM
两者的区别:
LUT(查找表)在计算机科学和数字电路设计中是一个常见的概念,特别是在可编程逻辑器件(FPGA)和数字信号处理(DSP)中经常使用。
LUT 是一个数据结构,用于存储预先计算好的数值或函数值,以便在需要时快速查找。LUT 的主要作用是将输入值映射到相应的输出值。以下是 LUT 的一些常见用途:
在 FPGA 中,LUT 是实现数字逻辑的关键资源。FPGA 中的 LUT 具有可编程的功能,可以根据设计的需要配置成不同的逻辑功能。通常,多个 LUT 可以组合在一起,以实现复杂的数字逻辑功能。
总之,LUT 是一个通用的概念,它在多个领域都有广泛的应用,用于存储和查找预计算的数值或函数值。
D:\.lnk\ChineseTechnology\ChineseMedicine\相关文档\FPGA官方文档\FPGA资源文档\ug471_7Series_SelectIO.pdf
SelectIO资源包括I/O bank、HP bank中涉及到的DCI技术、高速串行收发器、IO原语以及I/O逻辑资源等;
I/O bank分为HP(High-Performance) bank和HR(High-Range) bank两种类型:
HP bank满足高速存储器和芯片到芯片端口的性能要求,最高电压达1.8V;
HR bank支持更广泛的I/O标准,最高电压达3.3V;
每个bank由50个管脚组成(24对差分和两个单端的,其中有两对SRCC和两对MRCC),芯片bank的数量由芯片的大小决定;
HP bank中可用的DCI技术:
将输入给FPGA的差分信号转换成单端信号,其中有后缀B的是N channel pin;其区别为IBUFDS应用于差分输入为数据时,而IBUFGDS应用于差分输入为时钟的情况;(FPGA是否接阻抗匹配由原语中的参数DIFF_TERM决定)
IBUFDS #(
.DIFF_TERM("FALSE"), // Differential Termination
.IBUF_LOW_PWR("TRUE"), // Low power="TRUE", Highest performance="FALSE"
.IOSTANDARD("DEFAULT") // Specify the input I/O standard
) IBUFDS_inst (
.O(O), // Buffer output
.I(I), // Diff_p buffer input (connect directly to top-level port)
.IB(IB) // Diff_n buffer input (connect directly to top-level port)
);
将单端信号转换成差分信号;
Low Voltage CMOS
HR | HP |
---|---|
Available | Available |
LVCMOS is a widely used switching standard implemented in CMOS transistors. This standard is defined by JEDEC (JESD 8C.01). The LVCMOS standards supported in 7 series FPGAs are: LVCMOS12, LVCMOS15, LVCMOS18, LVCMOS25, and LVCMOS33.
【LVCMOS25, LVCMOS33】: 2.5V,3.3V的参考电压标准
Low Voltage Differential Signaling
HR | HP |
---|---|
Available for LVDS_25 only | Available for LVDS only |
Low-voltage differential signaling (LVDS) is a powerful high-speed interface in many
system applications. 7 series FPGA I/Os are designed to comply with the EIA/TIA electrical specifications for LVDS to make system and board design easier.
【comply】: [kəm’plaɪ] v.遵从;服从;顺从
【SSTL】: Stub-Series Terminated Logic
【DDR3】: DDR3引脚绑定使用的就是该参考电平标准
SSTL15 is used for DDR3 SDRAM memory interfaces.
【TMDS】: Transition Minimized Differential Signaling
HR | HP |
---|---|
Available | N/A |
TMDS is a differential I/O standard for transmitting high-speed serial data used by the
DVI and HDMI video interfaces.
【HSTL】: High-Speed Transceiver Logic
The high-speed transceiver logic (HSTL) standard is a general purpose high-speed bus standard is defined by JEDEC (JESD8-6).
【LVTTL】: Low Voltage TTL
HR | HP |
---|---|
Available | N/A |
LVTTL is a general-purpose EIA/JESD standard for 3.3V applications that uses a single-ended CMOS input buffer and a push-pull output buffer.
D:\.lnk\ChineseTechnology\ChineseMedicine\相关文档\FPGA官方文档\FPGA资源文档\ug471_7Series_SelectIO.pdf
如果输入给FPGA的数据流是DDR格式,那么可用调用IDDR Primitive进行解析接收,其中有三种操作模式:OPPOSITE_EDGE mode(反沿模式)、SAME_EDGE mode(同沿模式)、SAME_EDGE_PIPELINED mode(同沿流水线模式),根据设计进行选择;
IDDR #(
.DDR_CLK_EDGE("OPPOSITE_EDGE"), // "OPPOSITE_EDGE", "SAME_EDGE"
// or "SAME_EDGE_PIPELINED"
.INIT_Q1(1'b0), // Initial value of Q1: 1'b0 or 1'b1
.INIT_Q2(1'b0), // Initial value of Q2: 1'b0 or 1'b1
.SRTYPE("SYNC") // Set/Reset type: "SYNC" or "ASYNC"
) IDDR_inst (
.Q1(Q1), // 1-bit output for positive edge of clock
.Q2(Q2), // 1-bit output for negative edge of clock
.C(C), // 1-bit clock input
.CE(CE), // 1-bit clock enable input
.D(D), // 1-bit DDR data input
.R(R), // 1-bit reset
.S(S) // 1-bit set
);
【S/R】: The IDDR primitive contains both set and reset pins. However only one can be used per IDDR. As a result, S/R is described instead of separate set and reset pins.
Every I/O block contains a programmable delay primitive called IDELAY, IDELAY is a 31-tap.
IDELAYE2 #(
.CINVCTRL_SEL("FALSE"), // Enable dynamic clock inversion (FALSE, TRUE)
.DELAY_SRC("IDATAIN"), // Delay input (IDATAIN, DATAIN)
.HIGH_PERFORMANCE_MODE("FALSE"), // Reduced jitter ("TRUE"), Reduced power ("FALSE")
.IDELAY_TYPE("FIXED"), // FIXED, VARIABLE, VAR_LOAD, VAR_LOAD_PIPE
.IDELAY_VALUE(0), // Input delay tap setting (0-31)
.PIPE_SEL("FALSE"), // Select pipelined mode, FALSE, TRUE
.REFCLK_FREQUENCY(200.0), // IDELAYCTRL clock input frequency in MHz (190.0-210.0, 290.0-310.0).
.SIGNAL_PATTERN("DATA") // DATA, CLOCK input signal
)
IDELAYE2_inst (
.CNTVALUEOUT(CNTVALUEOUT), // 5-bit output: Counter value output
.DATAOUT(DATAOUT), // 1-bit output: Delayed data output
.C(C), // 1-bit input: Clock input
.CE(CE), // 1-bit input: Active high enable increment/decrement input
.CINVCTRL(CINVCTRL), // 1-bit input: Dynamic clock inversion input
.CNTVALUEIN(CNTVALUEIN), // 5-bit input: Counter value input
.DATAIN(DATAIN), // 1-bit input: Internal delay data input
.IDATAIN(IDATAIN), // 1-bit input: Data input from the I/O
.INC(INC), // 1-bit input: Increment / Decrement tap delay input
.LD(LD), // 1-bit input: Load IDELAY_VALUE input
.LDPIPEEN(LDPIPEEN), // 1-bit input: Enable PIPELINE register to load data input
.REGRST(REGRST) // 1-bit input: Active-high reset tap-delay input
);
Port Name | Direction | Width | Function |
---|---|---|---|
C | Input | 1 | Clock input used in VARIABLE, VAR_LOAD, or VAR_LOAD_PIPE mode. |
REGRST | Input | 1 | Reset for the pipeline register. Only used in VAR_LOAD_PIPE mode. |
LD | Input | 1 | Loads the IDELAY primitive to the pre-programmed value in VARIABLE mode. In VAR_LOAD mode, it loads the value of CNTVALUEIN.In VAR_LOAD_PIPE mode it loads the value currently in the pipeline register. |
CE | Input | 1 | Enable increment/decrement function |
CNTVALUEIN | Input | 5 | Counter value from FPGA logic for dynamically loadable tap value. |
IDATAIN | Input | 1 | Data input for IDELAY from the IBUF. |
DATAIN | Input | 1 | Data input for IDELAY from the FPGA logic. |
DATAOUT | Output | 1 | Delayed data from one of two data input ports (IDATAIN or DATAIN). |
CNTVALUEOUT | Output | 5 | Counter value going to FPGA logic for monitoring tap value. |
Attribute | Value | Default Value | Description |
---|---|---|---|
IDELAY_TYPE | String: FIXED, VARIABLE, VAR_LOAD, or VAR_LOAD_PIPE | FIXED | Sets the type of tap delay line. FIXED delay sets a static delay value.VAR_LOAD dynamically loads tap values. VARIABLE delay dynamically adjusts the delay value.VAR_LOAD_PIPE is similar to VAR_LOAD mode with the ability to store the CNTVALUEIN value ready for a future update. |
IDELAY_VALUE | Integer: 0 to 31 | 0 | Specifies the fixed number of delay taps in fixed mode or the initial starting number of taps in VARIABLE mode (input path). When IDELAY_TYPE is set to VAR_LOAD, or VAR_LOAD_PIPE mode, this value is ignored and assumed to be zero. |
【IDELAY_VALUE】: 挡位计算公式:1个参考CLK周期T / 2/ 32(挡);单位为ps;比如默认2000MHz,每挡间隔约等于78.125ps,其中0挡也有延时600ps。
Figure 2-12 shows an IDELAY (IDELAY_TYPE = VARIABLE, IDELAY_VALUE = 0,and DELAY_SRC = IDATAIN) timing diagram.
Figure 2-13 shows an IDELAY timing diagram in VAR_LOAD mode.
四种工作模式:
IDELAYCTRL: If the IDELAYE2 or ODELAYE2 primitives are instantiated, the IDELAYCTRL module must also be instantiated.
(* IODELAY_GROUP = <iodelay_group_name> *) // Specifies group name for associated IDELAYs/ODELAYs and IDELAYCTRL
IDELAYCTRL IDELAYCTRL_inst (
.RDY(RDY), // 1-bit output: Ready output
.REFCLK(REFCLK), // 1-bit input: Reference clock input
.RST(RST) // 1-bit input: Active high reset input
);
Ports | Description |
---|---|
RST - Reset | The reset input pin (RST) is an active-High asynchronous reset |
REFCLK - Reference Clock | REFCLK can be supplied directly from a user-supplied source or the MMCM and must be routed on a global clock buffer. |
RDY - Ready | The ready (RDY) signal indicates when the IDELAY and ODELAY modules in the specific region are calibrated. |
如果需要将输出按照DDR数据流格式,可用调用ODDR Primitive进行转换输出,其中有两种操作模式:OPPOSITE_EDGE mode(反沿模式)、SAME_EDGE mode(同沿模式),根据设计进行选择;
【ODDR】: 两种操作模式一样,最终的OQ输出,在CLK作用下,上升沿处理的是D2信号,下降沿处理的是D1信号,其潜伏周期均为1。
D:\.lnk\ChineseTechnology\ChineseMedicine\相关文档\FPGA官方文档\FPGA资源文档\ug472_7Series_Clocking.pdf
时钟体系架构概述:
CMT:
7 Series FPGA High-Level Clock Architecture View:
垂直时钟中心(the clock backbone)将芯片划分成相邻的左右两区域,水平中心(the horizontal center)将芯片划分成上下两部分。
每个时钟区域包含每列50个CLB,每列10个36Kb的Block RAM(除非5个36Kb的BRAM被PCIE替换),每列20个DSP Slices和12个BUFH,一个CMT(PLL、MMCM),一组50个I/O,一个由4个串行收发器组成的GTquad(GTX)以及半列PCIE位于Block RAM列中
PCIE:高速接口,可以用IP核调用,但FPGA被CLB充满,所以会替换一部分。
Basic View of Clock Region:
全局时钟缓冲器可以通过HROW驱动每一个时钟域,BUFG和BUFH共享HROW的布线轨道。BUFIO和区域时钟缓冲器(BUFR)都位于I/O bank中,BUFIO只能驱动I/O时钟资源,然而BUFR可以驱动除I/O资源外的时钟域逻辑资源。BUFMR可以驱动多个时钟域;
Single Clock Region (Right Side of the Device):
SRCC通过BUFR驱动单区域;MRCC通过BUFMR驱动多区域(垂直方向上最多3个相邻的时钟域)
BUFG/BUFH/CMT Clock Region Detail:
可通过BUFG到全局:
信号线 | 驱动时钟 |
---|---|
绿色 | BUFR |
红色 | CC引脚 |
黑色 | BUFH(12个) |
橙色 | GT时钟 |
BUFR/BUFMR/BUFIO Clock Region Detail:
绿色:BUFR(单区域) <——SRCC
红色:BUFMR(多区域)<——MRCC
黄色:BUFIO(仅在I/O bank中)
Summary of Clock Connectivity:
模板:英文全称+中文全称+简称+作用范围+作用
Clocking Function or Pin | Directly Driven By | Used to Directly Drive |
---|---|---|
Multi-region clock-capable I/O (MRCC) There are two pin/pairs in each bank. | External Clock | MRCCs that are located in the ame clock region and on the same left/right side of the device drive: • Four BUFIOs • Four BUFRs • Two BUFMRs • One CMT (one MMCM and one PLL) • CMTs above and below (using limited CMT backbone resources). MRCCs within the same half top/bottom drive: • 16 BUFGs MRCCs within the same horizontally adjacent clock regions • BUFHs |
Single-region clock-capable I/O (SRCC) There are two pin/pairs in each bank. | External Clock | SRCCs that are located in the same clock regionand on the same left/right side of the device drive: • Four BUFIOs • Four BUFRs • One CMT (one MMCM and one PLL) • CMTs above and below (using limited CMT backbone resources). SRCCs within the same half top/bottom drive: • 16 BUFGs SRCCs within the same horizontally adjacent clock region drive: • BUFHs |
BUFIO | Within the same clock region, BUFIOs are driven by: • MRCCs (dedicated 1:1) • SRCCs (dedicated 1:1) • MMCM.CLKOUT0– MMCM.CLKOUT3 • CLKFBOUT • BUFMRs in the same clock region and clock regions below and above | When used within the same clock region, BUFIOs drive: • ILOGIC.clk • ILOGIC.clkb • OLOGIC.clk • OLOGIC.clkb • OLOGIC.oclk • OLOGIC.oclkb |
BUFR | Within the same clock region, BUFRs are driven by: • MRCC • SRCC • MMCM.CLKOUT0- MMCM.CLKOUT3 • CLKFBOUT • BUFMR from the clock region above and below • General interconnect | When used within the same clock region, BUFRs drive: • CMT • Any clocking point in the same clock region the BUFG can drive; When used within the same half top/bottom, BUFRs drive: • 16 BUFGs (not recommended) |
BUFMR | Within the same clock region, BUFMRs are driven by: • MRCCs (dedicated 1:1) • GT clock outputs listed in this table (see GT Transceiver Clocks) • Interconnect (not recommended) | When used within the same clock region and the clock regions above and below, BUFMRs drive: • BUFIOs • BUFRs |
BUFG | Within the same top/bottom half,BUFGs are driven by: • SRCCs • MRCCs • CMTs • GT clock outputs listed in this table (see GT Transceiver Clocks) • BUFRs (not recommended) • Interconnect (not recommended) • Adjacent BUFG in the same top/bottom half | • CMT • GT clock outputs listed in this table(see GT Transceiver Clocks:) • Adjacent BUFGs in same top/bottom half • Any clocking point in the fabric and I/O • CLB control signals • BUFH |
BUFH | Within the same clock region and the horizontally adjacent clock region, BUFHs are driven by: • SRCC • MRCC • CMT • BUFG • GT clock outputs listed in this table (see GT Transceiver Clocks) • Interconnect(not recommended) | When used within the same clock region, BUFHs drive: • CMT • GT clock outputs listed in this table(see GT Transceiver Clocks:) • Any clocking point in the same clock region the BUFG can drive |
CMT | • BUFG • SRCC (same and adjacent clock regions) • MRCC (same and adjacent clock regions) • GTs in the same clock region • A BUFR within the same clock region, and the clock region above or below using a BUFMR • MMCM/PLL.CLKOUT0-3 | • Any BUFG in same top/bottom half When used within the same clock region, CMTs can drive: • BUFIO (MMCM) • BUFR (MMCM) • BUFH and BUFH in the horizontally adjacent clock region • MMCM/PLL (with phase offset if not adjacent) |
7系列CLB (Configurable Logic Block)提供先进、高性能的FPGA逻辑;
CLB的特性如下:
CLB的组成:芯片容量通常由逻辑单元进行衡量,一个逻辑单元相当于一个4输入LUT和一个触发器。7系列的CLB包含6输入LUT、丰富的触发器(锁存器)、进位逻辑以及通过SLICEM实现分布式RAM和移位寄存器的功能,增加有效的容量。其中一个6输入LUT相等于1.6个逻辑单元(Logic Cells),比如XC7K160T:160 * 1K ≈ 101,400 * 1.6;
使用CLB资源需要注意的事宜:
【流水线】: 流水线是一个能够并行执行程序指令的过程
CLB中SLICES的组成:CLBs是实现组合与时序电路的重要逻辑资源,一个CLB单元包含一对Slices,整个芯片大约有三分之二的slices为SLICEL,三分之一的SLICEM,其中SLICEM可用LUT配置成64位的分布式RAM或32位的移位寄存器(或两个16位的移位寄存器);(每个7系列的slice包含4个LUT、3个选择器、1个进位链(进位逻辑)、8个触发器,即存储单元)。
SLICEM和SLICEL的区别:
SLICE中Look-Up Table(LUT)查找表 :
A six-input function uses:
Two five-input or less functions use:
SLICE中的存储单元:
每个SLICE中有8个存储单元,其中4个既可用配置成边沿触发的D触发器,也可以配置成电平敏感的锁存器;
SLICEM-分布式RAM:
以下所述只能在SLLICEM中实现;SLICEM中的LUT可用用来实现同步RAM,也就是分布式RAM单元,SLICEM中的多个LUT可以以多种方式结合起来从而存储更多的数据量。这些RAM单元可以被配置成不同的形式;
SLICEM-移位寄存器:
SLCIEM中的LUT也可以配置成32位的移位寄存器,在这种方式下,每个LUT可以可以实现延时串行数据1-32个周期不等,也可以将SLICEM中的4个LUT级联起来从而实现最高达128个周期延迟;
D:\.lnk\ChineseTechnology\ChineseMedicine\相关文档\FPGA官方文档\FPGA资源文档\ug479_7Series_DSP48E1.pdf
DSP48E1概述:
所有的7系列FPGAs都有许多专用,全自定义以及低功耗的DSP slices,结合高速、小容量同时保持系统设计中的弹性;DSP slices可以提高速度和性能如宽动态总线移位、存储地址生成器、宽总线多路复用器以及存储映射的IO寄存器;
【48】: 48-Bit Accumulator/Logic Unit, 或者说输出P位宽为48位,E1代表第一个版本。
为什么A的位宽是30,而A与D经过预加器后传递给乘法器的数值位宽是25?
30-bit A input of which the lower 25 bits feed the A input of the multiplier, and the entire 30-bit input forms the upper 30 bits of the 48-bit A:B concatenate internal bus.
Pattern detector
• Overflow/underflow support
• Convergent rounding support
• Terminal count detection support and auto resetting
DSP48E1 Slice原语:
Name | Direction | Bit Width | Description |
---|---|---|---|
A | In | 30 | A[24:0] is the A input of the multiplier or the pre-adder. |
B | In | 18 | The B input of the multiplier. |
C | In | 48 | Data input to the second-stage adder/subtracter, pattern detector, or logic function. |
D | In | 25 | 25-bit data input to the pre-adder or alternative input to the multiplier. |
ALUMODE | In | 4 | Controls the selection of the logic function in the DSP48E1 slice |
INMODE | In | 5 | These five control bits select the functionality of the pre-adder, the A,B, and D inputs, and the input registers. These bits should default to 5’b00000 if left unconnected. |
OPMODE | In | 7 | Controls the input to the X, Y, and Z multiplexers in the DSP48E1 slice |
P | Out | 48 | Data output from second stage adder/subtracter or logic function. |
【ALU】: 算术逻辑单元
三态门是一种逻辑门,它的输出有三种状态:高电平、低电平和高阻态。高阻态相当于断开状态,不影响其他电路的工作。三态门有一个使能端,用于控制输出的状态。三态门的作用是实现总线结构和双向数据传输
SLICEM和SLICEL:
① 它们都包括LUT、Storage Element(Flip-Flop)以及Carry Logic和Multiplexers
② Slices中三分之二为SLICEL,剩余的为SLICEM
③ 其中只有SLICEM可以用来作为分布式RAM和移位寄存器,而SLICEL不行
④ 两者的LUT组成不同,SLICEL的LUT输入可以是6位或5位输入,而SLICEM除了6位输入,还有W、CK等
SPI (Serial Peripheral Interface) 和 QSPI (Quad Serial Peripheral Interface) 都是串行通信协议,主要用于微控制器和其外围设备之间的通信。
SPI 是一种全双工的,同步的串行通信接口。常用于存储器设备、数字信号处理器和感应器等设备之间的连接。通常由四根线组成:主设备输出辅设备输入(MOIS),主设备输入辅设备输出(MISO),系统时钟(SCK),从设备选择(SS)。
QSPI 是一种更高速的 SPI 变种,也称为四线 SPI。其能在每个时钟周期中传输四倍的数据,因此,传输率为 SPI 的四倍。它使用四个数据线(D0-D3)代替 SPI 的单输入/单输出线,因此可以同时发送/接收四个位数据,提高了通信速率。QSPI 具有 SPI 的所有优点,如简单的硬件接口和全双工操作,同时还提供了更高的数据吞吐量。
在市场上,这两种接口技术都被广泛使用,可以在许多微控制器和外围设备中找到,例如:闪存、无线模块、AD/DAC转换器、实时时钟等。这两种技术各有各的优点,你选择哪种,需要根据通信速度、接口复杂性、硬件成本和软件支持等 factors 而定。
LVDS的推荐最高数据传输速率是655Mbps,而理论上可以达到1.923Gbps。
Low Voltage Differential Signal(LVDS),低压差分信号
Bank数 * 存储单元格数(1个bank) * 存储单元格中的存储位宽;
如MT41K256M16:8 * 32Meg * 16 = 4096Mbit (512Mbyte or 4Gbti)
运放的两个特性即如下背后的本质:
“虚断”背后的本质是理想运放的输入阻抗无穷大;
“虚短”背后的本质是当给运放引入负反馈时,Un = Up;
反相比例运算电路:
1 输入Ui与输出Uo电压关系由虚短 虚断可知:
2 R2应满足:
3 R10:反馈电阻
4 反馈组态为:电压并联负反馈
同相比例运算电路:
注意:上述中I1 = (Uout - Un) / R1
https://blog.csdn.net/yifantan/article/details/126757978?ops_request_misc=&request_id=&biz_id=102&utm_term=FPGADDS&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-8-126757978.142^v96^pc_search_result_base8&spm=1018.2226.3001.4187
1 DDS基本原理
DDS(Direct Digital Synthesizer)即直接数字合成器,是一种新型的频率合成技术,具有相对带宽大,频率转换时间短、分辨率高和相位连续性好等优点。较容易实现频率、相位以及幅度的数控调制,广泛应用于通信领域。
DDS 的基本结构主要由相位累加器、相位调制器、波形数据表 ROM、D/A转换器等四大结构组成,其中较多设计还会在数模转换器之后增加一个低通滤波器。DDS 结构示意图见下图
先对其中各参数做一下说明。系统时钟 CLK 为整个系统的工作时钟,频率为 f_CLK;频率字输入 F_WORD,一般为整数,数值大小控制输出信号的频率大小,数值越大输出信号频率越高,反之,输出信号频率越低;相位字输入P_WORD,为整数,数值大小控制输出信号的相位偏移,主要用于相位的信号调制;设输出信号为 CLK_OUT,频率为 f_OUT。
相位累加器位数为N位,N的取值范围实际应用中一般为24~32),相当于把正弦信号在相位上的精度定义为N位。
1.1 频率控制
fOUT = Fword * (Fclk / 2^N) (其中Fclk / 2^N代表频率分辨率或频率精度)
关于这个公式该如何理解,我们通过下面的例子来掌握。
下图为一个完整周期的正弦信号的波形,总共有33个采样点,其中第1点和第33点的值相同,第33点为下一个周期的起始点,因此,实际一个周期为32个采样点(1~32)。
现在有以下几种输出情况:
<1>当使用FPGA控制DAC输出一个周期的正弦信号时,每1ms输出一个数值。如果每个点都输出,则总共输出这一个完整的周期信号需要输出32点,因此输出一个完整的信号需要32ms,可知输出信号的频率为1000/32 Hz。这里Fclk = 1000Hz(周期是1ms),Fo = 1000/32 (2^N N=5)
<2>如果需要用这一组数据来输出一个2 *(1000/32)Hz的正弦信号,因为输出信号频率为2 *(1000/32)Hz,那么输出一个完整的周期的正弦波所需要的时间为32/2,即16ms。因为FPGA控制DAC输出信号的频率固定为1ms,所以我们选择隔点输出,输出(1、3、5、7……29、31)这些点,因为采用这些点,我们还是能够组成一个完整的周期的正弦信号,而输出时间缩短为一半,即频率提高了一倍。这里Fclk = 1000Hz(周期是1ms),Fo =2*1000/32 (2^N N=5),F_WORD=2。
1.2 相位控制
对于相位的调整,则更加简单。只需要在每个取样点的序号上加上一个偏移量,便可实现相位的控制。例如,上面默认的是第1ms时输出第一个点的数据,假如我们现在在第1ms时从第9个点开始输出,则将相位左移了90度,这就是控制相位的原理。
实现DDS输出时,将横坐标上的数据作为ROM的地址,纵坐标上的数据作为ROM的输出,那么指定不同的地址就可实现对应值的输出。而我们DDS输出控制频率和相位,归结到底就是控制ROM的地址。
2 模块功能设计
在本设计中参考时钟F_clk频率为50 MHz,相位累加器位数取32位,相位Fixed默认,输出16位。由于我们输出sin和cos,所以信号输出32位,其中高16位表示sin, 低16位表示cos。
source:D:\.lnk\ChineseTechnology\ChineseMedicine\相关文档\MAXⅡ-EPM240T100C5\简易版dds原理图.pdf
**需求:**通过控制FPGA的8根信号线得到可调节的正弦波的频率输出。(根据DDS工作原理,手写DDS核,因为该芯片不支持NCO(Numerically Controlled Oscillator, Signal Generation, 数控振荡器,Vivado中对应的是DDS核)频率生成核甚至一些基础的ROM核)
**介绍:**该工程使用的是Altera厂商,MAXⅡ系列下的EPM240芯片,该工程提供的晶振频率为75MHz,它里面的逻辑资源是非常少的,需要通过它的硬件架构输出一个可调的正弦波,硬件特征是里面有一个同相比例运算放大电路,该运放的放大倍数可通过T型电阻网络进行调整,该T型电阻网络通过8个引脚与FPGA进行连接,也就是说我们FPGA通过对这8根线不同的高低电平配置,总共有256(2^8)种可能,故同相比例运算放大电路会有256种高低不同的输出电平,该电平会有台阶,并不平滑,所以需要经过LF滤波器,然后再经过N端可调电阻的反相比例运算放大电路将其输出
module DDS
(
input wire clk_50MHz, //系统时钟
input wire [7:0] freq_constant, //频率控制字
input wire [7:0] init_phase, //相位控制字
output wire [7:0] FOUT //输出信号
);
//频率控制字的同步寄存器,大于1的时候,后面相位累加器输出到实时相位时要砍掉
reg [7:0] freq_constant_r = 8'd0;
always@(posedge clk_50MHz)
begin
freq_constant_r <= freq_constant;
end
//相位累加寄存器变量(f*t)
reg [15:0] phase_acc_register = 16'd0;
always@(posedge clk_50MHz)
begin
phase_acc_register <= phase_acc_register + freq_constant_r;
end
//初始的相位寄存
reg [7:0] init_phase_r;
always@(posedge clk_50MHz)
begin
init_phase_r <= init_phase;
end
//实时的相位数值
//设置正弦波为128个点 存储器容量是128 频率控制字为1
reg [7:0] phase_now = 8'd0;
always@(posedge clk_50MHz)
begin
//phase_now <= phase_acc_register[15:8] + init_phase_r; //这里设置初始相位偏移数值
phase_now <= phase_acc_register[15:8] + init_phase_r; //这里设置初始相位偏移数值为0
end
wire [7:0] ROM_8_256 [0:255];
assign ROM_8_256[0] = 8'd128;
assign ROM_8_256[1] = 8'd131;
assign ROM_8_256[2] = 8'd134;
assign ROM_8_256[3] = 8'd137;
assign ROM_8_256[4] = 8'd140;
assign ROM_8_256[5] = 8'd144;
assign ROM_8_256[6] = 8'd147;
assign ROM_8_256[7] = 8'd150;
assign ROM_8_256[8] = 8'd153;
assign ROM_8_256[9] = 8'd156;
assign ROM_8_256[10] = 8'd159;
assign ROM_8_256[11] = 8'd162;
assign ROM_8_256[12] = 8'd165;
assign ROM_8_256[13] = 8'd168;
assign ROM_8_256[14] = 8'd171;
assign ROM_8_256[15] = 8'd174;
assign ROM_8_256[16] = 8'd177;
assign ROM_8_256[17] = 8'd179;
assign ROM_8_256[18] = 8'd182;
assign ROM_8_256[19] = 8'd185;
assign ROM_8_256[20] = 8'd188;
assign ROM_8_256[21] = 8'd191;
assign ROM_8_256[22] = 8'd193;
assign ROM_8_256[23] = 8'd196;
assign ROM_8_256[24] = 8'd199;
assign ROM_8_256[25] = 8'd201;
assign ROM_8_256[26] = 8'd204;
assign ROM_8_256[27] = 8'd206;
assign ROM_8_256[28] = 8'd209;
assign ROM_8_256[29] = 8'd211;
assign ROM_8_256[30] = 8'd213;
assign ROM_8_256[31] = 8'd216;
assign ROM_8_256[32] = 8'd218;
assign ROM_8_256[33] = 8'd220;
assign ROM_8_256[34] = 8'd222;
assign ROM_8_256[35] = 8'd224;
assign ROM_8_256[36] = 8'd226;
assign ROM_8_256[37] = 8'd228;
assign ROM_8_256[38] = 8'd230;
assign ROM_8_256[39] = 8'd232;
assign ROM_8_256[40] = 8'd234;
assign ROM_8_256[41] = 8'd235;
assign ROM_8_256[42] = 8'd237;
assign ROM_8_256[43] = 8'd239;
assign ROM_8_256[44] = 8'd240;
assign ROM_8_256[45] = 8'd241;
assign ROM_8_256[46] = 8'd243;
assign ROM_8_256[47] = 8'd244;
assign ROM_8_256[48] = 8'd245;
assign ROM_8_256[49] = 8'd246;
assign ROM_8_256[50] = 8'd248;
assign ROM_8_256[51] = 8'd249;
assign ROM_8_256[52] = 8'd250;
assign ROM_8_256[53] = 8'd250;
assign ROM_8_256[54] = 8'd251;
assign ROM_8_256[55] = 8'd252;
assign ROM_8_256[56] = 8'd253;
assign ROM_8_256[57] = 8'd253;
assign ROM_8_256[58] = 8'd254;
assign ROM_8_256[59] = 8'd254;
assign ROM_8_256[60] = 8'd254;
assign ROM_8_256[61] = 8'd255;
assign ROM_8_256[62] = 8'd255;
assign ROM_8_256[63] = 8'd255;
assign ROM_8_256[64] = 8'd255;
assign ROM_8_256[65] = 8'd255;
assign ROM_8_256[66] = 8'd255;
assign ROM_8_256[67] = 8'd255;
assign ROM_8_256[68] = 8'd254;
assign ROM_8_256[69] = 8'd254;
assign ROM_8_256[70] = 8'd254;
assign ROM_8_256[71] = 8'd253;
assign ROM_8_256[72] = 8'd253;
assign ROM_8_256[73] = 8'd252;
assign ROM_8_256[74] = 8'd251;
assign ROM_8_256[75] = 8'd250;
assign ROM_8_256[76] = 8'd250;
assign ROM_8_256[77] = 8'd249;
assign ROM_8_256[78] = 8'd248;
assign ROM_8_256[79] = 8'd246;
assign ROM_8_256[80] = 8'd245;
assign ROM_8_256[81] = 8'd244;
assign ROM_8_256[82] = 8'd243;
assign ROM_8_256[83] = 8'd241;
assign ROM_8_256[84] = 8'd240;
assign ROM_8_256[85] = 8'd239;
assign ROM_8_256[86] = 8'd237;
assign ROM_8_256[87] = 8'd235;
assign ROM_8_256[88] = 8'd234;
assign ROM_8_256[89] = 8'd232;
assign ROM_8_256[90] = 8'd230;
assign ROM_8_256[91] = 8'd228;
assign ROM_8_256[92] = 8'd226;
assign ROM_8_256[93] = 8'd224;
assign ROM_8_256[94] = 8'd222;
assign ROM_8_256[95] = 8'd220;
assign ROM_8_256[96] = 8'd218;
assign ROM_8_256[97] = 8'd216;
assign ROM_8_256[98] = 8'd213;
assign ROM_8_256[99] = 8'd211;
assign ROM_8_256[100] = 8'd209;
assign ROM_8_256[101] = 8'd206;
assign ROM_8_256[102] = 8'd204;
assign ROM_8_256[103] = 8'd201;
assign ROM_8_256[104] = 8'd199;
assign ROM_8_256[105] = 8'd196;
assign ROM_8_256[106] = 8'd193;
assign ROM_8_256[107] = 8'd191;
assign ROM_8_256[108] = 8'd188;
assign ROM_8_256[109] = 8'd185;
assign ROM_8_256[110] = 8'd182;
assign ROM_8_256[111] = 8'd179;
assign ROM_8_256[112] = 8'd177;
assign ROM_8_256[113] = 8'd174;
assign ROM_8_256[114] = 8'd171;
assign ROM_8_256[115] = 8'd168;
assign ROM_8_256[116] = 8'd165;
assign ROM_8_256[117] = 8'd162;
assign ROM_8_256[118] = 8'd159;
assign ROM_8_256[119] = 8'd156;
assign ROM_8_256[120] = 8'd153;
assign ROM_8_256[121] = 8'd150;
assign ROM_8_256[122] = 8'd147;
assign ROM_8_256[123] = 8'd144;
assign ROM_8_256[124] = 8'd140;
assign ROM_8_256[125] = 8'd137;
assign ROM_8_256[126] = 8'd134;
assign ROM_8_256[127] = 8'd131;
assign ROM_8_256[128] = 8'd128;
assign ROM_8_256[129] = 8'd125;
assign ROM_8_256[130] = 8'd122;
assign ROM_8_256[131] = 8'd119;
assign ROM_8_256[132] = 8'd116;
assign ROM_8_256[133] = 8'd112;
assign ROM_8_256[134] = 8'd109;
assign ROM_8_256[135] = 8'd106;
assign ROM_8_256[136] = 8'd103;
assign ROM_8_256[137] = 8'd100;
assign ROM_8_256[138] = 8'd97 ;
assign ROM_8_256[139] = 8'd94 ;
assign ROM_8_256[140] = 8'd91 ;
assign ROM_8_256[141] = 8'd88 ;
assign ROM_8_256[142] = 8'd85 ;
assign ROM_8_256[143] = 8'd82 ;
assign ROM_8_256[144] = 8'd79 ;
assign ROM_8_256[145] = 8'd77 ;
assign ROM_8_256[146] = 8'd74 ;
assign ROM_8_256[147] = 8'd71 ;
assign ROM_8_256[148] = 8'd68 ;
assign ROM_8_256[149] = 8'd65 ;
assign ROM_8_256[150] = 8'd63 ;
assign ROM_8_256[151] = 8'd60 ;
assign ROM_8_256[152] = 8'd57 ;
assign ROM_8_256[153] = 8'd55 ;
assign ROM_8_256[154] = 8'd52 ;
assign ROM_8_256[155] = 8'd50 ;
assign ROM_8_256[156] = 8'd47 ;
assign ROM_8_256[157] = 8'd45 ;
assign ROM_8_256[158] = 8'd43 ;
assign ROM_8_256[159] = 8'd40 ;
assign ROM_8_256[160] = 8'd38 ;
assign ROM_8_256[161] = 8'd36 ;
assign ROM_8_256[162] = 8'd34 ;
assign ROM_8_256[163] = 8'd32 ;
assign ROM_8_256[164] = 8'd30 ;
assign ROM_8_256[165] = 8'd28 ;
assign ROM_8_256[166] = 8'd26 ;
assign ROM_8_256[167] = 8'd24 ;
assign ROM_8_256[168] = 8'd22 ;
assign ROM_8_256[169] = 8'd21 ;
assign ROM_8_256[170] = 8'd19 ;
assign ROM_8_256[171] = 8'd17 ;
assign ROM_8_256[172] = 8'd16 ;
assign ROM_8_256[173] = 8'd15 ;
assign ROM_8_256[174] = 8'd13 ;
assign ROM_8_256[175] = 8'd12 ;
assign ROM_8_256[176] = 8'd11 ;
assign ROM_8_256[177] = 8'd10 ;
assign ROM_8_256[178] = 8'd8 ;
assign ROM_8_256[179] = 8'd7 ;
assign ROM_8_256[180] = 8'd6 ;
assign ROM_8_256[181] = 8'd6 ;
assign ROM_8_256[182] = 8'd5 ;
assign ROM_8_256[183] = 8'd4 ;
assign ROM_8_256[184] = 8'd3 ;
assign ROM_8_256[185] = 8'd3 ;
assign ROM_8_256[186] = 8'd2 ;
assign ROM_8_256[187] = 8'd2 ;
assign ROM_8_256[188] = 8'd2 ;
assign ROM_8_256[189] = 8'd1 ;
assign ROM_8_256[190] = 8'd1 ;
assign ROM_8_256[191] = 8'd1 ;
assign ROM_8_256[192] = 8'd1 ;
assign ROM_8_256[193] = 8'd1 ;
assign ROM_8_256[194] = 8'd1 ;
assign ROM_8_256[195] = 8'd1 ;
assign ROM_8_256[196] = 8'd2 ;
assign ROM_8_256[197] = 8'd2 ;
assign ROM_8_256[198] = 8'd2 ;
assign ROM_8_256[199] = 8'd3 ;
assign ROM_8_256[200] = 8'd3 ;
assign ROM_8_256[201] = 8'd4 ;
assign ROM_8_256[202] = 8'd5 ;
assign ROM_8_256[203] = 8'd6 ;
assign ROM_8_256[204] = 8'd6 ;
assign ROM_8_256[205] = 8'd7 ;
assign ROM_8_256[206] = 8'd8 ;
assign ROM_8_256[207] = 8'd10 ;
assign ROM_8_256[208] = 8'd11 ;
assign ROM_8_256[209] = 8'd12 ;
assign ROM_8_256[210] = 8'd13 ;
assign ROM_8_256[211] = 8'd15 ;
assign ROM_8_256[212] = 8'd16 ;
assign ROM_8_256[213] = 8'd17 ;
assign ROM_8_256[214] = 8'd19 ;
assign ROM_8_256[215] = 8'd21 ;
assign ROM_8_256[216] = 8'd22 ;
assign ROM_8_256[217] = 8'd24 ;
assign ROM_8_256[218] = 8'd26 ;
assign ROM_8_256[219] = 8'd28 ;
assign ROM_8_256[220] = 8'd30 ;
assign ROM_8_256[221] = 8'd32 ;
assign ROM_8_256[222] = 8'd34 ;
assign ROM_8_256[223] = 8'd36 ;
assign ROM_8_256[224] = 8'd38 ;
assign ROM_8_256[225] = 8'd40 ;
assign ROM_8_256[226] = 8'd43 ;
assign ROM_8_256[227] = 8'd45 ;
assign ROM_8_256[228] = 8'd47 ;
assign ROM_8_256[229] = 8'd50 ;
assign ROM_8_256[230] = 8'd52 ;
assign ROM_8_256[231] = 8'd55 ;
assign ROM_8_256[232] = 8'd57 ;
assign ROM_8_256[233] = 8'd60 ;
assign ROM_8_256[234] = 8'd63 ;
assign ROM_8_256[235] = 8'd65 ;
assign ROM_8_256[236] = 8'd68 ;
assign ROM_8_256[237] = 8'd71 ;
assign ROM_8_256[238] = 8'd74 ;
assign ROM_8_256[239] = 8'd77 ;
assign ROM_8_256[240] = 8'd79 ;
assign ROM_8_256[241] = 8'd82 ;
assign ROM_8_256[242] = 8'd85 ;
assign ROM_8_256[243] = 8'd88 ;
assign ROM_8_256[244] = 8'd91 ;
assign ROM_8_256[245] = 8'd94 ;
assign ROM_8_256[246] = 8'd97 ;
assign ROM_8_256[247] = 8'd100;
assign ROM_8_256[248] = 8'd103;
assign ROM_8_256[249] = 8'd106;
assign ROM_8_256[250] = 8'd109;
assign ROM_8_256[251] = 8'd112;
assign ROM_8_256[252] = 8'd116;
assign ROM_8_256[253] = 8'd119;
assign ROM_8_256[254] = 8'd122;
assign ROM_8_256[255] = 8'd125;
assign FOUT = ROM_8_256[phase_now];
endmodule
DDR3芯片主要引脚:
以Micron美光旗下的MT41K256M16的96-Ball FBGA – x16 Ball Descriptions芯片为例:
Symbol | Type | Description |
---|---|---|
A[14:13], A12/BC#, A11, A10/AP, A[9:0] | Input | the row address the column address A10 sampled during a PRECHARGE command determines whether the PRECHARGE applies to one bank(A10 LOW, bank selected by BA[2:0]) or all banks (A10 HIGH). A12 is sampled during READ and WRITE commands to determine whether burst chop |
BA[2:0] | Input | Bank address inputs: BA[2:0] |
CK, CK# | Input | Clock: CK and CK# are differential clock inputs. |
CKE | Input | Clock enable: CKE enables (registered HIGH) and disables (registered LOW) internal circuitry and clocks on the DRAM. |
CS# | Input | Chip select: CS# enables (registered LOW) and disables (registered HIGH) the command decoder. |
LDM | Input | Input data mask: LDM is a lower-byte, input mask signal for write data. |
ODT | Input | On-die termination(片上终端): ODT enables (registered HIGH) and disables (registered LOW) termination resistance internal to the DDR3 SDRAM. |
RAS#, CAS#, WE# | Input | Command inputs: RAS#, CAS#, and WE# (along with CS#) define the command |
RESET# | Input | Reset: RESET# is an active LOW |
UDM | Input | Input data mask: UDM is an upper-byte, |
DQ[7:0] | I/O | Data input/output: Lower byte of bidirectional data bus |
DQ[15:8] | I/O | Data input/output: Upper byte of bidirectional data bus |
LDQS, LDQS# | I/O | Lower byte data strobe: Output with read data. Edge-aligned with read data.Input with write data. Center-aligned to write data. |
UDQS, UDQS# | I/O | Upper byte data strobe: Output with read data. Edge-aligned with read data.Input with write data. DQS is center-aligned to write data. |
MIG主要信号线:
Sources : D:\.lnk\ChineseTechnology\ChineseMedicine\相关文档\MT41K256M16-DDR3 SDRAM\DDR3讲解.docx
Symbol | Type | Description |
---|---|---|
init_calib_complete | Output | PHY asserts init_calib_complete when calibration is finished. |
app_cmd | Input | 操作命令,其实你只需要用到3’b000(写入)和3’b001(读出) |
app_addr | Input | 操作地址,按照结构从高位到低位是 rank(内存条正反) + bank + row + column |
app_en | Input | 操作地址app_addr的使能,只有它拉高的时候,对应的app_addr才是有效的 |
app_wdf_data | Input | 写入的数据接口 |
app_wdf_end | Input | This active-High input indicates that the current clock cycle is the last cycle of input data on app_wdf_data[].理论上应该有点用,但是实际你只要让它跟app_wdf_wren一样就行了 |
app_wdf_wren | Input | 写入的数据接口app_wdf_data的使能, 只有它拉高的时候,对应的app_wdf_data才是有效的 |
app_rd_data | Output | 读出的数据接口 |
app_rd_data_end | Output | This active-High output indicates that the current clock cycle is the last cycle of output data on app_rd_data[]. |
app_rd_data_valid | Output | This active-High output indicates that app_rd_data[] is valid. |
app_rdy | Output | This output indicates that the UI is ready to accept commands. |
app_wdf_rdy | Output | This output indicates that the write data FIFO is ready to receive data.;DDR又告诉你,你在app_wdf_rdy拉高的时候拉高app_wdf_wren,写入数据app_wdf_data 才是有效的 |
sys_clk_i | 提供给MIG核的系统时钟 | |
clk_ref_i | 提供给MIG核的参考时钟 | |
sys_rst | Input | This is the active-High UI reset. |
ui_clk | Output | 操作app的工作时钟 |
ui_clk_sync_rst | Output | 操作app的同步复位 |
以800MHz频率工作的MIG核与DDR3进行通信,由于Double Data Rate进行采样,故实际频率为1600MHz,则4块芯片的吞吐量(带宽)为1600MHz * 64 bit,MIG核输出的ui_clk是用户操作app的工作时钟,所以对应用户的输入数据位宽应该是1600MHz * 64bit / 200MHz = 512bits
app_addr:示例用户与MIG交互的数据为512位,MIG核与DDR3交互的数据位宽为64位,这64位划分成16_16_16_16存储在4片DDR3上,512 / 64 = 8,因此用户一次发送512位的话是占用了1片DDR3的8个存储单元格,故连续地址操作的话,app_addr应该自增8.
init_calib_complete:初始化校验完成标志位,正常情况下为高
init_calib_complete出现不拉高的情况:
成熟的代码:
新板卡可能电源方面存在问题
DDR3的引脚部分出现了锡渣
温度过高
电路板设计问题:(蛇形)走线误差较大(不等长)
代码问题
写时序要求:
读时序要求:
D:\.lnk\ChineseTechnology\ChineseMedicine\相关文档\FPGA官方文档\FPGA资源文档\ug476_7Series_Transceivers.pdf
About This Guide
Overview and 7 Series Features
The 7 series FPGAs GTX and GTH transceivers are power-efficient transceivers, supporting line rates from 500 Mb/s to 12.5 Gb/s for GTX transceivers and 13.1 Gb/s for GTH transceivers.The GTX/GTH transceiver is highly configurable and tightly integrated with the programmable logic resources of the FPGA.
7 Series FPGAs GTX and GTH Transceiver Features:
The GTX/GTH transceiver supports these use modes:
GTX Transceiver Inside Kintex-7 XC7K325T-FPGA
GTX Transceiver Quad Configuration
Four GTXE2 channels clustered together with one GTXE2_COMMON primitive are called a Quad or Q. The GTXE2_COMMON primitive contains an LC-tank PLL (QPLL). Each GTXE2_CHANNEL primitive consists of a channel PLL, a transmitter, and a receiver.
【TX、RX】: CHANNEL支持接收、发送数据
【CPLL】: CHANNEL PLL,每个GTX Transceiver Quad中有4个CPLL,可提供时钟给通道TX、RX
【QPLL】: Quad PLL,每个GTX Transceiver Quad中有1个QPLL,可提供时钟给4个通道的TX、RX
【IBUFDS】: 差分转单端,提供参考时钟
GTXE2_CHANNEL Primitive Topology
8B/10B
8B/10B编码基本原理
8B/10B ENCODE/DECODE详解
目的:8B/10B 编码将待发送的 8 位数据转换成 10 位代码组,其目的是保证直流平衡,以及足够密集的电平转换。如果不进行8B/10B编码,可能对接收方的提取造成困难。
注意事项:
8B/10B编码方案是把8bit数据分成2个子分组: 3个最高有效位(y)和5个最低有效位( x)。 代码字按顺序排列,从最高有效位到最低有效位分别记为H、 G、 F和E、 D、 C、 B、 A。 3bit的子分组编码成4 bit,记为j、 h、 g、 f; 5 bit的子分组编码成6bit,记为i、 e、 d、 c、 b、a,其映射关系如图1所示,4bit和6bit的子分组再组合成10bit的编码值。
Four Channel Configuration (Reference Clock from the QPLL of GTXE2_COMMON)
Internal Channel Clocking Architecture
CPLL Block Diagram
The CPLL in the GTX transceiver has a nominal operating range between 1.6 GHz to 3.3 GHz. The CPLL in the GTH transceiver has a nominal operating range between 1.6 GHz to 5.16 GHz. The 7 Series FPGAs Transceivers Wizard chooses the appropriate CPLL settings based on application requirements.
Equation 2-1 shows how to determine the CPLL output frequency (GHz).
f
P
L
L
C
l
k
o
u
t
=
f
P
L
L
C
l
k
i
n
×
N
1
×
N
2
M
f_{PLLClkout} = f_{PLLClkin} \times \frac {N1 \times N2} {M}
fPLLClkout=fPLLClkin×MN1×N2
Equation 2-2 shows how to determine the line rate (Gb/s). D represents the value of the TX or RX clock divider block in the channel. Both rising and falling edges of the PLL CLKOUT are used to generate the required line rate defined in Equation 2-2.
f
L
i
n
e
R
a
t
e
=
f
P
L
L
C
l
k
o
u
t
×
2
D
f_{LineRate} = \frac {f_{PLLClkout} \times 2} {D}
fLineRate=DfPLLClkout×2
Table 2-8: CPLL Divider Settings
Factor | Attribute | Valid Settings |
---|---|---|
M | CPLL_REFCLK_DIV | 1, 2 |
N2 | CPLL_FBDIV | 1, 2, 3, 4, 5 |
N1 | CPLL_FBDIV_45 | 4, 5 |
D | RXOUT_DIV TXOUT_DIV | 1, 2, 4, 8, 16 |
QPLL Detail
The QPLL VCO operates within two different frequency bands. Table 2-12 describes the nominal operating range for these bands. For more information, see the specific device data sheet.
Table 2-12: QPLL Nominal Operating Range
Transceiver | Frequency (GHz) | |
---|---|---|
GTX | Lower Band | 5.93–8.0 |
Upper Band | 9.8–12.5 | |
GTH | 8.0–13.1 |
When the lower band VCO is selected, the upper band VCO is automatically powered down and vice versa. The 7 Series FPGAs Transceivers Wizard chooses the appropriate band and QPLL settings based on application requirements.
Equation 2-3 shows how to determine the PLL output frequency (GHz).
f
P
L
L
C
l
k
o
u
t
=
f
P
L
L
C
l
k
i
n
×
N
M
×
2
f_{PLLClkout} = f_{PLLClkin} \times \frac {N} {M \times 2}
fPLLClkout=fPLLClkin×M×2N
Equation 2-4 shows how to determine the line rate (Gb/s). D represents the value of the TX or RX clock divider block in the channel. Both rising and falling edges of the PLL CLKOUT are used to generate the required line rate defined in Equation 2-4. See Table 2-8, page 48 for the valid settings for D.
f
L
i
n
e
R
a
t
e
=
f
P
L
L
C
l
k
o
u
t
×
2
D
f_{LineRate} = \frac {f_{PLLClkout} \times 2} {D}
fLineRate=DfPLLClkout×2
Table 2-13 lists the allowable divider values.
Factor | Attribute | Valid Settings |
---|---|---|
M | QPLL_REFCLK_DIV | 1, 2, 3, 4 |
N | QPLL_FBDIV QPLL_FBDIV_RATIO | 16, 20, 32, 40, 64, 66, 80, 100 |
D | RXOUT_DIV TXOUT_DIV | 1, 2, 4, 8, 16 |
CPLD(Complex Programmable Logic Device, 复杂可编程逻辑器件)和FPGA(Filed Programmable Gate Array, 现场可编程门阵列)是两种可编程数字逻辑器件,它们在某些方面相似,但也有一些关键区别。以下是CPLD和FPGA之间的主要区别:
总之,CPLD和FPGA都是可编程数字逻辑器件,但它们适用于不同的应用。CPLD适用于相对较小和简单的任务,而FPGA则适用于更大规模和复杂性的项目,需要更高的性能和资源。选择哪种器件取决于项目的具体需求和约束。
① 首先需要官方该芯片型号对应的系列的加载文件,其后缀为.qdz
② 两种方法:
进入QuartusⅡ -> Tools -> Install Devices -> Download directory(后缀带qdz的Device文件夹)
(Win + S) -> Quartus Ⅱ 13.0sp1 Device Installer -> Download directory(后缀带qdz的Device文件夹)
然后即可在Device中找到我们芯片型号对应的系列以及该芯片型号。
当在IIC(或IIC,Inter-Integrated Circuit)通信中从机不应答时,主机(通常是FPGA)通常需要采取适当的措施来处理这种情况。以下是一些可能的处理方式:
重试机制:主机可以尝试重新发送相同的命令或数据。这通常需要等待一段时间以确保从机有足够的时间来处理前一个传输。
发送停止条件:如果从机不应答,主机可以发送I2C总线上的停止条件,然后重新发起通信。这相当于重新启动通信过程。
错误处理:主机可以记录从机的无应答作为错误事件,并采取适当的措施来处理错误。这可能包括生成警报或记录错误状态。
超时设置:主机可以设置一个通信超时时间,如果从机在规定时间内没有应答,主机可以认为通信失败并采取适当的措施。
处理应答错误:有时从机会发送错误的应答,主机需要检测这些错误并采取适当的行动。
故障排除:如果从机一直不应答,主机可以进行故障排除,检查硬件连接、IIC地址和电源等方面的问题。
通常,处理IIC通信中的从机不应答需要根据具体的应用和硬件配置来确定适当的策略。在FPGA中,这些策略通常是通过编程实现的,使用FPGA的IIC控制器来控制通信和处理异常情况。因此,处理IIC通信中的从机不应答需要结合具体的FPGA设计和应用需求来确定。
系统同步和源同步是与时钟信号和数据通信相关的两个概念。
选择系统同步或源同步通常取决于具体应用和需求。对于需要高度同步性的应用,系统同步可能更适合。对于高速数据传输,源同步可以减少对主系统时钟的要求,但需要更复杂的时序管理。
无论选择哪种同步方式,都需要谨慎设计和验证,以确保数据的正确性和稳定性。
资源消耗 = (32 * 16384) / 单个BRAM容量
Sources:https://www.runoob.com/w3cnote/verilog-function.html
函数function | 任务task | |
---|---|---|
执行与消耗 | 不消耗仿真时间 | 消耗仿真时间 |
仿真控制语句 | 函数中不能含有控制仿真时间的语句,如时间延迟#100,阻塞语句@(posedge clk)等 | 任务中可以包含仿真时间控制语句,如延迟#100,时钟周期@(), wait()以及事件event等语句 |
形参变量 | 函数中至少包含一个输入变量进行传参 | 任务中可以没有输入、输出变量 |
调用方式 | 函数的调用只能以语句的一部分出现 | 任务的调用通过一条单独的语句实现 |
【区别】: 可综合的任务和函数都只能实现组合逻辑。
上述芯片在我使用的FPGA开发板中的作用是电平转换
收端都有各自的时钟,但是它们共享同一时钟域。这通常在高速串行通信中使用,例如DDR SDRAM、PCI Express等。
[外链图片转存中…(img-V563VdbO-1705833987446)]
选择系统同步或源同步通常取决于具体应用和需求。对于需要高度同步性的应用,系统同步可能更适合。对于高速数据传输,源同步可以减少对主系统时钟的要求,但需要更复杂的时序管理。
无论选择哪种同步方式,都需要谨慎设计和验证,以确保数据的正确性和稳定性。
资源消耗 = (32 * 16384) / 单个BRAM容量
Sources:https://www.runoob.com/w3cnote/verilog-function.html
函数function | 任务task | |
---|---|---|
执行与消耗 | 不消耗仿真时间 | 消耗仿真时间 |
仿真控制语句 | 函数中不能含有控制仿真时间的语句,如时间延迟#100,阻塞语句@(posedge clk)等 | 任务中可以包含仿真时间控制语句,如延迟#100,时钟周期@(), wait()以及事件event等语句 |
形参变量 | 函数中至少包含一个输入变量进行传参 | 任务中可以没有输入、输出变量 |
调用方式 | 函数的调用只能以语句的一部分出现 | 任务的调用通过一条单独的语句实现 |
【区别】: 可综合的任务和函数都只能实现组合逻辑。
上述芯片在我使用的FPGA开发板中的作用是电平转换
将FPGA芯片输出的I/O电压转换成可用于连接外设的电压。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。