Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Verilog 乘以15的改进方法是什么?_Verilog_Vlsi - Fatal编程技术网

Verilog 乘以15的改进方法是什么?

Verilog 乘以15的改进方法是什么?,verilog,vlsi,Verilog,Vlsi,我试着实现如下乘以15 module mul15( output [10:0] result, input [3:0] a ); assign result = a*15; endmodule 但是,有没有改进的方法将a乘以15呢 我认为有两种方式 1.result=a最干净的RTL版本如您在问题中所述: module mul15( input [3:0] a output reg [7:0] result, ); always @* begin

我试着实现如下乘以15

module mul15( 
output [10:0] result, 
input [3:0] a
 ); 
assign result =   a*15;
 endmodule
但是,有没有改进的方法将a乘以15呢

我认为有两种方式


1.result=a最干净的RTL版本如您在问题中所述:

module mul15( 
  input      [3:0] a
  output reg [7:0] result, 
); 
  always @* begin
    result = a * 4'd15;
  end
endmodule
二进制中的被乘数15是4'b1111;即8+4+2+1

它可以分解为2的这些幂的和,而不是乘数。2的幂就是桶位移。这就是移位和加法乘法器的工作原理

module mul15( 
  input      [3:0] a
  output reg [7:0] result, 
); 
  always @* begin
    //        8        4        2       1 =>15
    result = (a<<3) + (a<<2) + (a<<1) + a;
  end
endmodule
模块mul15(
输入[3:0]a
输出reg[7:0]结果,
); 
总是开始
//        8        4        2       1 =>15

结果=(a最干净的RTL版本如您在问题中所述:

module mul15( 
  input      [3:0] a
  output reg [7:0] result, 
); 
  always @* begin
    result = a * 4'd15;
  end
endmodule
二进制中的被乘数15是4'b1111;即8+4+2+1

它可以被分解成2的幂和,而不是乘数。2的幂只是桶形位移。这就是移位和加法乘数的工作原理

module mul15( 
  input      [3:0] a
  output reg [7:0] result, 
); 
  always @* begin
    //        8        4        2       1 =>15
    result = (a<<3) + (a<<2) + (a<<1) + a;
  end
endmodule
模块mul15(
输入[3:0]a
输出reg[7:0]结果,
); 
总是开始
//        8        4        2       1 =>15

结果=(a总是有
a*16-a
。2的幂的静态乘法在硬件上基本上是免费的;它只是硬编码0到LSB。因此,您只需要一个11位全减法器,它是一个全加器和一些反相器

其他形式:

result = a<<4 - a;
result = {a,4'b0} - a; // unsigned full-subtractor
result = {a,4'b0} + ~a + 1'b1; // unsigned full-adder w/ carry in, 2's complement
result = {{3{a[3]}},a,4'b0} + ~{ {7{a[3]}}, a} + 1'b1; // signed full-adder w/ carry in, 2's complement

result=a总是有
a*16-a
。2的幂的静态乘法在硬件上基本上是免费的;它只是硬编码到LSB的0。所以你只需要一个11位全减法器,它是一个全加器和一些反相器

其他形式:

result = a<<4 - a;
result = {a,4'b0} - a; // unsigned full-subtractor
result = {a,4'b0} + ~a + 1'b1; // unsigned full-adder w/ carry in, 2's complement
result = {{3{a[3]}},a,4'b0} + ~{ {7{a[3]}}, a} + 1'b1; // signed full-adder w/ carry in, 2's complement


result=a你一点意义都没有;三次左移(1.)将是8的乘法;
a*15
始终是
a*16
,因此
输出的长度应该只比
a
长四位,而不是七位。@MarcusMüller谢谢,先生,我刚刚更改了it@Morgan谢谢,但你使用的是乘法器。我的方法不使用乘法器,而且速度快,功耗低。不知道你用的是什么r试图通过将
{}
与一个数字连接起来,很确定这永远不会是一个乘以任何数字的结果,除非对移位进行零填充,即乘以2的幂。为什么要向下投票?这是一个很好的问题!你没有任何意义;三次左移位(1)将是8的乘法;
a*15
始终是
a*16
,因此
输出的长度应该只比
a
长四位,而不是七位。@MarcusMüller谢谢,先生,我刚刚更改了it@Morgan谢谢,但你使用的是乘法器。我的方法不使用乘法器,而且速度快,功耗低。不知道你用的是什么r试图通过连接
{}
对于一个数字,很确定这永远不会是一个乘以任何数字的结果,除非你只是用零填充一个移位,即乘以2的幂。为什么要否决投票?这是一个很好的问题!谢谢先生,我对你的答案有一些疑问。第一个答案的来源是加法器3移位器3使用它。第二个是减法器1,移位器3使用它ter 1.那么哪一个使用的资源更少?正如我所知,桶形移位器在计时方面的性能不好。减法器是一个输入反转的加法器,进位绑定高(创建两个补码反转)反相器比缓冲器便宜。所以减法器通常更便宜。桶形移位器通常不受时间和面积的限制,它只是一种巧妙的组合。@kaji请记住,合成工具可以根据它想要的任何东西构建逻辑,只要功能正确。有时RTL有助于引导它走上更好的道路。所有这些都应该会给你带来好处同样的事情。谢谢先生,我对你的答案有一些疑问。第一个答案的资源是加法器3,移位器3使用它。第二个是减法器1,移位器1。那么哪一个资源使用较少?正如我所知,桶形移位器在计时方面性能不好。减法器是一个输入反转的加法器,进位绑定高(创建两个补码反转)反相器比缓冲器便宜。所以减法器通常更便宜。桶形移位器通常不受时间和面积的限制,它只是一种巧妙的组合。@kaji请记住,合成工具可以根据它想要的任何东西构建逻辑,只要功能正确。有时RTL有助于引导它走上更好的道路。所有这些都应该会给你带来好处同样的事情。我不确定,如果我必须用你的代码进行合成,哪一个资源使用较少。@kaji你应该全部尝试!一旦你的合成设置完成,只需更换实现。谢谢你Greg,先生。我可以得出结论a@kaji:Morgan是对的,让你的合成器来处理这个问题。基本的数字操作已经自动化了自始至终都进行了逻辑优化。事实上,使用
a*15
很可能比任何显式位推送都快,因为不管怎样——你可能有免费的DSP片。我不确定,如果我必须用你的代码进行合成,哪一个使用的资源更少呢。@kaji你应该全部尝试一下!一旦你的合成设置完成,就换掉它实施。谢谢你,格雷格,先生。我可以得出结论a@kaji:Morgan是对的,就让你的sythesizer来处理这个问题吧。从永远以来,基本的数值运算都是自动优化的。事实上,使用
a*15
很有可能比任何显式位推送更快,因为不管怎样——你可能有免费的DSP sl冰。