设计思想:乘法运算本身就可以看做是一个移位相加的过程
               1 1 0 1 0     = 26
*              1 0 1 1 1    = 23                  
   -----------------------------       23*26 = 598
               1 1 0 1 0
            1 1 0 1 0
         1 1 0 1 0
      0 0 0 0 0
  1 1  0 1 0
----------------------------
10 0 1  0 1 0 1 1 0        = 598

核心是这个操作
                   result_reg <= {  {   ( 16 - clock_counter ){1'd0}},                         // 31 - (clock_counter+14) -1
                                             {   result_reg[clock_counter+14 : clock_counter-1]  +  a_reg   }, 
                                            {    result_reg[clock_counter-2 : 0]}
                                         };
因为clock_counter <2 的时候,拼接操作 result_reg [clock_counter-2 : 0] 要成立
       clock_counter>16 的时候,拼接操作{   ( 16 - clock_counter ){1'd0}} 要成立,(中间的那一部分相加是17bit,第31bit不应该补零)
所以要将他们单独拿出来讨论。

就以上思想进行设计,悲剧发生了

 //date :2013/6/16
//designer :pengxiaoen
//function : unsigned 16 bit multiplication module mul16 (
clock,reset,
a_in,b_in,
status_mul16,
result_mul16
); input clock,reset;
input [:] a_in ,b_in;
output reg status_mul16;
output [:]result_mul16; reg [:] clock_counter;
//--------------------------------------------
always @ (posedge clock or negedge reset)
if (!reset)
clock_counter <= 'd0;
else if(clock_counter == 'd17)
clock_counter <= 'd0;
else
clock_counter <= clock_counter + ; //-----------------------------------------------
always @ (posedge clock or negedge reset)
if(!reset)
status_mul16 <= 'd0;
else if (clock_counter == 'd17)
status_mul16 <= 'd1;
else status_mul16 <= 'd0; reg [:] result_reg;
reg [:] a_reg,b_reg;
//------------------------------------------------
always @ (posedge clock or negedge reset)
if (!reset)
begin
a_reg <= 'd0;
b_reg <= 'd0;
result_reg <= 'd0;
end
else if (clock_counter == 'd0)
begin
a_reg <= a_in;
b_reg <= b_in;
end
else if ((clock_counter >= 'd1) && (clock_counter <= 5'd16))
begin
if(b_reg [clock_counter -])
if(clock_counter == 'd1)
result_reg <= result_reg + a_reg;
else if ((clock_counter >= 'd2) & (clock_counter <= 5'd15))
result_reg <= {{( - clock_counter ){'d0}}, // 31 - (clock_counter+14) -1
{result_reg[clock_counter+ : clock_counter-] + a_reg},
{result_reg[clock_counter- : ]}
};
else if(clock_counter == 'd16)
result_reg <= {result_reg[:] + a_reg, result_reg[:]};
else result_reg <= result_reg << ;
end assign result_mul16 = result_reg; endmodule

编译产生的结果是:

因为错误提示是因为这个{ } 内部只能是常数,这个是因为语法约束导致的设计失败,那么我很想知道如果我采用门级建模是不是就避开了这个语法约束而实现呢?,但是门级建模,哎,头痛并且浩大的工作量啊。现在懒,不想搞门级建模
修正中..................

 //date :2013/6/17
//designer :pengxiaoen
//function : unsigned 16 bit multiplication module mul16 (
clock,reset,
a_in,b_in,
data_in_en, //1 :data input enable 0:data input unenable
status_mul16, //1 :finish. 0:calculating
result_mul16
); input clock,reset;
input [:] a_in ,b_in;
output reg data_in_en;
output reg status_mul16;
output [:]result_mul16; reg [:] clock_counter;
//--------------------------------------------
always @ (posedge clock or negedge reset)
if (!reset)
clock_counter <= 'd0;
else if(clock_counter >= 'd17)
clock_counter <= 'd0;
else
clock_counter <= clock_counter + ; //-----------------------------------------------
always @ (posedge clock or negedge reset)
if(!reset)
begin
status_mul16 <= 'd0;
data_in_en <= 'd0;
end else case (clock_counter)
: data_in_en <= 'd1;
: status_mul16 <= 'd1;
default : begin
data_in_en<= 'd0;
status_mul16 <= 'd0;
end
endcase reg [:] result_reg;
reg [:] a_reg,b_reg;
//------------------------------------------------
always @ (posedge clock or negedge reset)
if (!reset)
begin
a_reg <= 'd0;
b_reg <= 'd0;
result_reg <= 'd0;
end
else if (clock_counter == 'd0)
begin
a_reg <= a_in;
b_reg <= b_in;
end
else if ((clock_counter >= 'd1) && (clock_counter <= 5'd15))
begin
if(b_reg[clock_counter -])
result_reg <= {'b0,
result_reg [:] + a_reg,
result_reg [:]
};
else result_reg <= result_reg >> ;
end
else if ((b_reg[]) && (clock_counter == 'd16))
result_reg [: ] <= {result_reg [: ] + a_reg}; assign result_mul16 = result_reg; endmodule

计算精华部分

         else  if ((clock_counter >= 'd1) && (clock_counter <= 5'd15))
begin
if(b_reg[clock_counter -])
result_reg <= {'b0,
result_reg [:] + a_reg,
result_reg [:]
};
else result_reg <= result_reg >> ;
end
else if ((b_reg[]) && (clock_counter == 'd16))
result_reg [: ] <= {result_reg [: ] + a_reg};

先运算reg中的[30:15] 部分,相加运算之后右移。最后第一个bit不就右移到最后去了嘛,为什么我当时就一定要在低位相加呢,不能倒过来呢,嘿嘿。自己愚钝了。

如果b_reg的当前bit是0 只需要右移
最后一个bit不需要移动,直接加到最高的 [31 :16 ] 就可以了。

mul16的更多相关文章

随机推荐

  1. C语言(1)--准备

    经过很长一段时间的准备,终于重新弄懂了一些C语言的问题,再次熟悉了C语言的大致应用,对此略有体会,在此以博客记录于此! 准备工作: 运行平台:Linux 编辑工具:vim (还可以使用emac,ged ...

  2. 【转】使用Boost Graph library(二)

    原文转自:http://shanzhizi.blog.51cto.com/5066308/942972 让我们从一个新的图的开始,定义一些属性,然后加入一些带属性的顶点和边.我们将给出所有的代码,这样 ...

  3. 射频识别技术漫谈(21)——RC系列射频芯片的天线设计

    个人感觉使用RC系列射频芯片开发卡片读写器,主要的关键点有两个,分别涉及硬件和软件.软件上的关键是如何正确设置RC系列射频芯片内部的64个寄存器,硬件上的关键则是RC系列射频芯片的天线设计.天线提供了 ...

  4. 网站流量统计系统 phpMyVisites

    phpMyVisites是一个网站流量统计系统,它能够提供非常详细的统计报告和高级图形报表.phpMyVisites不是一个Apache log分析工具,它建有自己的log.它的特点包括: 安装部署: ...

  5. 如何使用 Barracuda 防火墙设置/保护 Azure 应用程序

     如果某企业在 Windows Azure 上托管某个应用程序,该应用程序会在某个特定时间暴露到 Internet,以用于商业用途.公共 Internet 带来 客户的同时也带来了攻击者. Tim ...

  6. HDU 4705 Y

    Y Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Total Submis ...

  7. IPv4头部结构具体解释

    IPv4头部结构具体解释 下面为书中原文摘录: $(function () { $('pre.prettyprint code').each(function () { var lines = $(t ...

  8. 使用jsonEditor打造一个复杂json编辑器

    最近研究一个web版的json编辑器,在github中搜索,发现了这个利器. https://github.com/jdorn/json-editor 几经研究,终于把该控件的大部分功能研究透彻. 发 ...

  9. java代码获取ip地址

    public class IpTool { public static void main(String[] args) { IpTool ipTool=new IpTool(); System.ou ...

  10. Intellij IDEA 常用 设置 及 快捷键 (持续更新)

    Transparent native-to-ascii conversion以下设置都可以通过 设置中的搜索框 进行关键字搜索 0, 打开Project 设置 Command + ; 1, 打开Mod ...