如何在VHDL中适当地乘法std_逻辑:向量?

如何在VHDL中适当地乘法std_逻辑:向量?,vhdl,quartus,intel-fpga,Vhdl,Quartus,Intel Fpga,所以我试着做一个模块来操纵伺服电机sg90。 但我对架构的一部分有问题;该模块有一个6位的输入,控制伺服电机的位置,但用16位矢量控制电机。我的方法是将一个6位的变量相乘(该变量的值与条目的值相同),然后将其放在16位输出向量上,如下所示: case position is when "000000" => value:= X"0ccc"; when "11111

所以我试着做一个模块来操纵伺服电机sg90。 但我对架构的一部分有问题;该模块有一个6位的输入,控制伺服电机的位置,但用16位矢量控制电机。我的方法是将一个6位的变量相乘(该变量的值与条目的值相同),然后将其放在16位输出向量上,如下所示:

case position is
                    when "000000" =>
                        value:= X"0ccc";
                    when "111111" =>
                        value := X"1999";
                    when others =>
                        value:=std_logic_vector((control*52)+3276);

                end case; 
这应该做的是,例如,如果我输入“000000”,输出将是“0ccc”,将伺服电机置于其启动位置。“111111”将是“1999”或结束位置结束之间的所有其他内容都应通过该表达式来考虑。但是,我得到以下错误:
错误(10327):ServomotorF处的VHDL错误。vhd(46):无法确定运算符“*”的定义--找到0个可能的定义

如果有帮助的话,我正在使用的库是

use ieee.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use IEEE.std_logic_unsigned.all;
我也尝试过使用数字标准,但这只会给我更多的错误。 我能想到的唯一其他解决方案是使用一个巨大的案例结构逐个进行


如果我使用“unsigned”,我会得到unsigned的多个定义的错误。

它的数学很简单:


value\u out它的数学原理很简单:


value\u out不显示完整代码。无法查看控件的类型。std逻辑算术和std逻辑无符号也不是标准的vhdl库。数字_std将是选择的标准库。加上vhdl2008中的数字\u std\u unsigned允许对std逻辑向量进行算术运算。无名称unsigned可见的问题是由于多个类型声明可能从多个use子句中可见。IEEE标准1076-2008 12.4使用条款第8 c段)。可以使用IEEE或Synopsys算术软件包,但不能同时使用两者。提供一个.64位的16位值并不是一个巨大的大小写结构。在不知道
位置类型的情况下
也可以是查找表中的常量数组
type sixto16是无符号(15到0)的数组(0到63);常数cvt6_16:6到16:=(x“CCC,…x”1999)和值:=cvt6_16(到_整数(位置));常量的聚合值表达式可以在不编写case语句替代项的情况下使用。您不会显示完整代码。无法查看控件的类型。std逻辑算术和std逻辑无符号也不是标准的vhdl库。数字_std将是选择的标准库。加上vhdl2008中的数字\u std\u unsigned允许对std逻辑向量进行算术运算。无名称unsigned可见的问题是由于多个类型声明可能从多个use子句中可见。IEEE标准1076-2008 12.4使用条款第8 c段)。可以使用IEEE或Synopsys算术软件包,但不能同时使用两者。提供一个.64位的16位值并不是一个巨大的大小写结构。在不知道
位置类型的情况下
也可以是查找表中的常量数组
type sixto16是无符号(15到0)的数组(0到63);常数cvt6_16:6到16:=(x“CCC,…x”1999)和值:=cvt6_16(到_整数(位置));常量的聚合值表达式可以不用写case语句替代。不是我的下一票,但是除法(即使是常数)可能会很昂贵…是的,是的,我综合了它。但它“简单”而且确实有效。我更新了它,用一个恒定的步长替换了除法器。这也不是我的反对票,但你的算术可以从合理化中受益。OP的限值为3276(1毫秒周期,x“0cc”)和6553(2毫秒周期,x“1919,适合14位64 KHz时钟)。测试台的最高值为7700(大于最大值)。金属齿轮伺服的位置精度为0.5 us。推过2 ms范围后,将得到映射到最大位置的值范围。64 KHz时钟将支持优于9位的位置精度,将其降至6,然后丢弃一些值。请注意,OP使用52的整数乘法器,然后将最后一个位置全部篡改在案例陈述中达到x“1919”的方式。LUT会提供更好的准确性,并且在不捏造的情况下达到最终值。(我真的很好奇你是如何达到最终值的,即使它是错误的。)不是我的否决票,而是除法(即使是常数)可能很贵……是的,是的,我合成了它。但它很简单,而且确实有效。我用恒定的步长替换了除法器,对它进行了更新。这也不是我的反对票,但你的算术可以从合理化中受益。OP的限制是3276(1毫秒周期,x“0cc”)和6553(2毫秒周期,x”1919,适合14位和64 KHz时钟)。您的测试台达到7700的高点(大于最大值)。金属齿轮伺服的位置精度为0.5 us。推过2毫秒的范围,可以得到映射到最大位置的值范围。64 KHz时钟将支持优于9位的位置精度,将其降至6,然后丢弃一些值。请注意,OP使用52的整数乘法器,然后在case语句中将最后一个位置一直篡改到x“1919”。LUT将提供更好的准确性,并且无需捏造即可达到最终值。(我真的很好奇你是如何得出最终价值的,即使它是错的。)