这可能看起来重复了我之前的问题。但我认为不是。我正在寻找一种将十进制格式的信号转换为二进制格式的技术。
我打算使用赛灵思库中的 Simulink 模块将十进制转换为二进制格式。
因此,如果输入为 3,则预期输出应为 11(2 个时钟周期)。我正在寻找要串行获得的输出。
请建议我如何做到这一点,或者互联网上的任何指示都会有所帮助。
谢谢
这可能看起来重复了我之前的问题。但我认为不是。我正在寻找一种将十进制格式的信号转换为二进制格式的技术。
我打算使用赛灵思库中的 Simulink 模块将十进制转换为二进制格式。
因此,如果输入为 3,则预期输出应为 11(2 个时钟周期)。我正在寻找要串行获得的输出。
请建议我如何做到这一点,或者互联网上的任何指示都会有所帮助。
谢谢
使用一个带有 Matlab 变量的普通常量块,这已经给出了“普通”二进制的输出(假设你将它的属性设置为无符号并且二进制点为 0。
然后,您需要编写一个小型串行器块,该块接收该输入,将其锁存到移位寄存器中,然后每个时钟周期将寄存器移位一次,“落下”的位成为您的输出位。根据您的轮班方式,您可以将其设置为 MSB 优先,LSB 优先。
您必须在每个寄存器之前用普通寄存器和一个多路复用器构建移位寄存器,以选择您是进行并行加载还是移位。(这种东西是 VHDL 中的几行代码,但在图形中是正确的)。
如果您必须提高串行速率,则需要从更快的时钟为其计时 - 您可以使用 DCM 来生成它。
你是对的,你需要的是系统生成器的并行到串行块。
本文档中对此进行了描述:
http://www.xilinx.com/support/documentation/sw_manuals/xilinx13_1/sysgen_ref.pdf
这个块是一个速率改变块。检查这些文档中提到的并行到串行块以获取进一步的描述:
http://www.xilinx.com/support/documentation/sw_manuals/xilinx13_1/sysgen_gs.pdf
http://www.xilinx.com/support/documentation/sw_manuals/xilinx13_1/sysgen_user.pdf
Matlab 有一个dec2bin
函数可以将十进制数转换为二进制字符串。因此,例如dec2bin(3)
将返回11
.
还有一个相应的 bin2dec,它采用二进制字符串并转换为十进制数,因此bin2dec('11')
将返回3
.
如果您想将非整数十进制数转换为二进制字符串,您首先要确定要表示的最小二进制位置是什么,然后进行一些预处理和后处理,结合起来使用 dec2bin 获得您正在寻找的结果。因此,如果您想要的最小二进制位是 1/512 位(或 2^-9),那么您可以执行以下操作(其中 binPrecision 等于 1/512):
function result = myDec2Bin(decNum, binPrecision)
isNegative=(decNum < 0);
intPart=floor(abs(decNum));
binaryIntPart=dec2bin(intPart);
fracPart=abs(decNum)-intPart;
scaledFracPart=round(fracPart / binPrecision);
scaledBinRep=dec2bin(scaledFracPart);
temp=num2str(10^log2(1/binPrecision)+str2num(scaledBinRep),'%d');
result=[binaryIntPart,'.',temp(2:end)];
if isNegative
result=['-',result];
end
end
的结果myDec2Bin(0.256, 1/512)
将是0.010000011
,而 的结果myDec2Bin(-0.984, 1/512)
将是-0.111111000
。(请注意,输出是一个字符串。)