我是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;
答案 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原语。它具有内部所有逻辑来为您完成工作。