微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 关于Verilog并行运行的问题

关于Verilog并行运行的问题

时间:10-02 整理:3721RD 点击:

  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的时候应该是继续加一的,但仿真出来又不是!大神你在哪?

综合模块

仿真波形

thanks for sharing

把 begin/end加 全,


一般begin ...end没有加好,他会报错的。但他没有


YOU ARE WELCOME

thanks you

真的,把begin,end加全了。报错是因为begin/end缺了一个,缺了一对不会报错,但可能导致软件对你的代码理解错误。


我觉得是不是仿真不稳定啊.之前如果是在en=1,add_sub=0变成en=0,add_sub=1之前,先让add_sub=1,就不会了。后来又不对了!

你的说明非常不清楚,不过我试着猜一下。你把“if(q1==9)”这些条件改成“if(q==9)”,看看是不是你想要的结果

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


一定不行,q在这里是输出端口,他可以选择q1输出,也可以选择q2输出。而关于en==1与add_sub==0是作为秒表。而en==0,add_sub==1是产生60进制,因为下一个模块没有PO上来,其实他产生的进位是作为分钟的时钟信号的。en==0,add_sub==0是作为倒计时的。

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top