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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 7967|回复: 9

[求助] 【已经解决】新手Verilog代码综合之后硬件资源占用0%,求讨论解决

[复制链接]
发表于 2014-11-23 20:24:17 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 douwangdiaole 于 2014-11-25 23:24 编辑

本人一位硬件工程师,由于项目需要最近开始着手学FPGA,按照相关教程写了一个流水灯的程序,期间遇到了很多问题都慢慢的解决了,但是这次遇到了奇怪的问题不知道怎么处理。  本人将一个源码文件分成3个模块,之后设置一个top层文件挂载4个模块,编译之后报错一检查修改之后成功编译,但是综合的结果却很不可思议,硬件资源占用0%。




  1. Flow Status        Successful - Sun Nov 23 20:15:04 2014
  2. Quartus II 32-bit Version        13.1.0 Build 162 10/23/2013 SJ Web Edition
  3. Revision Name        LED_Water
  4. Top-level Entity Name        led_water
  5. Family        Cyclone IV E
  6. Device        EP4CE6E22C8
  7. Timing Models        Final
  8. Total logic elements        0 / 6,272 ( 0 % )
  9. Total combinational functions        0 / 6,272 ( 0 % )
  10. Dedicated logic registers        0 / 6,272 ( 0 % )
  11. Total registers        0
  12. Total pins        11 / 92 ( 12 % )
  13. Total virtual pins        0
  14. Total memory bits        0 / 276,480 ( 0 % )
  15. Embedded Multiplier 9-bit elements        0 / 30 ( 0 % )
  16. Total PLLs        0 / 2 ( 0 % )


复制代码




首先top文件源码:




  1. module led_water(
  2.         clock_50mhz,
  3.         reset_n,
  4.         key_s,
  5.         led
  6.         );
  7.         input    clock_50mhz;
  8.         input    reset_n;
  9.         input    key_s;
  10.         output  led;
  11.         
  12.         wire [7:0]  led;
  13.         
  14.         led_display(
  15.         .clock_50mhz      (clock_50mhz),
  16.         .led_clock           (led_clock),
  17.         .reset_n             (reset_n),
  18.                                                 
  19.         .key_s_flag        (key_s_flag),
  20.         .led                   (led)
  21.         );
  22.         key_scan(
  23.         .clock_50mhz     (clock_50mhz),
  24.         .reset_n            (reset_n),
  25.         .key_s               (key_s),
  26.                                                 
  27.         .key_s_flag       (key_s_flag)
  28.         );
  29.         sys_clock(
  30.        .clock_50mhz     (clock_50mhz),
  31.        .reset_n            (reset_n),
  32.                                                 
  33.        .led_clock         (led_clock)
  34.        );
  35. endmodule



复制代码





模块1源码:




  1. module sys_clock(
  2.         clock_50mhz,
  3.         reset_n,
  4.         led_clock
  5.         );
  6.         input     clock_50mhz;
  7.         input     reset_n;
  8.         output   led_clock;
  9.         
  10.         wire       clock_50mhz;
  11.         reg        [25:0]        led_clock;
  12.         
  13.         always @ (posedge clock_50mhz or posedge !reset_n)
  14.         begin
  15.                 if(!reset_n)
  16.                         led_clock <= 1'b0;
  17.                 else
  18.                         led_clock <= led_clock+1;
  19.         end
  20. endmodule
  21.         


复制代码




模块2源码:




  1. //定义函数
  2. module led_display(
  3.       clock_50mhz,
  4.       led_clock,
  5.       reset_n,
  6.       key_s_flag,
  7.       led
  8.       );
  9.         //out or in port                                       
  10.         input        clock_50mhz;
  11.         input        led_clock;
  12.         input        reset_n;
  13.         input        key_s_flag;
  14.         output        [7:0]          led;
  15.         //wire or register
  16.         wire                             clock_50mhz;
  17.         wire           [7:0]           led;

  18.         //define register
  19.         reg        [7:0]               led_data  =  8'b1000_0000;
  20.         
  21.         always @ (posedge clock_50mhz or posedge !reset_n)
  22.                 begin
  23.                         if(!reset_n)
  24.                                 led_data <= 1'b0;
  25.                         else if(key_s_flag)
  26.                         begin
  27.                                 led_data[0] <= led_data[7];
  28.                                 led_data[1] <= led_data[0];
  29.                                 led_data[2] <= led_data[1];
  30.                                 led_data[3] <= led_data[2];
  31.                                 led_data[4] <= led_data[3];
  32.                                 led_data[5] <= led_data[4];
  33.                                 led_data[6] <= led_data[5];
  34.                                 led_data[7] <= led_data[6];
  35.                         end
  36.                 end
  37.         assign LED = led_data;
  38. endmodule



复制代码




模块3源码:




  1. module key_scan(
  2.         clock_50mhz,
  3.         reset_n,
  4.         key_s,
  5.         key_s_flag
  6.         );
  7.         input     clock_50mhz;
  8.         input     key_s;
  9.         input     reset_n;
  10.         output   key_s_flag;
  11.         
  12.         reg        key_s_flag;
  13.         
  14.         always @ (posedge clock_50mhz or posedge !reset_n or posedge !key_s)
  15.         begin
  16.                 if(!reset_n)
  17.                         key_s_flag <= 0;
  18.                 else if(!key_s)
  19.                         key_s_flag <= 1;
  20.         end
  21. endmodule



复制代码



项目源码在附件里面,希望多多提供改进意见,谢谢
02_KEY_LED.zip (2.94 MB, 下载次数: 6 )
发表于 2014-11-24 14:40:40 | 显示全部楼层
回复 1# douwangdiaole

粗看了一下你的综合报告,你综合时没有加时序约束啊。综合器连时钟都找不到。。。
发表于 2014-11-24 14:53:34 | 显示全部楼层
管脚首先要约束上。
 楼主| 发表于 2014-11-24 20:38:37 | 显示全部楼层
回复 3# woshioc


   管脚约束是指pin planer里面定义引脚吗?那里面都定义好了
 楼主| 发表于 2014-11-24 21:02:19 | 显示全部楼层
回复 2# cyqtomb


   看了下时序约束好麻烦,一下子还看不懂,能不能简单地讲一下这个程序该怎么改呢?
发表于 2014-11-24 21:46:13 | 显示全部楼层
回复 1# douwangdiaole


   代码有很多不规范的地方,建议先检查一下:
  • module key_scan(,这个模块的问题:
  • always @ (posedge clock_50mhz or posedge !reset_n or posedge !key_s) , 一般的综合器很难综合这种代码,最好保留只有一个时钟和一个复位,还一个问题是posedge !reset_n,为什么不写成negedge reset_n,不要用奇形怪状的代码风格。
  •                 else if(!key_s)
  •                         key_s_flag <= 1; 这里 else if(!key_s)以后呢?如果key_s=1怎么办,key_s_flag还是保持为1吗,我想你本意不是这样的吧。如果本来就是要求这样,那这里倒是没错了。
  • module led_display(, 这个模块的问题:
  •         //define register
  •         reg        [7:0]               led_data  =  8'b1000_0000; 这里=8'b10000xxxx的没有意义(事实上在某些FPGA里面倒是可以用来初始化,可是一般不这么用),删掉吧。
  •         //define register
  •         always @ (posedge clock_50mhz or posedge !reset_n); 还是posedge !reset_n,改掉吧。
  •                         else if(key_s_flag)
  •                         begin
  •                                 led_data[0] <= led_data[7];
  •                                 led_data[1] <= led_data[0];
  •                                 led_data[2] <= led_data[1];
  •                                 led_data[3] <= led_data[2];
  •                                 led_data[4] <= led_data[3];
  •                                 led_data[5] <= led_data[4];
  •                                 led_data[6] <= led_data[5];
  •                                 led_data[7] <= led_data[6];
  •                         end
  • 这一大段就一个功能led_data[7:0] <= {led_data[6:0], led_data[7]};用这句替代,省的写一堆代码。
  • module sys_clock( 这个模块
  •         output   led_clock;
  •         wire       clock_50mhz;
  •         reg        [25:0]        led_clock;
  •         always @ (posedge clock_50mhz or posedge !reset_n)
  •         begin
  •                 if(!reset_n)
  •                         led_clock <= 1'b0;
  •                 else
  •                         led_clock <= led_clock+1;
  •         end
led_clock有26个bit,但是输出又变成1个bit,明显不match,所以最后led_clock最高位无法输出,我想你本意是要输出led_clock[25]吧,那么就得改,自己思考一下怎么修改吧,不难。








最后看top,你实例化模块的方法也不通用,led_display(....); 这里没有实例的名字啊,应该led_display u_led_display(....);好歹后面给个u_xxx作为实例的名字。
  •         led_display(
  •         .clock_50mhz      (clock_50mhz),
  •         .led_clock           (led_clock),
  •         .reset_n             (reset_n),
  •         .key_s_flag        (key_s_flag),
  •         .led                   (led)
  •         );
 楼主| 发表于 2014-11-25 23:18:14 | 显示全部楼层
本帖最后由 douwangdiaole 于 2014-11-25 23:22 编辑

回复 6# acgoal


   非常感谢你的意见和建议,通过你的一些指点,我都找到了问题的解决办法,也找到了其他的一些问题了,现在程序可以正常编译并且演示结果正常。长经验了。
源代码:
top:




  1. module led_water(
  2.         clock_50mhz,
  3.         reset_n,
  4.         key_start,
  5.         key_stop,
  6.         led
  7.         );
  8.         input                clock_50mhz;
  9.         input                reset_n;
  10.         input                key_start;
  11.         input                key_stop;
  12.         
  13.         output        [7:0]        led;
  14.         
  15.         wire                led_clock;
  16.         wire                key_s_flag;
  17.         
  18.         led_display u_led_display(
  19.                 .clock_50mhz                (clock_50mhz),
  20.                 .led_clock                     (led_clock),
  21.                 .reset_n                       (reset_n),
  22.                                                 
  23.                 .key_s_flag                   (key_s_flag),
  24.                 .led                              (led)
  25.                  );
  26.         key_scan u_key_scan(
  27.                 .clock_50mhz                (clock_50mhz),
  28.                 .reset_n                       (reset_n),
  29.                 .key_start                    (key_start),
  30.                 .key_stop                    (key_stop),
  31.                 .key_s_flag                 (key_s_flag)
  32.                  );
  33.         sys_clock u_sys_clock(
  34.                 .clock_50mhz             (clock_50mhz),
  35.                 .reset_n                     (reset_n),
  36.                                                 
  37.                 .led_clock                  (led_clock)
  38.                 );
  39. endmodule



复制代码




模块一:




  1. module sys_clock(
  2.         clock_50mhz,
  3.         reset_n,
  4.         led_clock
  5.         );
  6.         input         clock_50mhz;
  7.         input         reset_n;
  8.         output       led_clock;
  9.         
  10.         reg           [25:0]        led_counter;
  11.         parameter                  led_counter_max        =        49_999_999;
  12.         
  13.         always @ (posedge clock_50mhz or negedge reset_n)
  14.         begin
  15.                 if(!reset_n)
  16.                         led_counter <= 26'd0;
  17.                 else if(led_counter < led_counter_max)
  18.                         led_counter <= led_counter+1'b1;
  19.                 else
  20.                         led_counter <= 26'd0;
  21.         end
  22.         assign led_clock = (led_counter == 49_999_999) ? 1'b1:1'b0;
  23. endmodule
  24.         


复制代码



模块二:




  1. //定义函数
  2. module led_display(
  3.                   clock_50mhz,
  4.                   led_clock,
  5.                   reset_n,
  6.                   key_s_flag,
  7.                   led
  8.                   );
  9.         //out or in port                                       
  10.         input              clock_50mhz;
  11.         input              led_clock;
  12.         input              reset_n;
  13.         input              key_s_flag;
  14.         output        [7:0]                led;
  15.         
  16.         reg                [7:0]                led;
  17.         
  18.         always @ (posedge clock_50mhz or negedge reset_n)
  19.                 begin
  20.                         if(!reset_n)
  21.                                 led <= 8'b1000_0000;
  22.                         else if((key_s_flag ==1) && (led_clock==1))
  23.                                 led <= {led[6:0],led[7]};
  24.                 end
  25. endmodule



复制代码



模块三:




  1. module key_scan(
  2.         clock_50mhz,
  3.         reset_n,
  4.         key_start,
  5.         key_stop,
  6.         key_s_flag
  7.         );
  8.         input                         clock_50mhz;
  9.         input                                key_start;
  10.         input                                key_stop;
  11.         input                                reset_n;
  12.         output                        key_s_flag;
  13.         
  14.         reg                                key_s_flag;
  15.         
  16.         always @ (posedge clock_50mhz or negedge reset_n)
  17.         begin
  18.                 if(!reset_n)
  19.                         key_s_flag <= 1'b0;
  20.                 else if(!key_start)
  21.                         key_s_flag <= 1'b1;
  22.                 else if(!key_stop)
  23.                         key_s_flag <= 1'b0;
  24. //                else
  25. //                        key_s_flag <= 0;
  26.         end
  27. endmodule



复制代码
发表于 2015-11-10 21:11:31 | 显示全部楼层
学习下`
发表于 2015-11-24 18:33:19 | 显示全部楼层
学习的飘过····
发表于 2016-2-25 14:40:47 | 显示全部楼层
您好,请问是代码风格的问题吗?还是时钟约束的问题?谢谢啦
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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


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

GMT+8, 2024-11-15 02:30 , Processed in 0.024089 second(s), 9 queries , Gzip On, Redis On.

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