|
现在在用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]……等是键盘检测模块的输出,按键按下输出一个脉冲。- //------------键盘响应--------------------------------
- //----------------------------------------------------
- always@(posedge clk,negedge rst_n)
- if(!rst_n)begin
- alter<=0;//0-静止 1-刷新
- rang<=0;//幅度 0-不加倍 1-加倍
- ft<=100;//频率初始值
- mode<=0;//0-工作,1-测试
- wtype<=0;//0-正弦波,1-三角波,2-方波,3-正锯齿波,4-负锯齿波
- val<=0;//测试初始值
- channel<=0;//通道
- led1<=1;
- {
- 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],
- 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],
- 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],
- 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]
- }<=tab_cn;
- end
- else if(h2l[0])//切换工作模式,
- begin
- led1<=~led1;
- if(mode)begin
- {d[6],d[7],d[8],d[9]}<="工作";
- mode<=0;
- end
- else begin
- {d[6],d[7],d[8],d[9]}<="测试";
- mode<=1;
- end
- alter<=1;
- end
- else if(h2l[4])//改变波形
- begin
- led1<=~led1;
- case(wtype)
- 3'd0:begin
- {d[22],d[23],d[24],d[25],d[26],d[27],d[28]}<="三角波 ";
- wtype<=3'd1;
- end
- 3'd1:begin
- {d[22],d[23],d[24],d[25],d[26],d[27],d[28]}<="方波 ";
- wtype<=3'd2;
- end
- 3'd2:begin
- {d[22],d[23],d[24],d[25],d[26],d[27],d[28]}<="锯齿波A";
- wtype<=3'd3;
- end
- 3'd3:begin
- {d[22],d[23],d[24],d[25],d[26],d[27],d[28]}<="锯齿波B";
- wtype<=3'd4;
- end
- 3'd4:begin
- {d[22],d[23],d[24],d[25],d[26],d[27],d[28]}<="正弦波 ";
- wtype<=3'd0;
- end
- endcase
- alter<=1;
- end
- else if(h2l[1])//递增测试模式时输入给DA的数值
- begin
- led1<=~led1;
- val<=val+1;
- d[13]<=val/100+8'h30;
- d[14]<=val%100/10+8'h30;
- d[15]<=val%10+8'h30;
- alter<=1;
- end
- else if(h2l[5])//递减测试模式时输入给DA的数值
- begin
- led1<=~led1;
- val<=val-1;
- d[13]<=val/100+8'h30;
- d[14]<=val%100/10+8'h30;
- d[15]<=val%10+8'h30;
- alter<=1;
- end
- else if(h2l[2])//递增频率
- begin
- led1<=~led1;
- ft<=ft+1;
- 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;
- alter<=1;
- end
- else if(h2l[6])//递减频率
- begin
- led1<=~led1;
- ft<=ft-1;
- 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;
- alter<=1;
- end
- else if(h2l[3])//改变输出电压幅度
- begin
- led1<=~led1;
- rang<=~rang;
- if(rang)begin
- {d[53],d[54],d[55]}<="2.5";
- end
- else begin
- {d[53],d[54],d[55]}<="5.0";
- end
- alter<=1;
- end
- else if(h2l[7])//切换输出
- begin
- led1<=~led1;
- case(channel)
- 2'b00:begin
- d[63]<="B";
- channel<=3'd1;
- end
- 2'b01:begin
- d[63]<="C";
- channel<=3'd2;
- end
- 2'b10:begin
- d[63]<="D";
- channel<=3'd3;
- end
- 2'b11:begin
- d[63]<="A";
- channel<=3'd0;
- end
- endcase
- alter<=1;
- end
- else begin
- alter<=0;
- 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截图如下:
修改后代码如下:- always@(posedge clk,negedge rst_n)
- if(!rst_n)begin
- alter<=0;//0-静止 1-刷新
- rang<=0;//幅度 0-不加倍 1-加 ?
- ft<=100;
- mode<=0;//0-工作,1-测试
- wtype<=0;//0-正弦波,1-三角波,2-方波,3-正锯齿波,4-负锯齿波
- val<=0;
- channel<=0;
- led1<=1;
- {
- 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],
- 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],
- 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],
- 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]
- }<=tab_cn;
- keyval<=0;
- end
- else begin
- keyval={h2l[7],h2l[6],h2l[5],h2l[4],h2l[3],h2l[2],h2l[1],h2l[0]};
- case(keyval)
- 8'h80:begin
- led1<=~led1;
- case(channel)
- 2'b00:begin
- d[63]<="B";
- channel<=3'd1;
- end
- 2'b01:begin
- d[63]<="C";
- channel<=3'd2;
- end
- 2'b10:begin
- d[63]<="D";
- channel<=3'd3;
- end
- 2'b11:begin
- d[63]<="A";
- channel<=3'd0;
- end
- endcase
- alter<=1;
- end
- 8'h40:begin
- led1<=~led1;
- ft<=ft-1;
- 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;
- alter<=1;
- end
- 8'h20:begin
- led1<=~led1;
- val<=val-1;
- d[13]<=val/100+8'h30;
- d[14]<=val%100/10+8'h30;
- d[15]<=val%10+8'h30;
- alter<=1;
- end
- 8'h10:begin
- led1<=~led1;
- case(wtype)
- 3'd0:begin
- {d[22],d[23],d[24],d[25],d[26],d[27],d[28]}<="三角波 ";
- wtype<=3'd1;
- end
- 3'd1:begin
- {d[22],d[23],d[24],d[25],d[26],d[27],d[28]}<="方波 ";
- wtype<=3'd2;
- end
- 3'd2:begin
- {d[22],d[23],d[24],d[25],d[26],d[27],d[28]}<="锯齿波A";
- wtype<=3'd3;
- end
- 3'd3:begin
- {d[22],d[23],d[24],d[25],d[26],d[27],d[28]}<="锯齿波B";
- wtype<=3'd4;
- end
- 3'd4:begin
- {d[22],d[23],d[24],d[25],d[26],d[27],d[28]}<="正弦波 ";
- wtype<=3'd0;
- end
- endcase
- alter<=1;
- end
- 8'h08:begin
- led1<=~led1;
- rang<=~rang;
- if(rang)begin
- {d[53],d[54],d[55]}<="2.5";
- end
- else begin
- {d[53],d[54],d[55]}<="5.0";
- end
- alter<=1;
- end
- 8'h04:begin
- led1<=~led1;
- ft<=ft+1;
- 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;
- alter<=1;
- end
- 8'h02:begin
- led1<=~led1;
- val<=val+1;
- d[13]<=val/100+8'h30;
- d[14]<=val%100/10+8'h30;
- d[15]<=val%10+8'h30;
- alter<=1;
- end
- 8'h01:begin
- led1<=~led1;
- if(mode)begin
- {d[6],d[7],d[8],d[9]}<="工作";
- mode<=0;
- end
- else begin
- {d[6],d[7],d[8],d[9]}<="测试";
- mode<=1;
- end
- alter<=1;
- end
- default:alter<=0;
- endcase
- end
复制代码 ===========================================================================
如果把上面那一段代码屏蔽掉,能编译通过,Compilation Report -Flow Summary截图如下:
===========================================================================
想知道这该怎么办,把键盘加进去的思路应该是怎样的? |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|