搜索
bottom↓
回复: 29

Verilog代码中if else语句占用资源问题

[复制链接]

出0入0汤圆

发表于 2013-4-24 16:18:02 | 显示全部楼层 |阅读模式
现在在用Alter FPGA做一个波形发生器,芯片型号EP2C5Q208C8,中间要用8个按键设置波形的一些参数,现在问题是加入下面这段键盘处理代码后,Quartus编译报告指出所用的用于实现组合逻辑的单元超出了芯片的资源,错误如下:
Error: Design contains 5638 blocks of type combinational node.  However, device contains only 4608.
Compilation Report -Flow Summary截图如下

代码如下:
//其中h2l[0],h2l[1],h2l[2],h2l[3]……等是键盘检测模块的输出,按键按下输出一个脉冲。
  1. //------------键盘响应--------------------------------
  2. //----------------------------------------------------
  3. always@(posedge clk,negedge rst_n)
  4. if(!rst_n)begin
  5.         alter<=0;//0-静止  1-刷新
  6.         rang<=0;//幅度 0-不加倍 1-加倍
  7.         ft<=100;//频率初始值
  8.         mode<=0;//0-工作,1-测试
  9.         wtype<=0;//0-正弦波,1-三角波,2-方波,3-正锯齿波,4-负锯齿波
  10.         val<=0;//测试初始值
  11.         channel<=0;//通道
  12.         led1<=1;
  13.         {
  14.         d[0], d[1],   d[2], d[3],   d[4], d[5],   d[6], d[7],   d[8], d[9],   d[10],d[11],  d[12],d[13],  d[14],d[15],
  15.         d[16],d[17],  d[18],d[19],  d[20],d[21],  d[22],d[23],  d[24],d[25],  d[26],d[27],  d[28],d[29],  d[30],d[31],
  16.         d[32],d[33],  d[34],d[35],  d[36],d[37],  d[38],d[39],  d[40],d[41],  d[42],d[43],  d[44],d[45],  d[46],d[47],
  17.         d[48],d[49],  d[50],d[51],  d[52],d[53],  d[54],d[55],  d[56],d[57],  d[58],d[59],  d[60],d[61],  d[62],d[63]
  18.         }<=tab_cn;
  19. end
  20. else if(h2l[0])//切换工作模式,
  21. begin
  22.         led1<=~led1;
  23.         if(mode)begin
  24.                 {d[6],d[7],d[8],d[9]}<="工作";
  25.                 mode<=0;
  26.                 end
  27.         else begin
  28.                 {d[6],d[7],d[8],d[9]}<="测试";
  29.                 mode<=1;
  30.                 end
  31.         alter<=1;
  32. end
  33. else if(h2l[4])//改变波形
  34. begin
  35.         led1<=~led1;
  36.         case(wtype)
  37.         3'd0:begin
  38.                 {d[22],d[23],d[24],d[25],d[26],d[27],d[28]}<="三角波 ";
  39.                 wtype<=3'd1;
  40.                 end
  41.         3'd1:begin
  42.                 {d[22],d[23],d[24],d[25],d[26],d[27],d[28]}<="方波   ";
  43.                 wtype<=3'd2;
  44.                 end
  45.         3'd2:begin
  46.                 {d[22],d[23],d[24],d[25],d[26],d[27],d[28]}<="锯齿波A";
  47.                 wtype<=3'd3;
  48.                 end
  49.         3'd3:begin
  50.                 {d[22],d[23],d[24],d[25],d[26],d[27],d[28]}<="锯齿波B";
  51.                 wtype<=3'd4;
  52.                 end
  53.         3'd4:begin
  54.                 {d[22],d[23],d[24],d[25],d[26],d[27],d[28]}<="正弦波 ";
  55.                 wtype<=3'd0;
  56.                 end
  57.         endcase
  58.         alter<=1;
  59. end
  60. else if(h2l[1])//递增测试模式时输入给DA的数值
  61. begin
  62.         led1<=~led1;
  63.         val<=val+1;
  64.         d[13]<=val/100+8'h30;
  65.         d[14]<=val%100/10+8'h30;
  66.         d[15]<=val%10+8'h30;
  67.         alter<=1;
  68. end
  69. else if(h2l[5])//递减测试模式时输入给DA的数值
  70. begin
  71.         led1<=~led1;
  72.         val<=val-1;
  73.         d[13]<=val/100+8'h30;
  74.         d[14]<=val%100/10+8'h30;
  75.         d[15]<=val%10+8'h30;
  76.         alter<=1;       
  77. end
  78. else if(h2l[2])//递增频率
  79. begin
  80.         led1<=~led1;
  81.         ft<=ft+1;
  82.         d[37]<=ft/1000000%10+8'h30;       
  83.         d[39]<=ft/100000%10+8'h30;
  84.         d[40]<=ft/10000%10+8'h30;
  85.         d[41]<=ft/1000%10+8'h30;       
  86.         d[43]<=ft/100%10+8'h30;
  87.         d[44]<=ft/10%10+8'h30;
  88.         d[45]<=ft/1%10+8'h30;
  89.         alter<=1;       
  90. end
  91. else if(h2l[6])//递减频率
  92. begin
  93.         led1<=~led1;
  94.         ft<=ft-1;
  95.         d[37]<=ft/1000000%10+8'h30;       
  96.         d[39]<=ft/100000%10+8'h30;
  97.         d[40]<=ft/10000%10+8'h30;
  98.         d[41]<=ft/1000%10+8'h30;       
  99.         d[43]<=ft/100%10+8'h30;
  100.         d[44]<=ft/10%10+8'h30;
  101.         d[45]<=ft/1%10+8'h30;
  102.         alter<=1;       
  103. end
  104. else if(h2l[3])//改变输出电压幅度
  105. begin
  106.         led1<=~led1;
  107.         rang<=~rang;
  108.         if(rang)begin
  109.                 {d[53],d[54],d[55]}<="2.5";
  110.         end
  111.         else begin
  112.                 {d[53],d[54],d[55]}<="5.0";
  113.         end
  114.         alter<=1;
  115. end
  116. else if(h2l[7])//切换输出
  117. begin
  118.         led1<=~led1;
  119.         case(channel)
  120.         2'b00:begin
  121.                         d[63]<="B";
  122.                         channel<=3'd1;
  123.                 end
  124.         2'b01:begin
  125.                         d[63]<="C";
  126.                         channel<=3'd2;
  127.                 end
  128.         2'b10:begin
  129.                         d[63]<="D";
  130.                         channel<=3'd3;
  131.                 end
  132.         2'b11:begin
  133.                         d[63]<="A";
  134.                         channel<=3'd0;
  135.                 end
  136.         endcase
  137.         alter<=1;
  138. end
  139. else begin
  140.         alter<=0;
  141. end
