在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 12814|回复: 53

[求助] [verilog] Verilog语言的编写

[复制链接]
发表于 2016-4-7 10:42:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
C语言中的多重for循环该怎么去写啊。



    for(i=1;i<15;i++)
      {

        for(j=1;j<15;j++)
         {
            avg=0;


            temp=0;

            for(k=-1;k<=1;k++)
               {


                  for(l=-1;l<=1;l++)
                      {


                         avg+=(double)pd[i+k][j+l];


                       }


                }
         avg=avg/((double)sn*sn);
            for(k=-1;k<=1;k++)
               {


                  for(l=-1;l<=1;l++)
                      {


                         temp+=((double)pd[i+k][j+l]-avg)*((double)pd[i+k][j+l]-avg);


                       }


                }  
各位高手提点意见或者帮忙写一下。谢谢。
发表于 2016-4-7 10:58:04 | 显示全部楼层
在可综合的verilog中,RTL设计一般不推荐用for语句,一般用在testbench中。
可以用if...else...语句去替换
发表于 2016-4-8 14:42:10 | 显示全部楼层
回复 1# 甲壳虫


   理解代码的功能才是最重要的,你应看到的是累加或者求均值或者求方差,而不是多重循环。然后再把同样的逻辑转换到verilog。
发表于 2016-4-8 16:13:28 | 显示全部楼层
只是简单的for语句由于其在部分情况下是不可综合的,所以没人会推荐在综合代码中使用for的。

具体的软件循环的硬件化,应该分析代码的真正意图,了解其要完成的功能,然后使用“在某根控制信号有效时,连续工作,否则停止”类型的电路来实现。
 楼主| 发表于 2016-4-8 16:13:29 | 显示全部楼层
回复 3# harry_hust
代码的意思我懂,就是不知道该如何去转换,无从下手啊。
 楼主| 发表于 2016-4-8 16:15:18 | 显示全部楼层
回复 4# zsftm 我也知道for语句是不可综合的,能不能简单的举个例子。谢谢
发表于 2016-4-8 20:47:08 | 显示全部楼层
for循环,如果循环范围是常量,可综合。数组可综合。
但浮点类型不可综合。乘除法,特别是除法一般也不推荐使用,即使可综合,逻辑级数也是非常大的。
如果把上面的代码放在一拍之内完成,恐怕得到频率会非常低。
发表于 2016-4-9 11:10:33 | 显示全部楼层





  1. module loop(clk);
  2.         input clk;
  3.        
  4.         integer i, j, k, l;
  5.         integer avg, temp;
  6.         reg loop1_en, loop2_en, loop3_en;
  7.        
  8.         initial
  9.                 begin
  10.                         i = 1;
  11.                         j = 1;
  12.                         k = -1;
  13.                         l = -1;
  14.                         avg = 0;
  15.                         temp = 0;
  16.                         loop1_en = 0;
  17.                         loop2_en = 0;
  18.                         loop3_en = 1;
  19.                 end

  20. task task1;
  21.         if (k <= 1)
  22.                 begin
  23.                         if (l <= 1)
  24.                                 begin
  25.                                         avg = avg + 1;
  26.                                         l = l + 1;
  27.                                 end
  28.                         else
  29.                                 begin
  30.                                         k = k + 1;
  31.                                         l = -1;
  32.                                 end
  33.                 end
  34.         else
  35.                 begin
  36.                         loop1_en = 0;
  37.                         loop2_en = 1;
  38.                         k = -1;
  39.                         l = -1;
  40.                         avg = avg >> 2;
  41.                         $display("%d", avg);
  42.                 end
  43. endtask

  44. task task2;
  45.         if (k <= 1)
  46.                 begin
  47.                         if (l <= 1)
  48.                                 begin
  49.                                         temp =  temp + avg;
  50.                                         l = l + 1;
  51.                                 end
  52.                         else
  53.                                 begin
  54.                                         k = k + 1;
  55.                                         l = -1;
  56.                                 end
  57.                 end
  58.         else
  59.                 begin
  60.                         k = -1;
  61.                         l = -1;
  62.                         loop2_en = 0;
  63.                         loop3_en = 1;
  64.                         $display("%d", temp);
  65.                         avg = 0;
  66.                         temp = 0;
  67.                 end
  68. endtask

  69. task task3;
  70.         if (i < 3)
  71.                 begin
  72.                         if (j < 3)
  73.                                 begin
  74.                                         j = j + 1;
  75.                                         loop3_en = 0;
  76.                                         loop1_en = 1;
  77.                                 end
  78.                         else
  79.                                 begin
  80.                                         $display("biggest loop");
  81.                                         i = i + 1;
  82.                                         j = 1;
  83.                                 end
  84.                 end
  85.         else
  86.                 begin
  87.                         loop1_en = 0;
  88.                         //$display ("finished");
  89.                 end
  90. endtask               

  91.         always @ (posedge clk)
  92.                         begin
  93.                                 if (loop1_en)
  94.                                         begin
  95.                                                 task1;
  96.                                         end
  97.                                 else if (loop2_en)
  98.                                         begin
  99.                                                 task2;
  100.                                         end
  101.                                 else if (loop3_en)
  102.                                         begin
  103.                                                 task3;
  104.                                         end               
  105.                                 else       
  106.                                         begin
  107.                                                 $display("invalid case");
  108.                                         end
  109.                         end
  110.                        
  111. endmodule



复制代码
发表于 2016-4-9 11:11:48 | 显示全部楼层
if else 代码来了,跑过tb,循环跑起来是对的。
发表于 2016-4-9 11:33:45 | 显示全部楼层
軟體與硬體的思考邏輯不同..
所以建議先把演算法用硬體的方式思考一遍
再用RTL寫出...
這樣會比較好
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条


小黑屋| 手机版| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-11-25 19:21 , Processed in 0.021712 second(s), 7 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表