根据我的阅读,我制作了一个FM声音合成算法.我不确定我是否做得对.在创建软件合成器时,使用函数生成振荡器,并且可以使用调制器来模拟该振荡器的频率.我不知道FM合成是否只适用于调制正弦波?
该算法采用仪器波函数和调制器指数和频率调制器的比率.对于每个音符,它采用频率并存储载波和调制器振荡器的相位值.调制器始终使用正弦波.
这是伪代码中的算法:
function ProduceSample(instrument, notes_playing)
for each note in notes_playing
if note.isPlaying()
# Calculate signal
if instrument.FMIndex != 0 # Apply FM
FMFrequency = note.frequency*instrument.FMRatio; # FM frequency is factor of note frequency.
note.FMPhase = note.FMPhase + FMFrequency / kGraphSampleRate # Phase of modulator.
frequencyDeviation = sin(note.FMPhase * PI)*instrument.FMIndex*FMFrequency # Frequency deviation. Max deviation is a factor of the FM frequency. Modulation is done by a sine wave.
note.phase = note.phase + (note.frequency + frequencyDeviation) / kGraphSampleRate # Adjust …Run Code Online (Sandbox Code Playgroud) 我开始编写一个具有特殊特性的软合成器:振荡器将有一个"连续波形"旋钮,允许用户以连续的方式选择正弦波,方波和锯齿波.也就是说,如果旋钮一直向左,输出将是一个正弦波,如果它在中间它将是一个锯齿波,如果它一直向右,它将是一个方波然后中间位置将输出经典波的"插值"版本的波. - 可以改变旋钮位置和波浪类型,但需要连续改变波形的方法 -
我想到了几种实现振荡器的方法:
提出一个功能,它采用旋钮位置并计算实际信号的频谱(幅度和频率阵列),然后使用一串正弦函数和一个和块来实现输出信号.
类似于1.但应用反向傅立叶变换而不是正弦和求和(好的,此时我不确定它们是否实际上是相同的东西.)
为每个可能的旋钮位置生成波形表,并使用波表合成技术生成输出信号.
从2个锯齿波开始(它们包含偶数和奇数谐波),反转一个并求它们,并用旋钮控制每个齿的振幅.波形不会
我有几个问题:
答:我读过1号技术是处理器密集型的,并不是真的可行.这适用于ARM处理器,例如iPad上的处理器吗?
B.无论我最终选择什么技术,只需将低通滤波器连接到振荡器的输出就可以解决混叠问题?
C.关于如何实施这种振荡器的任何其他建议?
D.关于使用哪个C++工具包的任何建议?我一直在看CCRMA的STK,但我不知道是否还有其他更合适的库.
祝我好运!;)
编辑:昨晚有人指我吵闹.贝塞尔曲线是另一个需要考虑的选择.
我正在使用设计编译器来合成我的设计,并与另一个设计进行比较(作为我报告中的评估).Synopsys的工具可以轻松地通过命令报告该区域,但在所有论文中,我都读到了关于门数的关注.
我的测验是什么是门数以及如何计算它?
我用谷歌搜索并听说门数计算为total_area/NAND2_area.那么,这是真的吗?
感谢您的阅读,请不要怪我愚蠢的问题:(.
说下面的代码部分(同一块):
A <= 1
A <= 2
Run Code Online (Sandbox Code Playgroud)
变量A总是被分配2吗?或者是否会有竞争条件,将分配1或2?
我对非阻塞分配的理解是,在未来的时间由硬件来分配变量A,因此它可能是随机的结果.但是,这不直观.模拟显示2总是被分配,但我想知道这是否肯定是硬件合成的情况.
我已经尝试以低毫秒速率使用Console.Beep()两个"同时"播放两个频率,但是蜂鸣声之间的暂停会使它失效.我已经尝试过研究但是我什么也没找到,除了我正在寻找的DirectSound之外,我不知道从哪里开始.我所需要的只是制作一个程序,用一个扬声器同时播放两个或多个频率,在C#中.
谢谢.
是否有任何可综合的方法将接口传递给函数或任务?我的用例如下:我有一个包含多个函数的包(虽然我可以将它们转换为任务,如果这有帮助:)),所有这些都可能在模块中使用,可能需要访问模块的端口.现在,通常我只是将所有端口分组interface,将其添加到模块,然后将其传递virtual给函数.但是,我的综合工具手册提到virtual不支持.
我错过了什么吗?必须有一种方法为合成任务提供端口,类似于VHDL的signal参数?
一些示例代码:
module mymod (
input logic clk,
input logic rst,
input uint16_t adr,
input bit cyc,
input uint32_t dat_m,
input bit stb,
input bit we,
output bit ack,
output uint32_t dat_s
);
always_comb begin
mypack::do_something(a, b, c, adr, cyc, dat_m, stb, we, ack, dat_s);
endmodule
Run Code Online (Sandbox Code Playgroud)
理想情况下,任务mypack::do_something可以将端口用作端口,即等待它们的更改,向它们写入值等; 基本上,你通过传递它们作为signal参数(而不是variable或constant参数)在VHDL中实现的相同.
从标准的角度来看,从一个接口读取参数是否合法,我感到有点困惑.
像这样
interface foo_if #(parameter BAR=5)();
...
logic [BAR-1:0] data;
modport slave(input data, ...);
endinterface
module foobar(foo_if.slave s);
...
logic [s.BAR-1:0] bar;
logic [$bits(s.data)-1:0] m_data;
...
endmodule
Run Code Online (Sandbox Code Playgroud)
我有一个问题,主要的综合工具供应商甚至无法处理这个问题.并且他们在帮助消息中明确告诉您,不允许将$ bits()与接口成员一起使用.
然而,来自其他供应商的仿真工具完全像我拥有的另一个综合工具一样处理这个问
然而,在S.Sherherland等人的SystemVerilog for Design中.它说:
由于在详细说明期间可能尚未完全解析设计层次结构,因此为参数,specparam或localparam常量指定从设计层次结构中的其他位置派生的值是非法的.
但是,如果不允许我使用接口中的参数,它实际上削弱了接口的有用性.
另一方面,SystemVerilog 1800-2012标准规定:
25.10访问界面对象
无论接口是通过端口连接还是通过虚拟接口访问,并且无论该接口中是否存在任何声明的modport,都可以通过分层名称引用访问接口中声明的对象.modport可用于通过显式列出modport中的可访问对象来限制对通过端口连接或虚拟接口引用的接口中声明的对象的访问.但是,不允许在modport中列出的对象仍然可以访问.
我在使用 Lattice ICE5LP4K 的内部振荡器时遇到问题。根据 iCE40 振荡器使用指南附录,verilog 中的代码应如下所示:
\n\n SB_HFOSC OSCInst0 (\n .CLKHF_EN(ENCLKHF),\n .CLKHF_PU(CLKHF_POWERUP),\n .CLKHF(CLKHF)\n ) /* synthesis ROUTE_THROUGH_FABRIC= [0|1] */;\n Defparam OSCInst0.CLKHF_DIV = 2\xe2\x80\x99b00;\nRun Code Online (Sandbox Code Playgroud)\n\n我正在使用的代码库采用 VHDL 格式,因此我已将该组件添加到我的架构中,如下所示:
\n\n SB_HFOSC : OscInst0\n port map(\n CLKHF_EN => RST_SYS_N;\n CLKHF_PU => RST_SYS_N;\n CLKHF => HFOSC_CLK_48MHZ\n );\nRun Code Online (Sandbox Code Playgroud)\n\n当我尝试此操作时,收到与组件 SB_HFOSC 未定义相关的错误。然后我找到了这篇文章:lattice FPGA内部振荡器模拟问题,其中提到将lattice组件添加到项目文件中。
\n\n我在项目中添加了一个新文件,其中包含 sb_ice_syn_vital.vhd 中的以下代码:
\n\n-----------------------------------------------------\n--- SB_HFOSC -------\n------------------------------------------------\nlibrary IEEE;\nuse ieee.std_logic_1164.all;\nuse ieee.std_logic_arith.all;\nuse ieee.std_logic_unsigned.all;\nuse IEEE.Vital_Primitives.all;\nuse IEEE.VITAL_Timing.all;\nentity SB_HFOSC is \n generic( CLKHF_DIV: string:="0b00";\n Xon : boolean := true;\n MsgOn : boolean := …Run Code Online (Sandbox Code Playgroud) 我已经完成了一个制作物理逻辑门的项目,现在正在寻找一种方法将任意程序转换为一系列逻辑门,以便我可以使用它们。
我需要一个程序,可以将某些任意函数(例如 f= x^2 -1)直接带入某些逻辑门系列。这已经存在了吗?
我找到了Verilog和其他几个开源选项,但它们似乎没有输出电路图。还有 Quartus II 和其他程序可以将VHDL代码转换为原理图。
我最好想要能直接将 Python/C++ 编译为逻辑门原理图的东西 - 但实际上任何语言都可以。
谢谢。
编辑:我的意思是物理门 - 他们使用滚珠轴承!
我拥有所有 1 位输入/1 位输出门和所有 2 位输入/1 位输出门。由此我还可以构造一个 MAJ 门来进行纠错。
我正在创建一个 VHDL 项目(Xilinx ISE for Spartan-6),需要在定点/浮点中使用十进制“实型”数字(我希望定点就足够了)。
作为 VHDL 的新手,我发现非常困难的方法是real综合不支持非常量类型,所以我开始寻找 IP 核或库来解决这个问题。
到目前为止,我找到了 3 个选项;
1) Xilinx 提供的浮点 IP 核
2) David Bishop 编写的可下载的“ieee_proposed”库在这里找到
3) 在尝试解决如何“创建”一个包含 David Bishops 文件的新库的过程中花费了大量时间后,我快速浏览了默认IEEE库并看到它包含ieee.fixed_generic_pkg和ieee.fixed_pkg包。
我的问题是 - 在这两个库中 - 使用哪一个是明智的?一个适合合成而一个不适合,还是一个比另一个更老?然后如果提供了浮点,那么Xilinx提供的浮点IP核有没有真正的指向?
我已经浏览了许多试图添加库的人的问题ieee_proposed,但似乎没有人提到它们似乎已经存在于现有的IEEE.
非常感谢您的帮助!
============更新(基本上是我自己努力解决的)==================
我实际上无法使用ieee.fixed_pkg- 并且尝试这样做会给我错误Cannot find <fixed_pkg> in library <ieee>。
在 C:\Xilinx\14.7\ISE_DS\ISE\vhdl\xst\nt 找到 ieee 库后,我发现它fixed_pkg实际上位于 ieee_proposed。但是,这仍然会引发相同的错误!