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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 4350|回复: 10

[讨论] 关于Verilog并行运行的问题

[复制链接]
发表于 2012-12-2 21:20:59 | 显示全部楼层 |阅读模式

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

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

x




  1. module cnt10(clk,rst,en,add_sub,q,cout);   //十进制计数器   
  2. input clk,rst,en,add_sub;
  3. reg [3:0]q1,q2;
  4. reg c1,c2;
  5. output reg[3:0] q;
  6. output reg cout;

  7. always@(posedge clk or posedge rst)
  8.         if(rst)
  9.                 begin
  10.                 q1<=0;
  11.                 c1<=0;
  12.                 end
  13.         else
  14.                 if(en==0)
  15.                         if(add_sub)   
  16.                                 if(q1==9)
  17.                                         begin q1<=0; c1<=1; end
  18.                                 else      
  19.                                         begin  q1<=q1+4'b0001; c1<=0; end
  20.                          else      //实现倒计时
  21.                                  if(q1==0)
  22.                                         begin q1<=9;c1<=1; end
  23.                                  else
  24.                                         begin q1<=q1-4'b0001;c1<=0;   end

  25. always@(posedge clk or posedge rst)   
  26.                                                  //实现秒表功能
  27. begin
  28.         if(rst)  
  29.                 begin
  30.                 q2<=0;
  31.                 c2<=0;
  32.                 end
  33.         else if(en)
  34.                         if(add_sub==0)
  35.               if(q2==9)
  36.                                   begin q2<=0; c2<=1; end
  37.                           else
  38.                                   begin q2<=q2+4'b0001; c2<=0; end
  39. end

  40. always@(posedge clk)    //秒表和倒计时互相转换

  41. begin
  42.         if(en)
  43.                 begin q<=q2;  cout<=c2; end
  44.         else
  45.                 begin q<=q1; cout<=c1; end
  46. end

  47. endmodule

  48. module cnt6(clk,rst,en,add_sub,q,cout);
  49. input clk,rst,en,add_sub;
  50. reg [3:0]q1,q2;
  51. reg c1,c2;
  52. output reg[3:0] q;
  53. output reg cout;

  54. always@(posedge clk or posedge rst)
  55.         if(rst)
  56.                 begin
  57.                 q1<=0;
  58.                 c1<=0;
  59.                 end
  60.         else
  61.                 if(en==0)
  62.                 if(add_sub)   
  63.                         if(q1==5)
  64.                                 begin q1<=0; c1<=1; end
  65.                         else      
  66.                         begin  q1<=q1+4'b0001; c1<=0; end
  67.                  else      //实现倒计时
  68.                  if(q1==0)
  69.                                 begin q1<=5;c1<=1; end
  70.                          else
  71.                                 begin q1<=q1-4'b0001;c1<=0;   end

  72. always@(posedge clk or posedge rst)   
  73.                                                  //实现秒表功能
  74. begin
  75.         if(rst)
  76.                 begin
  77.                 q2<=0;
  78.                 c2<=0;
  79.                 end
  80.         else if(en)
  81.                         if(add_sub==0)
  82.               if(q2==5)
  83.                                   begin q2<=0; c2<=1; end
  84.                           else
  85.                                   begin q2<=q2+4'b0001; c2<=0; end
  86. end

  87. always@(posedge clk)    //秒表和倒计时互相转换

  88. begin
  89.         if(en)
  90.                 begin q<=q2;  cout<=c2; end
  91.         else
  92.                 begin q<=q1; cout<=c1; end
  93. end

  94. endmodule




复制代码
问题是:分析不出来为什么从en=1,add_sub=0到en=0,add_sub=1的时候应该是继续加一的,但仿真出来又不是!!!大神你在哪???

综合模块

综合模块

仿真波形

仿真波形
发表于 2012-12-2 22:07:19 | 显示全部楼层
thanks for sharing
发表于 2012-12-2 22:11:42 | 显示全部楼层
把 begin/end加 全,
 楼主| 发表于 2012-12-2 22:23:18 | 显示全部楼层
回复 3# tiangua
一般begin ...end没有加好,他会报错的。但他没有
 楼主| 发表于 2012-12-2 22:24:37 | 显示全部楼层
回复 2# fanshuangfbi
YOU ARE WELCOME
发表于 2012-12-3 06:54:31 | 显示全部楼层
thanks you
发表于 2012-12-3 09:15:10 | 显示全部楼层
真的,把begin,end加全了。。报错是因为begin/end缺了一个,缺了一对不会报错,但可能导致软件对你的代码理解错误。
 楼主| 发表于 2012-12-4 17:25:08 | 显示全部楼层
回复 7# falloutmx
我觉得是不是仿真不稳定啊.之前如果是在en=1,add_sub=0变成en=0,add_sub=1之前,先让add_sub=1,就不会了。后来又不对了!!!!!!

                               
登录/注册后可看大图
发表于 2012-12-4 22:01:12 | 显示全部楼层
你的说明非常不清楚,不过我试着猜一下。。。你把“if(q1==9)”这些条件改成“if(q==9)”,看看是不是你想要的结果
发表于 2012-12-5 11:51:14 | 显示全部楼层
本帖最后由 jun_dahai 于 2012-12-5 13:34 编辑

设计错误!
虽然,在en=1,add_sub=0和en=0,add_sub=1这两种情况下,都是相同的加计数,但是你所写的代码中却使用不同加计数逻辑,这样就造成进位不统一,所以在两者切换的情况下,就不会有进位产生(前提是,要产生进位的情况下)。
建议:使用统一的寄存器,并且将en和add_sub拼接起来,使用case语句
注:
  {en,add_sub}
     2'h0 : 减计数
     2'h1,2'h2 : 加计数
     default : 保持
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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

×

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

GMT+8, 2024-5-13 19:32 , Processed in 0.039208 second(s), 11 queries , Gzip On, Redis On.

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