模块电源(八):DC-DC同步|异步

一、DC-DC原理

        DC-DC转换器是输入、输出电压类型均为直流的一种电能转换装置,主要利用开关器件(MOSFET/晶体管),通过周期性控制开关器件的开关,实现对输入电压的脉冲调制,实现电压变换、自动稳压功能。
        DCDC转换器类型分为:Buck降压型、Boost升压型、Buck-boost降压升压型

二、整流方式

        以Buck降压型为例,DC-DC整流(拓扑结构)主要由开关管、电感、续流二极管、滤波电容等元器件构成。在开关管周期性打开、闭合的过程中,负载 RL 两端的电压也呈周期性变化,有效值稳定在所需的降低后的电压附近,如下图所示

1.异步整流

        定义:异步整流只有一个高边MOS管(G1),加一个续流二极管(D1)组成,因为是自然续流过程,相对于同步来讲,被称为异步整流,如下图拓扑所示。

2.同步整流

        定义:同步整流是采用

--{{ Section below this comment is automatically maintained -- and may be overwritten --{entity {DaqMuxCtrlRamVhd} architecture {DaqMuxCtrlRamVhd}} library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity DaqMuxCtrlRamVhd is port( -- Write interface plWrEn : in std_logic; puv9WrAdr : in unsigned( 8 downto 0 ); plv48WrData : in std_logic_vector( 47 downto 0 ); -- Read interface puv9RdAdr : in unsigned( 8 downto 0 ); plv48RdData : out std_logic_vector( 47 downto 0 ) := ( others => '0' ); -- Clock, common to both read and write side plClk : in std_logic ); end DaqMuxCtrlRamVhd; --}} End of automatically maintained section architecture DaqMuxCtrlRamVhd of DaqMuxCtrlRamVhd is -- This RAM controls: -- 1) MUX channel select -- 2) Result handler RAM addressing -- The RAM holds a total of 160 MUX states/addresses (32 x 5) -- 160 samples per ADC = 83.2 us = 1x 12kHz period (320 samples) -- 40 samples per ADC = 20.8 us = 1x 48kHz period (80 samples) -- 10 samples per ADC = 5.2 us = 1x 192kHz period (20 samples) -- _________ _________ _________ _________ -- InvCurL1AFastSns-----------------|I0 MUX| | ADC| InvCurL1BFastSns-----------------|I0 MUX| | ADC| -- Mains1CurL1AFastSns-----------------|I1 O|---|VA1 | Mains1CurL1BFastSns-----------------|I1 O|---|VB1 | -- AdcMuxBit(6)-----------------|S MuxA1| | | AdcMuxBit(6)-----------------|S MuxB1| | | -- ? | | ? | | -- _________ | | _________ | | -- InvCurL2AFastSns-----------------|I0 MUX| | | InvCurL2BFastSns-----------------|I0 MUX| | | -- Mains1CurL2AFastSns-----------------|I1 O|---|VA2 | Mains1CurL2BFastSns-----------------|I1 O|---|VB2 | -- AdcMuxBit(6)-----------------|S MuxA2| | | AdcMuxBit(6)-----------------|S MuxB2| | | -- ? | | ? | | -- _________ | | _________ | | -- InvCurL3AFastSns-----------------|I0 MUX| | | InvCurL3BFastSns-----------------|I0 MUX| | | -- Mains1CurL3AFastSns-----------------|I1 O|---|VA3 | Mains1CurL3BFastSns-----------------|I1 O|---|VB3 | -- AdcMuxBit(7)-----------------|S MuxA3| | | AdcMuxBit(7)-----------------|S MuxB3| | | -- ? | | ? | | -- _________ | | _________ | | -- BattCurNegAFastSns-----------------|I0 MUX| | | BattCurNegBFastSns-----------------|I0 MUX| | | -- BattCurPosAFastSns-----------------|I1 O|---|VA4 | BattCurPosBFastSns-----------------|I1 O|---|VB4 | -- AdcMuxBit(7)-----------------|S MuxA4| | | AdcMuxBit(7)-----------------|S MuxB4| | | -- ? | | ? | | -- _________ | | _________ | | -- InvVolL1ASns-----------------|I0 MUX| | | InvVolL3ASns-----------------|I0 MUX| | | -- Mains1VolL1Sns-----------------|I1 | | | Mains1VolL3Sns-----------------|I1 | | | -- InvVolL1BSns-----------------|I2 | | | InvVolL3BSns-----------------|I2 | | | -- Mains1VolL1PriSns-----------------|I3 | | | Mains1VolL3PriSns-----------------|I3 | | | -- InvVolL1ASns-----------------|I4 | | | InvVolL3ASns-----------------|I4 | | | -- Mains1VolL1Sns-----------------|I5 | | | Mains1VolL3Sns-----------------|I5 | | | -- InvVolL1BSns-----------------|I6 | | | InvVolL3BSns-----------------|I6 | | | -- _________ | | | DOUTA|---AdcDataA _________ | | | DOUTB|---AdcDataB -- OutVolL1Sns---|I0 MUX| | | | | OutVolL3Sns---|I0 MUX| | | | | -- AdcAVolRefSns---|I1 O|---|I7 O|---|VA5 | AdcBVolRefSns---|I1 O|---|I7 O|---|VB5 | -- AdcMuxBit(8)---|S MuxA7| | | | | AdcMuxBit(8)---|S MuxB7| | | | | -- ? | | | | ? | | | | -- | | | | | | | | -- AdcMuxBit(3)-----------------|S0 | | | AdcMuxBit(3)-----------------|S0 | | | -- AdcMuxBit(4)-----------------|S1 | | | AdcMuxBit(4)-----------------|S1 | | | -- AdcMuxBit(5)-----------------|S2 MuxA5| | | AdcMuxBit(5)-----------------|S2 MuxB5| | | -- ? | | ? | | -- _________ | | _________ | | -- InvVolL2ASns-----------------|I0 MUX| | | BattVolPosPriSns-----------------|I0 MUX| | | -- Mains1VolL2Sns-----------------|I1 | | | BattVolPosSns-----------------|I1 | | | -- InvVolL2BSns-----------------|I2 | | | DcBusVolPosASns-----------------|I2 | | | -- Mains1VolL2PriSns-----------------|I3 | | | BattVolNegPriSns-----------------|I3 | | | -- InvVolL2ASns-----------------|I4 | | | BattVolNegSns-----------------|I4 | | | -- Mains1VolL2Sns-----------------|I5 | | | DcBusVolNegASns-----------------|I5 | | | -- InvVolL2BSns-----------------|I6 | | | DcBusVolAvgBSns-----------------|I6 | | | -- OutVolL2Sns-----------------|I7 O|---|VA6 | HsTempSns-----------------|I7 O|---|VB6 | -- | | | | | | | | -- AdcMuxBit(3)-----------------|S0 | | | AdcMuxBit(3)-----------------|S0 | | | -- AdcMuxBit(4)-----------------|S1 | | | AdcMuxBit(4)-----------------|S1 | | | -- AdcMuxBit(5)-----------------|S2 MuxA6| | | AdcMuxBit(5)-----------------|S2 MuxB6| | | -- ? | | ? | | -- AdcMuxBit(0)-------------------------------|S0 | AdcMuxBit(0)-------------------------------|S0 | -- AdcMuxBit(1)-------------------------------|S1 | AdcMuxBit(1)-------------------------------|S1 | -- AdcMuxBit(2)-------------------------------|S2 | AdcMuxBit(2)-------------------------------|S2 | -- ? ? -- This block RAM controls 9 ADC mux addressing signals and 8 Result Handler address bits -- Nibble no RAM bits HW mux signals Description -- --------- -------- -------------- ----------- -- 0 RamBits[2:0] ADC_MUX_BIT[2:0] ADC build-in mux -- 1 RamBits[6:4] ADC_MUX_BIT[5:3] Slow channel mux -- 2 RamBits[8] ADC_MUX_BIT[6] Fast current channel L1, L2 mux -- 3 RamBits[12] ADC_MUX_BIT[7] Fast current channel L3, batt mux -- 4 RamBits[16] ADC_MUX_BIT[8] Slow cascaded channel mux -- 5 RamBits[23:20] Unused -- 6 RamBits[24] FastCurSnsInvertAdcA -- 7 RamBits[28] FastCurSnsInvertAdcB -- 8+9 RamBits[39:32] CalibrationRamRdAdr[7:0] -- 10+11 RamBits[47:40] ResultHandlerRamWrAdr[7:0] -- Below 6 fast current sensors are inverted in the hardware, which must be compensated for in the FPGA, -- for each of these samples the "FastCurSnsInvert" flag is asserted: -- InvCurL3A -- InvCurL1B -- InvCurL2B -- InvCurL3B -- Mains1CurL3A -- Mains1CurL2B -- Note! ResultHandlerAdr and MuxCtrl are offset one sample (520 ns) in order to compensate -- for ADC result communication delay. -- Dual port RAM type definition -- RAM size = 512 * 48 = 24,576 [bits] = 3072 [bytes] = 3 * M10K block RAM's type alv48MuxCtrlRam_t is array( 0 to 159 ) of std_logic_vector( 47 downto 0 ); -- Dual port RAM signal definition -- Used addresses = 160 -- Mux duration = 160 * 520 ns = 83.2 us (12 kHz) signal salv48MuxCtrlRam : alv48MuxCtrlRam_t := ( ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- --12 kHz -- TODO: calibration wr/rd address未定 -- 整PFC电流逆变电流的采样顺序,先采样PFC电流 ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- X"DF_03_10_0_01140", X"40_04_10_0_01141", X"50_05_10_0_01042", X"60_02_10_0_01043", X"70_16_11_0_00040", X"00_00_11_0_00041", X"10_01_11_0_00142", X"20_02_10_0_00143", -- FAST currents X"30_07_00_0_00044", -- InvVolL3A[0] / InvVolL1A[0] X"88_0B_00_0_00045", -- BattVolPriSns / InvVolL2A[0] X"90_03_10_0_01110", X"41_04_10_0_01111", X"51_05_10_0_01012", X"61_02_10_0_01013", X"71_16_11_0_00010", X"01_00_11_0_00011", X"11_01_11_0_00112", X"21_02_10_0_00113", -- FAST currents X"31_07_00_0_00014", -- Mains1VolL3[0] / Mains1VolL1[0] X"80_0B_00_0_00015", -- BattVolPosSns[0] / Mains1VolL2[0] X"84_03_10_0_01120", X"42_04_10_0_01121", X"52_05_10_0_01022", X"62_02_10_0_01023", X"72_16_11_0_00020", X"02_00_11_0_00021", X"12_01_11_0_00122", X"22_02_10_0_00123", -- FAST currents X"32_07_00_0_00024", -- InvVolL3B[0] / InvVolL1B[0] X"8C_0B_00_0_00025", -- BattVolNegSns[0] / InvVolL2B[0] X"94_03_10_0_01130", X"43_04_10_0_01131", X"53_05_10_0_01032", X"63_02_10_0_01033", X"73_16_11_0_00030", X"03_00_11_0_00031", X"13_01_11_0_00132", X"23_02_10_0_00133", -- FAST currents X"33_07_00_0_00034", -- Mains1VolL3Pri[0] / Mains1VolL1Pri[0] X"98_0B_00_0_00035", -- BattVolNegPriSns[0] / Mains1VolL2Pri[0] X"99_03_10_0_01140", X"44_04_10_0_01141", X"54_05_10_0_01042", X"64_02_10_0_01043", X"74_16_11_0_00040", X"04_00_11_0_00041", X"14_01_11_0_00142", X"24_02_10_0_00143", -- FAST currents X"34_07_00_0_00044", -- InvVolL3A[1] / InvVolL1A[1] X"89_0B_00_0_00045", -- DC_BUS_VOL_POS_A_SNS / InvVolL2A[1] X"91_03_10_0_01150", X"45_04_10_0_01151", X"55_05_10_0_01052", X"65_02_10_0_01053", X"75_16_11_0_00050", X"05_00_11_0_00051", X"15_01_11_0_00152", X"25_02_10_0_00153", -- FAST currents X"35_07_00_0_00054", -- Mains1VolL3[1] / Mains1VolL1[1] X"81_0B_00_0_00055", -- DcBusVolNegASns / Mains1VolL2[1] X"85_03_10_0_01160", X"46_04_10_0_01161", X"56_05_10_0_01062", X"66_02_10_0_01063", X"76_16_11_0_00060", X"06_00_11_0_00061", X"16_01_11_0_00162", X"26_02_10_0_00163", -- FAST currents X"36_07_00_0_00064", -- InvVolL3B[1] / InvVolL1B[1] X"8D_0B_00_0_00065", -- DC_BUS_VOL_SUM_B_SNS / InvVolL2B[1] X"91_03_10_0_01170", X"47_04_10_0_01171", X"57_05_10_0_01072", X"67_02_10_0_01073", X"77_16_11_0_00070", X"07_00_11_0_00071", X"17_01_11_0_00172", X"27_02_10_0_00173", -- FAST currents X"37_07_00_0_00074", -- OutVolL3[0] / OutVolL1[0] X"9A_0B_00_0_00075", -- PM_ID_SAMPLE / OutVolL2[0] X"9B_03_10_0_01140", X"48_04_10_0_01141", X"58_05_10_0_01042", X"68_02_10_0_01043", X"78_16_11_0_00040", X"08_00_11_0_00041", X"18_01_11_0_00142", X"28_02_10_0_00143", -- FAST currents X"38_07_00_0_00044", -- InvVolL3A[2] / InvVolL1A[2] X"8A_0B_00_0_00045", -- null / InvVolL2A[2] X"92_03_10_0_01110", X"49_04_10_0_01111", X"59_05_10_0_01012", X"69_02_10_0_01013", X"79_16_11_0_00010", X"09_00_11_0_00011", X"19_01_11_0_00112", X"29_02_10_0_00113", -- FAST currents X"39_07_00_0_00014", -- Mains1VolL3[2] / Mains1VolL1[2] X"82_0B_00_0_00015", -- null / Mains1VolL2[2] X"86_03_10_0_01120", X"4A_04_10_0_01121", X"5A_05_10_0_01022", X"6A_02_10_0_01013", X"7A_16_11_0_00020", X"0A_00_11_0_00021", X"1A_01_11_0_00122", X"2A_02_10_0_00123", -- FAST currents X"3A_07_00_0_00024", -- InvVolL3B[2] / InvVolL1B[2] X"8E_0B_00_0_00025", -- null / InvVolL2B[2] X"96_03_10_0_01130", X"4B_04_10_0_01131", X"5B_05_10_0_01032", X"6B_02_10_0_01033", X"7B_16_11_0_00030", X"0B_00_11_0_00031", X"1B_01_11_0_00132", X"2B_02_10_0_00133", -- FAST currents X"3B_07_00_0_00024", -- NULL X"DF_0B_00_0_00025", -- null X"DF_03_10_0_01140", X"4C_04_10_0_01141", X"5C_05_10_0_01042", X"6C_02_10_0_01043", X"7C_16_11_0_00040", X"0C_00_11_0_00041", X"1C_01_11_0_00142", X"2C_02_10_0_00143", -- FAST currents X"3C_07_00_0_00044", -- InvVolL3A[3] / InvVolL1A[3] X"8B_0B_00_0_00045", -- null / InvVolL2A[3] X"93_03_10_0_01150", X"4D_04_10_0_01151", X"5D_05_10_0_01052", X"6D_02_10_0_01053", X"7D_16_11_0_00050", X"0D_00_11_0_00051", X"1D_01_11_0_00152", X"2D_02_10_0_00153", -- FAST currents X"3D_07_00_0_00054", -- Mains1VolL3[3] / Mains1VolL1[3] X"83_0B_00_0_00055", -- null / Mains1VolL2[3] X"87_03_10_0_01160", X"4E_04_10_0_01161", X"5E_05_10_0_01062", X"6E_02_10_0_01063", X"7E_16_11_0_00060", X"0E_00_11_0_00061", X"1E_01_11_0_00162", X"2E_02_10_0_00163", -- FAST currents X"3E_07_00_0_00064", -- InvVolL3B[3] / InvVolL1B[3] X"8F_0B_00_0_00065", -- null / InvVolL2B[3] X"97_03_10_0_01170", X"4F_04_10_0_01171", X"5F_05_10_0_01072", X"6F_02_10_0_01073", X"7F_16_11_0_00070", X"0F_00_11_0_00071", X"1F_01_11_0_00172", X"2F_02_10_0_00173", -- FAST currents X"3F_07_00_0_10074", -- AdcBVolRefSns_2.5V / AdcAVolRefSns_2.5V X"9C_14_00_0_10075" -- null / NILL ); attribute ramstyle : string; attribute ramstyle of salv48MuxCtrlRam : signal is "M10K"; begin WriteProcess : process( plClk ) begin if rising_edge( plClk ) then if plWrEn = '1' then salv48MuxCtrlRam( to_integer( puv9WrAdr )) <= plv48WrData; end if; end if; end process WriteProcess; ReadProcess : process( plClk ) begin if rising_edge( plClk ) then plv48RdData <= salv48MuxCtrlRam( to_integer( puv9RdAdr )); end if; end process ReadProcess; end DaqMuxCtrlRamVhd; 请解析以上VHDL代码
08-19
<think>我们有一个VHDL实体 `DaqMuxCtrlRamVhd`,它实现了一个双端口RAM(随机存取存储器)。这个RAM用于控制多路复用器(MUX)通道选择结果处理器的RAM寻址。以下是对代码的详细解析: ### 实体声明 (Entity Declaration) ```vhdl entity DaqMuxCtrlRamVhd is port( -- Write interface plWrEn : in std_logic; -- 写使能 puv9WrAdr : in unsigned(8 downto 0); -- 写地址(9位,可寻址512个位置) plv48WrData : in std_logic_vector(47 downto 0); -- 写入数据(48位) -- Read interface puv9RdAdr : in unsigned(8 downto 0); -- 读地址(9位) plv48RdData : out std_logic_vector(47 downto 0); -- 读出数据(48位) -- Clock, common to both read and write side plClk : in std_logic -- 时钟(读写共用) ); end DaqMuxCtrlRamVhd; ``` ### 结构体 (Architecture) #### 关键说明 - RAM存储160个48位数据(地址0到159),每个数据代表一个MUX状态/地址。 - 注释中详细说明了RAM的位分配,用于控制9个ADC多路复用信号8个结果处理器地址位。 - 每个48位数据分为多个部分(nibbles),每个部分控制不同的硬件信号。 #### RAM位分配(注释中描述) | Nibble | 位范围 | 控制信号/描述 | |--------|---------------|--------------------------------| | 0 | [2:0] | ADC_MUX_BIT[2:0] (ADC内置MUX) | | 1 | [6:4] | ADC_MUX_BIT[5:3] (慢速通道MUX) | | 2 | [8] | ADC_MUX_BIT[6] (L1, L2快速电流通道MUX) | | 3 | [12] | ADC_MUX_BIT[7] (L3, 电池MUX) | | 4 | [16] | ADC_MUX_BIT[8] (慢速级联通道MUX) | | 5 | [23:20] | 未使用 | | 6 | [24] | FastCurSnsInvertAdcA (A通道快速电流反向标志) | | 7 | [28] | FastCurSnsInvertAdcB (B通道快速电流反向标志) | | 8-9 | [39:32] | CalibrationRamRdAdr[7:0] (校准RAM读地址) | | 10-11 | [47:40] | ResultHandlerRamWrAdr[7:0] (结果处理器RAM写地址) | #### RAM类型定义 ```vhdl type alv48MuxCtrlRam_t is array(0 to 159) of std_logic_vector(47 downto 0); ``` - 定义了一个包含160个元素的数组,每个元素是48位宽。 #### RAM初始化 - RAM被初始化为160个48位的值(用十六进制表示)。 - 初始化值示例:`X"DF_03_10_0_01140"`(注意:实际代码中下划线用于分隔,但在VHDL中,十六进制字面量通常不用下划线,这里可能是为了可读性,但实际代码中需要去掉下划线或使用其他方式表示)。 - 注释中提到初始化值中包含了校准地址结果处理器地址,但具体值未定(TODO)。 #### 属性声明(用于FPGA综合) ```vhdl attribute ramstyle : string; attribute ramstyle of salv48MuxCtrlRam : signal is "M10K"; ``` - 指示综合工具将`salv48MuxCtrlRam`信号实现为M10K内存块(针对Intel FPGA)。 #### 读写过程 1. **写过程(WriteProcess)**: - 在时钟上升沿,如果写使能(`plWrEn`)为高,则将输入数据`plv48WrData`写入到写地址`puv9WrAdr`指定的位置。 2. **读过程(ReadProcess)**: - 在时钟上升沿,将读地址`puv9RdAdr`指定的RAM位置的数据输出到`plv48RdData`。 ### 代码总结 - 该模块实现了一个双端口RAM,具有独立的写端口读端口,但共享同一个时钟。 - RAM大小为160个48位字,实际使用地址0~159(共160个位置)。 - 写操作是同步的(在时钟上升沿且写使能有效时写入)。 - 读操作是同步的(在时钟上升沿读取并输出)。 - 初始化时,RAM被赋予一组预设值(用于控制多路复用器地址)。 ### 注意点 1. 初始化值中的下划线在实际VHDL代码中可能不被允许,需要去掉或使用其他格式(如直接写连续的十六进制数字)。 2. 注释中提到的位分配(如nibble划分)在代码中没有直接使用,而是由外部模块根据读出的48位数据按位解释。 3. 地址线宽为9位(可寻址512个位置),但实际只使用前160个地址(0~159)。 ### 功能用途 该RAM用于存储每个采样点的多路复用器配置结果处理器的地址信息。在数据采集系统中,每个采样点需要不同的MUX配置以选择不同的传感器信号,同时需要知道该采样点的结果应该存储到结果RAM的哪个位置。因此,这个RAM相当于一个“控制序列存储器”,按照采样顺序存储每个采样点的控制信息。 ### 时序 - 每个采样点持续520 ns,160个采样点总共83.2 us(对应12kHz的采样率,因为1/12kHz≈83.3us)。 - 读地址由外部逻辑按顺序递增(0,1,...,159),循环往复,以周期性地获取每个采样点的控制信息。 ### 潜在问题 1. **初始化值**:注释中提到“TODO: calibration wr/rd address未定”,说明初始化值中的校准地址结果处理器地址部分可能需要根据实际情况调整。 2. **未使用位**:第5个nibble(位[23:20])被标记为未使用,但初始化值中这些位可能被写入非零值,需要注意。 ### 改进建议 1. 如果实际使用的地址只有160个,可以考虑将地址线改为8位(0~255),因为160<256,这样可以节省资源(但当前9位地址线也是可以的,因为160<512)。 2. 初始化值中的下划线需要移除,确保代码可综合。例如,`X"DF_03_10_0_01140"`应改为`X"DF03100001140"`(但要注意48位十六进制数的正确表示,实际位数必须匹配)。 ### 示例初始化值修正 48位十六进制数需要12个十六进制数字(因为48/4=12)。例如: - `X"DF03100001140"` 表示48位二进制,但实际长度必须为12个十六进制数字。上面例子中有的初始化值可能不足12个十六进制数字,需要补足。 在代码中,初始化值使用了16进制字符串,但带有下划线空格,这在实际VHDL中是不允许的。因此,应该将下划线空格移除,并确保每个字符串正好是12个十六进制数字(48位)。 例如,将`X"DF_03_10_0_01140"`改为`X"DF03100001140"`(注意:这里只是举例,实际值需要根据位分配来设置)。 ### 最后 这个模块是一个典型的双端口RAM,用于存储控制信息,在数据采集系统中起着关键作用。通过预先设置好每个采样点的控制字,系统可以自动按顺序切换多路复用器结果存储器地址,实现高速数据采集。 §§相关问题§§: 1. 如何修改代码以支持更大的RAM容量(例如512个48位字)? 2. 在VHDL中,如何为RAM初始化值添加注释以提高可读性? 3. 如果读地址写地址相同且同时读写,会发生什么? 4. 如何为这个RAM添加异步清零功能?</think>### VHDL代码解析:DAQ多路复用控制器RAM模块(DaqMuxCtrlRamVhd) 这段VHDL代码实现了一个用于数据采集系统的多路复用控制器RAM模块,主要功能是存储ADC通道选择结果处理器地址信息。以下是详细解析: #### 1. 实体声明 (Entity Declaration) ```vhdl entity DaqMuxCtrlRamVhd is port( -- 写接口 plWrEn : in std_logic; -- 写使能 puv9WrAdr : in unsigned(8 downto 0); -- 写地址(9位) plv48WrData : in std_logic_vector(47 downto 0); -- 写入数据(48位) -- 读接口 puv9RdAdr : in unsigned(8 downto 0); -- 读地址(9位) plv48RdData : out std_logic_vector(47 downto 0); -- 读出数据(48位) -- 时钟(读写共用) plClk : in std_logic ); end DaqMuxCtrlRamVhd; ``` #### 2. 结构体实现 (Architecture Implementation) ##### RAM核心功能 ```vhdl -- 定义RAM类型 (160个48位字) type alv48MuxCtrlRam_t is array(0 to 159) of std_logic_vector(47 downto 0); -- 声明RAM信号并初始化 signal salv48MuxCtrlRam : alv48MuxCtrlRam_t := (...); -- 指定使用M10K RAM块 (Intel FPGA专用) attribute ramstyle : string; attribute ramstyle of salv48MuxCtrlRam : signal is "M10K"; ``` #### 3. RAM位分配解析 RAM的48位数据按功能划分为以下部分: | 位域范围 | 功能描述 | 控制信号 | |---------------|------------------------------|------------------| | [2:0] | ADC内置MUX选择 | ADC_MUX_BIT[2:0] | | [6:4] | 慢速通道MUX选择 | ADC_MUX_BIT[5:3] | | [8] | L1/L2快速电流通道MUX选择 | ADC_MUX_BIT[6] | | [12] | L3/电池通道MUX选择 | ADC_MUX_BIT[7] | | [16] | 慢速级联通道MUX选择 | ADC_MUX_BIT[8] | | [23:20] | 未使用 | - | | [24] | A通道快速电流反向标志 | FastCurSnsInvertAdcA | | [28] | B通道快速电流反向标志 | FastCurSnsInvertAdcB | | [39:32] | 校准RAM读地址 | CalibrationRamRdAdr[7:0] | | [47:40] | 结果处理器RAM写地址 | ResultHandlerRamWrAdr[7:0] | #### 4. 时序与控制逻辑 ##### 写操作过程 ```vhdl WriteProcess : process(plClk) begin if rising_edge(plClk) then if plWrEn = '1' then -- 写入数据到指定地址 salv48MuxCtrlRam(to_integer(puv9WrAdr)) <= plv48WrData; end if; end if; end process WriteProcess; ``` ##### 读操作过程 ```vhdl ReadProcess : process(plClk) begin if rising_edge(plClk) then -- 从指定地址读取数据 plv48RdData <= salv48MuxCtrlRam(to_integer(puv9RdAdr)); end if; end process ReadProcess; ``` #### 5. 多路复用器架构解析 代码注释中详细描述了多路复用器的硬件连接: ```vhdl -- _________ _________ -- InvCurL1AFastSns-----------------|I0 MUX| | ADC| -- Mains1CurL1AFastSns-----------------|I1 O|---|VA1 | -- AdcMuxBit(6)-----------------|S MuxA1| | | -- ? | | -- _________ | | -- InvCurL2AFastSns-----------------|I0 MUX| | | -- Mains1CurL2AFastSns-----------------|I1 O|---|VA2 | -- AdcMuxBit(6)-----------------|S MuxA2| | | -- ? | | -- (更多类似连接结构...) ``` #### 6. 设计特点 1. **多采样率支持**: - 160个采样点 → 12kHz (83.2μs) - 40个采样点 → 48kHz (20.8μs) - 10个采样点 → 192kHz (5.2μs) 2. **双通道处理**: - 独立控制通道AB - 支持电流反向补偿 - 同步处理多路信号 3. **地址偏移补偿**: - 结果处理器地址MUX控制有520ns偏移 - 补偿ADC结果通信延迟 4. **专用硬件优化**: - 使用M10K RAM块 (Intel FPGA) - 160×48 = 7,680位存储 - 高效利用FPGA资源 #### 7. 初始化数据解析 RAM初始化包含160个48位值,每个值对应一个采样点的控制信息: ```vhdl ( X"DF_03_10_0_01140", -- 采样点0 X"40_04_10_0_01141", -- 采样点1 X"50_05_10_0_01042", -- 采样点2 ... -- 共160个 ) ``` 每个初始化值包含: - MUX控制位 (高位) - 校准RAM地址 (中位) - 结果处理器地址 (低位) #### 8. 关键应用说明 1. **电流反向补偿**: ```vhdl -- 以下传感器需要反向补偿: -- InvCurL3A, InvCurL1B, InvCurL2B, -- InvCurL3B, Mains1CurL3A, Mains1CurL2B ``` 通过设置FastCurSnsInvert标志实现补偿 2. **时序对齐**: ```vhdl -- 结果处理器地址MUX控制有1个采样点偏移(520ns) -- 补偿ADC通信延迟 ``` #### 9. 性能优化 1. **专用RAM块**: ```vhdl attribute ramstyle of salv48MuxCtrlRam : signal is "M10K"; ``` 确保使用FPGA的高性能嵌入式内存块 2. **并行处理**: - 独立读写端口 - 单时钟周期访问 - 无冲突读写操作 3. **紧凑设计**: - 160×48位 = 7.5Kb - 适合单个M10K RAM块 #### 10. 典型应用场景 1. 多通道数据采集系统 2. 电力监控设备 3. 工业自动化控制系统 4. 高精度传感器网络 5. 实时信号处理系统 ### 总结 该DAQ多路复用控制器RAM模块实现了: - 160个采样点的控制信息存储 - 9个ADC多路复用信号控制 - 结果处理器地址生成 - 电流反向补偿标志 - 双端口RAM接口(独立读写) - FPGA硬件优化实现
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值