比特流音频格式为SDIF VHDL的编码器

时间:2018-07-14 08:45:58

标签: audio encoding vhdl

我是VHDL编程的新手,但是我试图通过来自A-D转换芯片的dsd数据流实现SDIF编码。 来自芯片的dsd流具有两个独立的通道(L&R)数据流, 加上位时钟线。

SDIF-3编码方案指出,通道编码以2个“半比特”模式将每个原始比特拆分为原始比特时钟速率的两倍。 例如,如果原始位为0,则模式给出原始值+取反,因此0-1,如果源流的位值为1,则模式为'1-0',依此类推。

我当时正在考虑使用双沿触发来使输出流的频率加倍。 因此,在上升沿,编码器输出给出第一个 semi-bit 值,在下降沿,编码器输出反相的半位以完成模式。

请参见下面有关此格式的官方编码方案的图片。

我不确定代码是否正确,即使有可能这样做也是可以的。

不幸的是,我缺乏有关如何模拟这一点的知识。 任何帮助,建议,不胜感激。 我的下面的代码...

library ieee;
use ieee.std_logic_1164.all;

entity ENCODER1 is 
PORT (
    clk_in : in std_logic;
    data_l : in std_logic;
    data_r : in std_logic;
    out_l : out std_logic;
    out_r : out std_logic
    );
 end entity ENCODER1;


architecture rtl of ENCODER1 is 
    signal q0 : std_logic;      --output left
    signal q1 : std_logic;      --output right
    signal d0, d1,clk : std_logic ;

begin
p0: process (d0, d1, clk) is
 begin
 if (clk'EVENT and clk ='1')  then  --detect source data @ rising edge
    q0 <= d0;
    q1 <= d1;
if (clk'EVENT and clk ='0')  then
   q0 <= not d0;
   q1 <= not d1;
  end if;
  end if;
 end process p0;
end architecture rtl;

sdif encoding

1 个答案:

答案 0 :(得分:0)

您无法合成两个边缘事件。

一种解决方案是使用多路复用器,并在时钟中选择多路复用器输入:

deleteRecipe(index) {
   const recipes = { ...this.state.recipes };
   delete recipes[index];
   this.setState({ recipes: recipes });
 }

由于您一直想反转信号,因此您也可以将时钟与异或门配合使用:

out <= d0 when clk else not d0;

请注意,众所周知,某些FPGA在使用带有逻辑的时钟方面表现不佳。时钟必须经过专门布线,并且可能会大大增加时滞。

如果信号直接进入输出端口,制造商建议您使用特殊的DDR I / O端口。对于Xilinx,搜索您正在使用的相关FPGA的ODDR I / O原语。它具有内部所有逻辑来为您完成工作。