复制代码
================尝试解决之后结果==========================================
经过查资料发现应该是键盘处理这一块 if else 语句嵌套太多造成的,于是采用case语句,主要思路是每个时钟沿先进行keyval={h2l[7],h2l[6],h2l[5],h2l[4],h2l[3],h2l[2],h2l[1],h2l[0]};然后case(keyval),但是编译结果还是说资源不够,错误如下:
Error: Design contains 5644 blocks of type combinational node.  However, device contains only 4608.
Compilation Report -Flow Summary截图如下:

修改后代码如下:
  1. always@(posedge clk,negedge rst_n)
  2. if(!rst_n)begin
  3.         alter<=0;//0-静止  1-刷新
  4.         rang<=0;//幅度 0-不加倍 1-加 ?
  5.         ft<=100;
  6.         mode<=0;//0-工作,1-测试
  7.         wtype<=0;//0-正弦波,1-三角波,2-方波,3-正锯齿波,4-负锯齿波
  8.         val<=0;
  9.         channel<=0;
  10.         led1<=1;
  11.         {
  12.         d[0], d[1],   d[2], d[3],   d[4], d[5],   d[6], d[7],   d[8], d[9],   d[10],d[11],  d[12],d[13],  d[14],d[15],
  13.         d[16],d[17],  d[18],d[19],  d[20],d[21],  d[22],d[23],  d[24],d[25],  d[26],d[27],  d[28],d[29],  d[30],d[31],
  14.         d[32],d[33],  d[34],d[35],  d[36],d[37],  d[38],d[39],  d[40],d[41],  d[42],d[43],  d[44],d[45],  d[46],d[47],
  15.         d[48],d[49],  d[50],d[51],  d[52],d[53],  d[54],d[55],  d[56],d[57],  d[58],d[59],  d[60],d[61],  d[62],d[63]
  16.         }<=tab_cn;
  17.         keyval<=0;
  18. end
  19. else begin
  20.         keyval={h2l[7],h2l[6],h2l[5],h2l[4],h2l[3],h2l[2],h2l[1],h2l[0]};
  21.         case(keyval)
  22.                 8'h80:begin
  23.                         led1<=~led1;
  24.                         case(channel)
  25.                         2'b00:begin
  26.                                         d[63]<="B";
  27.                                         channel<=3'd1;
  28.                                 end
  29.                         2'b01:begin
  30.                                         d[63]<="C";
  31.                                         channel<=3'd2;
  32.                                 end
  33.                         2'b10:begin
  34.                                         d[63]<="D";
  35.                                         channel<=3'd3;
  36.                                 end
  37.                         2'b11:begin
  38.                                         d[63]<="A";
  39.                                         channel<=3'd0;
  40.                                 end
  41.                         endcase
  42.                         alter<=1;
  43.                 end
  44.                 8'h40:begin
  45.                         led1<=~led1;
  46.                         ft<=ft-1;
  47.                         d[37]<=ft/1000000%10+8'h30;       
  48.                         d[39]<=ft/100000%10+8'h30;
  49.                         d[40]<=ft/10000%10+8'h30;
  50.                         d[41]<=ft/1000%10+8'h30;       
  51.                         d[43]<=ft/100%10+8'h30;
  52.                         d[44]<=ft/10%10+8'h30;
  53.                         d[45]<=ft/1%10+8'h30;
  54.                         alter<=1;       
  55.                 end
  56.                 8'h20:begin
  57.                         led1<=~led1;
  58.                         val<=val-1;
  59.                         d[13]<=val/100+8'h30;
  60.                         d[14]<=val%100/10+8'h30;
  61.                         d[15]<=val%10+8'h30;
  62.                         alter<=1;       
  63.                 end
  64.                 8'h10:begin
  65.                         led1<=~led1;
  66.                         case(wtype)
  67.                         3'd0:begin
  68.                                 {d[22],d[23],d[24],d[25],d[26],d[27],d[28]}<="三角波 ";
  69.                                 wtype<=3'd1;
  70.                                 end
  71.                         3'd1:begin
  72.                                 {d[22],d[23],d[24],d[25],d[26],d[27],d[28]}<="方波   ";
  73.                                 wtype<=3'd2;
  74.                                 end
  75.                         3'd2:begin
  76.                                 {d[22],d[23],d[24],d[25],d[26],d[27],d[28]}<="锯齿波A";
  77.                                 wtype<=3'd3;
  78.                                 end
  79.                         3'd3:begin
  80.                                 {d[22],d[23],d[24],d[25],d[26],d[27],d[28]}<="锯齿波B";
  81.                                 wtype<=3'd4;
  82.                                 end
  83.                         3'd4:begin
  84.                                 {d[22],d[23],d[24],d[25],d[26],d[27],d[28]}<="正弦波 ";
  85.                                 wtype<=3'd0;
  86.                                 end
  87.                         endcase
  88.                         alter<=1;
  89.                 end
  90.                 8'h08:begin
  91.                                 led1<=~led1;
  92.                                 rang<=~rang;
  93.                                 if(rang)begin
  94.                                         {d[53],d[54],d[55]}<="2.5";
  95.                                 end
  96.                                 else begin
  97.                                         {d[53],d[54],d[55]}<="5.0";
  98.                                 end
  99.                                 alter<=1;
  100.                 end
  101.                 8'h04:begin
  102.                         led1<=~led1;
  103.                         ft<=ft+1;
  104.                         d[37]<=ft/1000000%10+8'h30;       
  105.                         d[39]<=ft/100000%10+8'h30;
  106.                         d[40]<=ft/10000%10+8'h30;
  107.                         d[41]<=ft/1000%10+8'h30;       
  108.                         d[43]<=ft/100%10+8'h30;
  109.                         d[44]<=ft/10%10+8'h30;
  110.                         d[45]<=ft/1%10+8'h30;
  111.                         alter<=1;       
  112.                         end
  113.                 8'h02:begin
  114.                         led1<=~led1;
  115.                         val<=val+1;
  116.                         d[13]<=val/100+8'h30;
  117.                         d[14]<=val%100/10+8'h30;
  118.                         d[15]<=val%10+8'h30;
  119.                         alter<=1;
  120.                 end
  121.                 8'h01:begin
  122.                         led1<=~led1;
  123.                         if(mode)begin
  124.                                 {d[6],d[7],d[8],d[9]}<="工作";
  125.                                 mode<=0;
  126.                                 end
  127.                         else begin
  128.                                 {d[6],d[7],d[8],d[9]}<="测试";
  129.                                 mode<=1;
  130.                                 end
  131.                         alter<=1;
  132.                 end
  133.                 default:alter<=0;
  134.         endcase
  135. end
