目前采用的分析方法是原版VHDL+转换后的verilog HDL同时阅读的方法。由于不熟悉VHDL,因此对阅读代码造成了很多困难。
整个工程环环相扣,逻辑数据结构极其复杂,再加上作者不写注释无文档说明,使得分析代码变得十分繁琐,目前仍在进行中。
adc.vhd:
需要了解的是,这里使用的ADC为LTC2292,由于配置为单数据总线的模式,因此数据总线的输出格式为DDR(double data rate),在时钟的上升、下降沿分别读取两个通道的数据。
模块的正常框图如下图所示
这里要注意在代码中有一个开关用于切换是否bypass FIR模块
CONSTANT generate_fir : BOOLEAN := true;
如果关闭的话数据会直通后级。在true时,会将data_a与data_b的数据合成为一个24bit的变量,而如果false,则会简单的将输入信号复制两份分别到高12与低12位
还有一段看似比较奇怪的代码:
g_not_fir : IF NOT generate_fir GENERATE
fir_data_out <= fir_data_in;
PROCESS (clk)
VARIABLE count : unsigned(7 DOWNTO 0) := (OTHERS => '0');
BEGIN
IF rising_edge(clk) THEN
IF count = to_unsigned(40, 8) THEN
count := (OTHERS => '0');
valid <= '1';
ELSE
count := count + 1;
valid <= '0';
END IF;
END IF;
END PROCESS;
推测其实这里主要是为了产生valid信号。因为FIR处理数据有一定的延迟,因此当我们bypass掉FIR时,将valid信号延迟40拍以免造成后级系统的混乱,保持一致性。
要注意这里数据送进FIR的方式
fir_data_in <= "0000" & data_a_buffer & "0000" & data_b_buffer;//VHDL
assign fir_data_in = {4'b0000, data_a_buffer, 4'b0000, data_b_buffer};//Verilog HDL
是高低位同时输入,因此这里实际上用到的是一个双通道的FIR。FIR的输入可以有很多通道,拿ALTERA的IP核举例,它最多支持192个通道,为了简便,直接将数据并为同一个数据总线。同时因为FIR的数据位宽为16位,因此要为高位添0。
理论上来说,这样会造成data_a和data_b的数据错开一个时钟,我不知道这会不会造成什么影响,但是似乎可以通过软件修正。
downsampler.vhd
框图如下图: