搜索
bottom↓
回复: 8

LED 实验求助,帮忙看个怪异的问题

[复制链接]

出0入0汤圆

发表于 2012-5-31 10:46:08 | 显示全部楼层 |阅读模式
本帖最后由 Pony279 于 2012-5-31 10:47 编辑

大家帮忙看看这段代码,现在是没问题的(顶层是 light_water),3个LED像个计数器一样,每隔 1s 加 1,

但是现在的问题是,当我把下面的被注释的代码恢复以后(也就是加上复位功能),

LED显示就不正常了(rst_n脚已经被我接到高电平了),只有 LED[2] 和 LED[1] 会亮,现象相当于一个 2 位的计数器。。。,LED[0]对应的引脚没反应
  1. module clk_div(
  2.         input  clk_in,
  3.         output p);                        // output pulse
  4.        
  5.         parameter DIV =50_000_000;        // freq(clk_in) / DIV
  6.         parameter BIT_WIDTH = 26;        // the bit-width of the counter
  7.         reg [BIT_WIDTH-1: 0] cnt;

  8.         always@ (posedge clk_in) begin
  9.                         if(cnt == DIV-1)
  10.                                 cnt <= 0;
  11.                         else
  12.                                 cnt <= cnt+1'b1;
  13.         end
  14.         assign p = (cnt == DIV-1)?1'b1:1'b0;
  15. endmodule

  16. module led_display(
  17.         input clk
  18.         ,output [2:0] led_data
  19. //        ,input rst_n
  20. );
  21.         reg [2:0] led_data_r;
  22.         always@(posedge clk
  23. //                ,negedge rst_n
  24.                 )begin
  25. //                if(!rst_n)
  26. //                        led_data_r <= 0;
  27. //                else
  28.                         led_data_r <= led_data_r + 1'b1;
  29.         end
  30.         assign led_data = (~led_data_r);
  31. endmodule

  32. module light_water(
  33.         input clk_in,
  34.         output [2:0] led_data,
  35.         output led
  36. //        ,input rst_n
  37. );

  38.         wire led_clk;
  39.         clk_div clk_div_inst(
  40.                 .clk_in (clk_in),
  41.                 .p (led_clk)
  42.         );
  43.        
  44.         led_display led_display_inst(
  45.                 .clk (led_clk)
  46.                 , .led_data (led_data)               
  47. //                , .rst_n (rst_n)
  48.         );
  49.        
  50.         assign led = led_data[0];

  51. endmodule
复制代码

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2012-5-31 11:12:42 | 显示全部楼层
大家帮忙看看啊,

我昨晚调这个调到 2 点多。。。

玩了 一年多的 C/C++ 都没这么蛋疼过。。。感觉真有点耻辱啊。。。

出0入442汤圆

发表于 2012-5-31 12:58:37 | 显示全部楼层
你不会写个TestBench啊?仿真不就知道怎么回事了?

出0入0汤圆

 楼主| 发表于 2012-5-31 13:11:18 | 显示全部楼层
wye11083 发表于 2012-5-31 12:58
你不会写个TestBench啊?仿真不就知道怎么回事了?

刚入门。。。不会的。。。

出0入0汤圆

 楼主| 发表于 2012-5-31 18:28:56 | 显示全部楼层
受不了,然后装了 quartus II 11.1 试了下,两种版本的代码都没问题了。。。

之前用的是 8.1 的。。。难道是软件的 BUG 吗。。。

出0入0汤圆

发表于 2012-5-31 19:17:00 | 显示全部楼层
你在8.1版本下,看下综合和实现当中,有没有警告或者错误。
表面看,真的看不出什么问题来。

出0入0汤圆

 楼主| 发表于 2012-5-31 19:22:18 | 显示全部楼层
superluan 发表于 2012-5-31 19:17
你在8.1版本下,看下综合和实现当中,有没有警告或者错误。
表面看,真的看不出什么问题来。 ...

已经被我卸载掉了。。。
刚开始学,真不想看那些警告,错误倒是没有,

我之前是试过软件仿真过没问题的,(不过用的是比较简单的图形化的方法的,所以要把分频系数调低了才能很快仿真出来)

我做这个是用来偷懒的,数电的课程设计要做这个,看同学画电路图挺蛋疼的,因为我基本天天都敲代码,所以看着代码觉得特有亲切感 : )

出0入0汤圆

 楼主| 发表于 2012-6-5 00:19:05 | 显示全部楼层
现在又出现问题了,,,实在是诡异啊。。。难道没有人遇到过和我一样的问题么。。。那我作为一个新人真的是奇葩了

出0入0汤圆

 楼主| 发表于 2012-6-5 15:32:58 | 显示全部楼层
唉,好无助啊。。。问题似乎是解决了,可是还是不明白为什么。。。

问题代码似乎是 /*---*/ 包围的地方,有三种方案,看注释,不知没有有人能帮我解释一下?
  1. module ClockDivision(
  2.           input  clk
  3.         , input        rst_n_d                                /* 异步清零 */
  4.         , input[CLK_DIV_BIT_WIDTH:1] div_factor
  5.         , output out_pulse                        /* 输出时钟脉冲 */
  6. );

  7.         parameter CLK_DIV_BIT_WIDTH = 32;        // the bit-width of the counter

  8.         wire counter_rst_n;       
  9.         wire [CLK_DIV_BIT_WIDTH:1]count;       
  10.         Counter #(CLK_DIV_BIT_WIDTH) ClockDivision_Counter(
  11.                   .clk (clk)
  12.                 , .rst_n_d (counter_rst_n)
  13.                 , .count (count)
  14.         );
  15.        
  16.         reg out_pulse_r;                /* 输出脉冲寄存器 */
  17.        
  18.         always@ (posedge clk) begin
  19.                         /* 当上升沿之前计数到 div_factor-1'b1,就可以输出脉冲了 */
  20.                         out_pulse_r <= ( (count+1'b1) == div_factor)?1'b1:1'b0 ;
  21.         end
  22.        
  23.         /* 当计数到设定的值的时候,使能异步复位,直接清零 */
  24.         assign counter_rst_n = (!rst_n_d)?1'b0:( (count == div_factor)?1'b0:1'b1 );
  25.        
  26.         /*---------------------------------------------------------------*/
  27.         /* 为什么这个会有问题呢,我想在时钟下降沿清零啊!!!为什么呢?为什么呢? */
  28.         //assign out_pulse = clk?out_pulse_r:1'b0;
  29.        
  30.         /* 如果分频系数为 1,直接输出时钟,这种方式是可行的 */
  31.         wire sel = div_factor==1?1'b1:1'b0;
  32.         assign out_pulse = sel?clk:out_pulse_r;
  33.        
  34.         /* 这种方式在分频系数为 1 的时候输出是不会跳的 */
  35.         //assign out_pulse = out_pulse_r;
  36.                 /*---------------------------------------------------------------*/
  37.        
  38. endmodule
复制代码

本帖子中包含更多资源

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

x
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-24 09:26

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表