复制代码
===========================================================================
如果把上面那一段代码屏蔽掉,能编译通过,Compilation Report -Flow Summary截图如下:

===========================================================================
想知道这该怎么办,把键盘加进去的思路应该是怎样的?

本帖子中包含更多资源

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

x

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

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

出0入0汤圆

发表于 2013-4-24 16:22:35 | 显示全部楼层
你上面的代码中:
   d[37]<=ft/1000000%10+8'h30;        
                        d[39]<=ft/100000%10+8'h30;
                        d[40]<=ft/10000%10+8'h30;
                        d[41]<=ft/1000%10+8'h30;        
                        d[43]<=ft/100%10+8'h30;
                        d[44]<=ft/10%10+8'h30;
                        d[45]<=ft/1%10+8'h30;
这些,FPGA是很难用逻辑资源实现的,你当FPGA是单片机啊?

出0入0汤圆

 楼主| 发表于 2013-4-24 16:24:52 | 显示全部楼层
tangkuan660 发表于 2013-4-24 16:22
你上面的代码中:
   d[37]

我以前都是那么做的,没出问题,所以没深入了解。我试试,一会反馈结果。

出0入0汤圆

发表于 2013-4-24 16:39:49 | 显示全部楼层
现在好久不高这个了,建议你用数据产生法做。。

出0入0汤圆

 楼主| 发表于 2013-4-24 16:46:32 | 显示全部楼层
tangkuan660 发表于 2013-4-24 16:22
你上面的代码中:
   d[37]

确实是这里的问题,注释掉下面的代码就能编译通过,TE占用55%
//        d[37]<=ft/1000000%10+8'h30;       
//        d[39]<=ft/100000%10+8'h30;
//        d[40]<=ft/10000%10+8'h30;
//        d[41]<=ft/1000%10+8'h30;       
//        d[43]<=ft/100%10+8'h30;
//        d[44]<=ft/10%10+8'h30;
//        d[45]<=ft/1%10+8'h30;
但是这段代码的功能该怎么实现呢?我这里要实现的就是按键改变ft的值,然后12864点阵屏显示出ft的值,这样就必须对ft进行拆分,如果不这么拆分该怎样实现拆分?在博客园找了一篇文章(百度“ Verilog 拆分一个数”,不让发链接,刚才编辑的回复失败了。)说是用IP核实现,但是看完不是很明白。有没有拆分一个数的资料或者相关思路,谢谢你的回复。

出0入17汤圆

发表于 2013-4-24 16:52:40 | 显示全部楼层
很好奇你代码里怎么会有中文。
另外建议你可以用查表法生成相应的波形,把需要的各种波形数据提前建立好,存入rom里,需要用的时候就通过计数器查相应的地址就ok了

出0入0汤圆

 楼主| 发表于 2013-4-24 16:53:36 | 显示全部楼层
significance201 发表于 2013-4-24 16:39
现在好久不高这个了,建议你用数据产生法做。。

“数据产生法”?能不能再具体一点

出0入17汤圆

发表于 2013-4-24 16:56:20 | 显示全部楼层
移位做除法

出0入0汤圆

发表于 2013-4-24 16:57:16 | 显示全部楼层
我发过一个自己做的帖子。
你可以看看
就是说把要产生的波形的数据模拟出来,让后输出,通过AD转换,就可以了。

出0入0汤圆

 楼主| 发表于 2013-4-24 16:57:43 | 显示全部楼层
流氓马 发表于 2013-4-24 16:52
很好奇你代码里怎么会有中文。
另外建议你可以用查表法生成相应的波形,把需要的各种波形数据提前建立好, ...

代码用notepad编辑就可以用中文注释啊。
数据就是提前采样好用ROM存储的,但现在问题不是这个,现在是如何拆分那个ft,就是实现下面代码的功能,将ft拆分成个,十,百,千……然后转换为ASCII显示在液晶屏上,下面的这种写法很耗资源。。。。
        d[37]<=ft/1000000%10+8'h30;        
        d[39]<=ft/100000%10+8'h30;
        d[40]<=ft/10000%10+8'h30;
        d[41]<=ft/1000%10+8'h30;        
        d[43]<=ft/100%10+8'h30;
        d[44]<=ft/10%10+8'h30;
        d[45]<=ft/1%10+8'h30;

出0入0汤圆

发表于 2013-4-24 16:58:12 | 显示全部楼层
还有什么问题的话,你继续问,待会可能就不在了

出0入0汤圆

 楼主| 发表于 2013-4-24 17:02:39 | 显示全部楼层
significance201 发表于 2013-4-24 16:58
还有什么问题的话,你继续问,待会可能就不在了

怎么看你的发的帖子,我的权限不够啊,只能看见“抱歉!由于 significance201 的隐私设置,您不能访问当前内容”

出0入0汤圆

发表于 2013-4-24 17:03:58 | 显示全部楼层
张sir 发表于 2013-4-24 17:02
怎么看你的发的帖子,我的权限不够啊,只能看见“抱歉!由于 significance201 的隐私设置,您不能访问当 ...

哦,这样的话。。。。

出0入0汤圆

发表于 2013-4-24 17:04:37 | 显示全部楼层
你们是干什么东西呢?

出0入0汤圆

发表于 2013-4-24 17:06:12 | 显示全部楼层
本帖最后由 significance201 于 2013-4-24 17:08 编辑

我的那个仅供铲靠,看了你的要求,我做没有那么全压

出0入0汤圆

发表于 2013-4-24 17:14:46 | 显示全部楼层
东西我发给你吧。。

出0入0汤圆

发表于 2013-4-24 17:17:12 | 显示全部楼层
张sir 发表于 2013-4-24 16:57
代码用notepad编辑就可以用中文注释啊。
数据就是提前采样好用ROM存储的,但现在问题不是这个,现在是如 ...

8楼不是说移位做除法么?

出0入0汤圆

 楼主| 发表于 2013-4-24 17:36:25 | 显示全部楼层
aworker 发表于 2013-4-24 17:17
8楼不是说移位做除法么?

我正在查看移位除法相关的资料,弄明白了再来回复

出0入0汤圆

发表于 2013-4-24 21:05:07 | 显示全部楼层
http://www.amobbs.com/forum.php?mod=viewthread&tid=5526405
帮楼上的那个哥们转的

出0入0汤圆

发表于 2013-4-24 21:05:38 | 显示全部楼层
还有 我这是第一次看到这种写法 单片机做多了吧 哈哈

出0入0汤圆

发表于 2013-4-24 21:15:09 | 显示全部楼层
/,%好像都很占资源。

出0入0汤圆

发表于 2013-4-24 22:08:18 | 显示全部楼层
lz这种代码能综合出什么电路啊a

出350入477汤圆

发表于 2013-4-24 22:34:39 来自手机 | 显示全部楼层
综合出一大堆除法器啊!
这种用途应该交给单片机做,要不弄个嵌入软核也好。不过a家没有超小型的,只有x家有。。。

出0入0汤圆

发表于 2013-4-24 22:51:58 | 显示全部楼层
液晶显示部分用NIOS做吧

出350入477汤圆

发表于 2013-4-25 07:33:19 来自手机 | 显示全部楼层
张sir 发表于 2013-4-24 17:36 我正在查看移位除法相关的资料,弄明白了再来回复

重要的不是怎么写除法器,而是怎么复用除法器。如果你只用一个除法器,就算你写个除号,综合器给你生成一个无流水的高速除法器也装得下。
叫你用个软核就是方便复用除法器。不然你得费很多脑筋来写一个复杂的状态机,以便只用一个除法器把整数拆成每一位。。。
省资源的除法器是每个时钟除一位的,其实你没必要自己从头发明轮子,各种除法器在那厂家库里都有,你用ip核向导生成一个就行了。

出350入477汤圆

发表于 2013-4-25 07:52:03 来自手机 | 显示全部楼层
tennokoe 发表于 2013-4-24 22:51 液晶显示部分用NIOS做吧

nios对小fpga显得太重量级了一点,只为处理键盘显示太浪费。
还是x家好啊,嵌一个PicoBlaze的8位核心,只要96个slice,干这种事情很合算。

出0入0汤圆

 楼主| 发表于 2013-4-25 10:32:54 | 显示全部楼层
significance201 发表于 2013-4-24 17:14
东西我发给你吧。。

我的权限太低,1个小时只能回复5次。。。昨天到后面没法回复了。谢谢你的帮助。

出0入0汤圆

发表于 2013-4-25 10:42:51 | 显示全部楼层
FPGA做乘法除法这些,会消耗极其多的资源

出350入477汤圆

发表于 2013-4-25 10:51:54 | 显示全部楼层
wildone 发表于 2013-4-25 10:42
FPGA做乘法除法这些,会消耗极其多的资源

乘法不耗资源,都有硬乘法器了。FPGA的一个很重要的应用方向就是用它的硬乘法器做信号处理~
除法嘛,只能自己想方法了。。。
纯硬逻辑根本就不适合干这种显示拆数的事。相当于用高射炮打蚊子,费力不讨好
最好的方法是用高射炮里面的一小部分资源做出一个蚊子拍,呵呵,一下就搞定。。。
如果你是A家,没有小的蚊子拍,更好的做法是用个一两块钱的外置蚊子拍去打蚊子,留着高射炮的资源做更重要的事情
如果板上没有外置的蚊子拍,那就花高射炮里面很大一部分资源做一个大型的nios牌的蚊子拍吧,也能用  

出0入0汤圆

 楼主| 发表于 2013-4-25 10:53:36 | 显示全部楼层
感谢路上各位的提示和回复,现在问题已经解决,使用移位除法的思路处理的,话说那个什么IP我不会用(只用过ROM,PLL之类的),只好自己写一个module,参考了CSDN上的一篇文章,百度“用+,-,移位实现除法运算”就能看到(被催的我权限不够发链接只能这样了),那个是用C语言写的,思路很容易看明白。我没有写那种完全的除法模块,就是一个拆分模块,比如把20‘d1048575拆分成1、0、4、8、5、7、5,然后就可以加上0x30转换成ASCII了。。以前确实是经常写单片机的代码,遇到这种情况就想当然写了。。模块中的思路就是做减法,比如将328拆分就先用328减去100,判断结果和100的关系,并累加cnt_subtr,直到结果小于100时,则cnt_subtr就是百位,具体到这个例子中只需减2次就停止了,后面的情况类推。模块通过en_divid的脉冲触发开始转换,转换完毕done会输出脉冲,只能转换reg[19:0]范围的数字,添加这个模块之前和之后Quartus编译结果中LE分别是2510(54%)2819(61%)。下面附上代码,仿真截图等方便自己也方便有需要的人
==========================拆分模块==============================================
  1. module divider(
  2. input clk,rst_n,en_divid,
  3. input[19:0] dividend,//an impulse start the exchange
  4. output reg[3:0] q6,        //q6=dividend/1000000%10
  5. output reg[3:0] q5,        //q5=dividend/100000%10
  6. output reg[3:0] q4,        //q4=dividend/10000%10
  7. output reg[3:0] q3,        //q3=dividend/1000%10
  8. output reg[3:0] q2,        //q2=dividend/100%10
  9. output reg[3:0] q1,        //q1=dividend/10%10
  10. output reg[3:0] q0,        //q0=dividend/1%10
  11. output reg done          //finished flag,when exchange finished an impulse will occur
  12. );

  13. parameter base_0=10;
  14. parameter base_1=100;
  15. parameter base_2=1000;
  16. parameter base_3=10000;
  17. parameter base_4=100000;
  18. parameter base_5=1000000;
  19. parameter base_6=10000000;

  20. reg[19:0] left_num; //store the remained number
  21. reg[4:0] state,cnt_subtr;

  22. always@(posedge clk,negedge rst_n)
  23. if(!rst_n)
  24. begin
  25.   state<=0;
  26.   cnt_subtr<=0;
  27.   left_num<=0;
  28.   q6<=0;
  29.   q5<=0;
  30.   q4<=0;
  31.   q3<=0;
  32.   q2<=0;
  33.   q1<=0;
  34.   q0<=0;
  35.   done<=0;
  36. end
  37. else begin
  38.   case(state)
  39.     0:begin//
  40.       if(en_divid)begin
  41.         state<=8;
  42.         left_num<=dividend;
  43.       end
  44.       done<=0;
  45.       cnt_subtr<=0;
  46.     end
  47.     1:begin
  48.       q0<=left_num;
  49.       cnt_subtr<=cnt_subtr+1;
  50.       if(cnt_subtr)begin
  51.         done<=1;      
  52.         state<=state-1;//wait for one clock
  53.       end
  54.     end
  55.     2:begin//
  56.         if(left_num<base_0)begin
  57.           q1<=cnt_subtr;
  58.           state<=state-1;
  59.           cnt_subtr<=0;
  60.         end
  61.         else begin
  62.           left_num<=left_num-base_0;
  63.           cnt_subtr<=cnt_subtr+1;   
  64.         end      
  65.     end
  66.     3:begin//
  67.         if(left_num<base_1)begin
  68.           q2<=cnt_subtr;
  69.           state<=state-1;
  70.           cnt_subtr<=0;
  71.         end
  72.         else begin
  73.           left_num<=left_num-base_1;
  74.           cnt_subtr<=cnt_subtr+1;   
  75.         end
  76.     end
  77.     4:begin//
  78.         if(left_num<base_2)begin
  79.           q3<=cnt_subtr;
  80.           state<=state-1;
  81.           cnt_subtr<=0;
  82.         end
  83.         else begin
  84.           left_num<=left_num-base_2;
  85.           cnt_subtr<=cnt_subtr+1;   
  86.         end     
  87.     end
  88.     5:begin//
  89.         if(left_num<base_3)begin
  90.           q4<=cnt_subtr;
  91.           state<=state-1;
  92.           cnt_subtr<=0;
  93.         end
  94.         else begin
  95.           left_num<=left_num-base_3;
  96.           cnt_subtr<=cnt_subtr+1;   
  97.         end
  98.     end
  99.     6:begin//
  100.         if(left_num<base_4)begin
  101.           q5<=cnt_subtr;
  102.           state<=state-1;
  103.           cnt_subtr<=0;
  104.         end
  105.         else begin
  106.           left_num<=left_num-base_4;
  107.           cnt_subtr<=cnt_subtr+1;   
  108.         end     
  109.     end
  110.     7:begin//
  111.         if(left_num<base_5)begin
  112.           q6<=cnt_subtr;
  113.           state<=state-1;
  114.           cnt_subtr<=0;
  115.         end
  116.         else begin
  117.           left_num<=left_num-base_5;
  118.           cnt_subtr<=cnt_subtr+1;   
  119.         end   
  120.     end
  121.     8:begin//
  122.         if(left_num<base_6)begin
  123.           //q6<=cnt_subtr;
  124.           state<=state-1;
  125.           cnt_subtr<=0;
  126.         end
  127.         else begin
  128.           left_num<=left_num-base_6;
  129.           cnt_subtr<=cnt_subtr+1;   
  130.         end
  131.     end
  132.     endcase
  133. end

  134. endmodule
  135.    
复制代码
==========================测试文件==============================================
  1. `timescale 1ps/1ps
  2. module divide_T;
  3.   reg clk,rst_n,en_divid;
  4.   reg[19:0] dividend;
  5.   wire[3:0] q6,q5,q4,q3,q2,q1,q0;
  6.   wire done;
  7.   divider UT_divid(
  8.     clk,rst_n,en_divid,
  9.     dividend,
  10.     q6,q5,q4,q3,q2,q1,q0,done
  11.   );
  12. always #1 clk=~clk;
  13. initial
  14. begin
  15.   clk<=0;
  16.   rst_n<=1;
  17.   en_divid<=0;
  18.   dividend<=20'd1048575;  
  19.   #5 rst_n<=0;
  20.   #5 rst_n<=1;
  21.   #10;
  22.   en_divid<=1;
  23.   #3 en_divid<=0;
  24.   #90;
  25.   dividend<=20'd924187;
  26.   en_divid<=1;
  27.   #3 en_divid<=0;
  28. end
  29. endmodule
复制代码
==========================仿真结果==============================================

本帖子中包含更多资源

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

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

本版积分规则

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

GMT+8, 2024-7-24 07:15

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

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