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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
楼主: 甲壳虫

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

[复制链接]
 楼主| 发表于 2016-4-25 20:34:34 | 显示全部楼层
回复 30# sun30411 我试着写了一下不知道怎么样,希望指点一下。非常感谢。




  1. always @(posedge clk or negedge rst_n)
  2.    begin
  3.      if(!rst_n)
  4.          begin
  5.           k<=0;
  6.           l<=0;
  7.           avg_sum<=0;
  8.          end
  9.        else
  10.       
  11.          if(k<=1)
  12.            begin
  13.              if(l<=1)
  14.                 begin
  15.                   pd_k<=pd[k][l];
  16.                   avg_sum<=avg_sum+pg_k;
  17.                   l<=l+2'b1;
  18.                 end
  19.              else
  20.                 begin              
  21.                    k<=k+2'b1;
  22.                    l<=0;
  23.                 end
  24. end


复制代码

发表于 2016-4-27 09:04:35 | 显示全部楼层
回复 30# sun30411
谢谢您的讲解,非常受教。 的确以前只考虑功能实现,而没考虑可综合与否。
我又重新写了一遍,经综合和简单波形仿真是可以的。麻烦指教。



  1. module loop(
  2.                                 input clk,
  3.                                 output reg [7:0] i,
  4.                                 output reg [7:0] j,
  5.                                 output reg [7:0] k,
  6.                                 output reg [7:0] l,
  7.                                 output reg second_round,
  8.                                 output reg[15:0] avg,
  9.                                 output reg[15:0] temp);
  10.                
  11.         initial
  12.                 begin
  13.                         i = 0;
  14.                         j = 0;
  15.                         k = 0;
  16.                         l = 0;
  17.                         avg = 0;
  18.                         temp = 0;
  19.                         second_round = 1'b0;
  20.                 end       

  21.         always @ (posedge clk)
  22.                         begin
  23.                                 l <= (l == 2) ? 0 : (l + 1);
  24.                                 k <= (k == 2 && l == 2) ? 0 : (l == 2) ? (k + 1) : k;
  25.                                 j <= (j == 13) ? 0 : (k == 2 && second_round == 1'b1) ? (j + 1): j;
  26.                                 i <= (i == 14 && j == 14) ? 0 : (j == 14) ? (i + 1): i;
  27.                                
  28.                                 second_round <= (k == 2 && l == 2) ? (~second_round) : second_round;
  29.                                 avg <= (k == 2 && l == 2 && second_round == 1'b1) ? 0 : (second_round == 1'b0) ? avg + 1: avg;
  30.                                 temp <= (k == 2 && l == 2) ? 0 : (second_round == 1'b1) ? (temp+avg) : 0;                               
  31.                         end       
  32.                                                                        
  33. endmodule


复制代码
发表于 2016-4-27 09:11:58 | 显示全部楼层
为简单起见及着重逻辑原理实现,for循环code被简化成如下

for (i = 0; i < 14; i++)
for (j = 0; j < 14; j++)
{
  avg = 0;
  temp = 0;

  for (k = 0; k <=2; k ++)
  for (l = 0; l <=2; l++)
   {
      avg = avg + 1;
   }
   for (k = 0; k <=2; k++)
   for (l = 0; l <=2; l++)
   {
      tem = temp + avg;
    }
}
发表于 2016-4-27 09:13:55 | 显示全部楼层
另外,之所以把i,j,k,l等都放到模块端口,是为了仿真查看波形方便而已。
 楼主| 发表于 2016-4-27 10:48:22 | 显示全部楼层
回复 34# lt谢谢 我想问一下 你有没有256x8bit 的ram程序啊 。
发表于 2016-4-27 17:25:19 | 显示全部楼层
回复 2# 天怒法师
发表于 2016-4-29 22:50:38 | 显示全部楼层
回复 35# 甲壳虫

二维数组要转换成一维数组 reg [7:0] pd[255:0]

然后在initial里面赋值,有规律的话可以for循环;没规律的话就笨办法。

我自己试了一下,是综合成ram块的。

仅供参考,欢迎指教。
 楼主| 发表于 2016-5-1 18:32:08 | 显示全部楼层
回复 37# ltshan
谢谢!我写了  一个RAM ,该怎样进行调用里面的数据去完成下面的操作啊,试着写了一下,感觉不太对。
for (i = 0; i < 14; i++)
for (j = 0; j < 14; j++)
{
  avg = 0;
  temp = 0;

  for (k = 0; k <=2; k ++)
  for (l = 0; l <=2; l++)
   {
      avg = avg + pd[][];
   }
   for (k = 0; k <=2; k++)
   for (l = 0; l <=2; l++)
   {
      tem = temp + avg;
    }
}
发表于 2016-5-2 21:39:22 | 显示全部楼层
回复 38# 甲壳虫 [/

你自己写的ram 端口定义都有些什么?  我来看看怎么结合到你的应用中。 说句题外话,  其实FPGA上提供了RAM IP, 直接拿来用即可。
 楼主| 发表于 2016-5-3 14:48:36 | 显示全部楼层
回复 39# ltshan
因为我是刚学FPGA,一些人建议我不要调用IP核,说那些参数设置复杂。这个是我写的RAM。



  1. module RAM(clk,rst_n,pd_k);

  2. input clk,rst_n;
  3. input RD,WR,cs;
  4. input [7:0]datain;
  5. input [7:0]address;

  6. output [7:0]pd_k;

  7. reg [7:0]datain;
  8. reg  [7:0]pd_k;
  9. reg [7:0] menory[255:0];

  10. always @(posedge clk or negedge rst_n)
  11.   begin
  12.   if(!rst_n)
  13.       menory[address]<=8'b0;
  14.   else if(WR)
  15.      begin
  16.       if((cs==1)&&(RD==0))
  17.         memory[address]<=datain;
  18.      end
  19.   else if(RD)
  20.      begin
  21.        if((cs==1)&&(WR==0))
  22.          pd_k<=memory[address];         
  23.      end
  24.    end

  25. endmodule


复制代码

谢谢。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

×

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

GMT+8, 2024-5-8 10:44 , Processed in 0.033091 second(s), 6 queries , Gzip On, Redis On.

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