微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > FPGA,CPLD和ASIC > 问一个Quartus的问题

问一个Quartus的问题

时间:10-02 整理:3721RD 点击:
最近用CPLD控制单片机写数据到RAM中去的一段程序如下,使用Quartus时发现在编译后的报告一个很迷惑的问题:
Total logic elements 0/240 (0%),就是说根本没有进行内部逻辑综合了?好心人帮帮,谢谢!
// fre=50MHZ(20ns),tCPH=80ns;
module TFT(clk,A,D,nCS3,nWE,nOE,
VD_L,VD_H,
VA,VOE,VCE,VWE,UE,LE);

input clk;
input [1:0]A;
input [7:0]D;
input nCS3,nWE,nOE;
inout [7:0]VD_L;
inout [7:0]VD_H;
output[15:0]VA;
output VOE,VCE,VWE,UE,LE;
reg s,y;
reg [7:0]VD_L;
reg [7:0]VD_H;
reg D_XL,D_XH,D_Y,D_DAT;
reg [15:0]VA;
reg [15:0]ADDR;
reg VOE,VCE,VWE,UE,LE;
reg [2:0] cyc_Reg;
reg [1:0] CPU_RAM;
reg [1:0] cyc_cnt;
regclk_W;
reg[1:0] cnt_W;
///////////第二部分的操作,对于读写RAM的数据//////////////////////
always@(posedge[/email] clk)//T=40ns
begin
cnt_W=cnt_W+1;
if(cnt_W==2)
clk_W=~clk_W;
end
always@(posedge[/email] clk_W)
begin
/////二:对RAM的写操作!//////
if(nCS3==0) //有了写操作,这是标志读写的关键!
begin
if(nWE==0) //写起动信号,一旦置低,则根据相应的地址判断!
begin
//******************************************************//
if(CPU_RAM==0)
begin
if(A==2'b10)//根据不同的CMD值来看是显示,清平还是八点写!
begin
if(D==0)//1:基本显示功能!
s=1;
end
if(s==1)//1:基本显示功能!
begin
if(A==2'b00)//X
begin
cyc_Reg=cyc_Reg+1;//ooo
if(cyc_Reg==1)
D_XL=D;
if(cyc_Reg==2)
begin
D_XH=D;
cyc_Reg=0;
end
end
end
if(A==2'b01)//Y
begin
D_Y=D;
end
if(A==2'b11)//DAT
begin
D_DAT=D;
CPU_RAM=1;//把数据存入RAM的标志!
end
end
end
end
//******************************************************//
//////////////////////////////////////////////////////////
if(CPU_RAM==1)
begin
LE=0;
UE=0;
if(cyc_cnt==0)
begin
VWE=1;
if(y<117)
begin
ADDR=D_Y*320+D_XH*256+D_XL;
VA=ADDR;
VD_L=D_DAT;
end
else
begin
ADDR=(D_Y-117)*320+D_XH*256+D_XL;
VA=ADDR;
VD_H=D_DAT;
end
end
if(cyc_cnt==1)
begin
VWE=0;
CPU_RAM=0;
cyc_cnt=0;
end
cyc_cnt=cyc_cnt+1;
end
//////////////////////////////////////////////////////////
end
endmodule

你代码写那么乱, 都没有层次,怎么会有人看进去呢?

能把tool给出的报告贴出来吗?

+------------------------------------------------------------------+
; Fitter Summary;
+-----------------------+------------------------------------------+
; Fitter Status; Successful - Wed Sep 05 13:47:04 2007;
; Quartus II Version; 6.0 Build 178 04/27/2006 SJ Full Version ;
; Revision Name; TFT;
; Top-level Entity Name ; TFT;
; Family; MAX II;
; Device; EPM240T100C5;
; Timing Models; Final;
; Total logic elements; 0 / 240 ( 0 % );
; Total pins; 51 / 80 ( 64 % );
; Total virtual pins; 0;
; UFM blocks; 0 / 1 ( 0 % );
+-----------------------+------------------------------------------+
+--------------------------------------------------------------------------------------------------------------------------+
; Fitter Settings;
+--------------------------------------------------------+--------------------------------+--------------------------------+
; Option; Setting; Default Value;
+--------------------------------------------------------+--------------------------------+--------------------------------+
; Device; EPM240T100C5;;
; Auto Register Duplication; Off; Auto;
; Use smart compilation; Off; Off;
; Router Timing Optimization Level; Normal; Normal;
; Placement Effort Multiplier; 1.0; 1.0;
; Router Effort Multiplier; 1.0; 1.0;
; Optimize Hold Timing; IO Paths and Minimum TPD Paths ; IO Paths and Minimum TPD Paths ;
; Optimize Fast-Corner Timing; Off; Off;
; Guarantee I/O Paths Have Zero Hold Time at Fast Corner ; On; On;
; PowerPlay Power Optimization; Normal compilation; Normal compilation;
; Optimize Timing; Normal compilation; Normal compilation;
; Optimize IOC Register Placement for Timing; On; On;
; Limit to One Fitting Attempt; Off; Off;
; Final Placement Optimizations; Automatically; Automatically;
; Fitter Aggressive Routability Optimizations; Automatically; Automatically;
; Fitter Initial Placement Seed; 1; 1;
; Slow Slew Rate; Off; Off;
; PCI I/O; Off; Off;
; Weak Pull-Up Resistor; Off; Off;
; Enable Bus-Hold Circuitry; Off; Off;
; Auto Delay Chains; On; On;
; Perform Physical Synthesis for Combinational Logic; Off; Off;
; Perform Register Duplication; Off; Off;
; Perform Register Retiming; Off; Off;
; Perform Asynchronous Signal Pipelining; Off; Off;
; Fitter Effort; Auto Fit; Auto Fit;
; Physical Synthesis Effort Level; Normal; Normal;
; Logic Cell Insertion - Logic Duplication; Auto; Auto;
; Auto Global Clock; On; On;
; Auto Global Register Control Signals; On; On;
; Always Enable Input Buffers; Off; Off;
+--------------------------------------------------------+--------------------------------+--------------------------------+

学习了
看不到

肯定是没有综合进去,我以前遇到过这个问题,你可以先找一个小程序综合一下,看看至少能综合出东西,然后再找找你的程序的问题,也有可能是设置的问题

为了好看,我修改了你的代码风格:
module TFT(clk,A,D,nCS3,nWE,nOE,
VD_L,VD_H,
VA,VOE,VCE,VWE,UE,LE);
//ports
input clk;
input [1:0]A;
input [7:0]D;
input nCS3,nWE,nOE;
inout [7:0]VD_L;
inout [7:0]VD_H;
output[15:0]VA;
output VOE,VCE,VWE,UE,LE;
//regs
reg s,y;
reg [7:0]VD_L;
reg [7:0]VD_H;
reg D_XL,D_XH,D_Y,D_DAT;
reg [15:0]VA;
reg [15:0]ADDR;
reg VOE,VCE,VWE,UE,LE;
reg [2:0] cyc_Reg;
reg [1:0] CPU_RAM;
reg [1:0] cyc_cnt;
regclk_W;
reg [1:0] cnt_W;
//divide clk
always@( posedge clk )//T=40ns
begin
cnt_W <= cnt_W+1;
if(cnt_W==2)
clk_W <= ~clk_W;
end
always@( posedge clk_W )
begin
if( nCS3 == 0 ) //有了写操作,这是标志读写的关键!
if( nWE == 0 ) //写起动信号,一旦置低,则根据相应的地址判断!
begin
if( CPU_RAM == 0 )
begin
if( A == 2'b10 && D == 0 )//根据不同的CMD值来看是显示,清平还是八点写!
s <= 1;
else if( A == 2'b00 && s == 1 )//1:基本显示功能!
begin
cyc_Reg <= cyc_Reg+1;
if( cyc_Reg == 1 )
D_XL <= D;
else if( cyc_Reg == 2 )
begin
D_XH <= D;
cyc_Reg <= 0;
end//end if( cyc_Reg == 2)
end // end if( A == 2'b00 && s == 1 )
else if(A==2'b01)
D_Y <= D;
else if(A==2'b11)//DAT
begin
D_DAT <= D;
CPU_RAM <= 1;//把数据存入RAM的标志!
end //end if(A==2'b01)
end
else if(CPU_RAM==1)
begin
LE <= 0;
UE <= 0;
if( cyc_cnt==0 )
begin
VWE <= 1;
if( y < 117 )
begin
ADDR <= D_Y*320+D_XH*256+D_XL;
VA<= ADDR;
VD_L <= D_DAT;
end //end if( y < 117 )
else
begin
ADDR <= (D_Y-117)*320+D_XH*256+D_XL;
VA<= ADDR;
VD_H <= D_DAT;
end
end
else if( cyc_cnt == 1 )
begin
VWE <= 0;
CPU_RAM <= 0;
cyc_cnt <= 0;
end //end else if( cyc_cnt == 1 )
cyc_cnt=cyc_cnt+1;
end //end if(nWE==0)
end
endmodule
初步检查你的代码,就发现如下几个问题:
(1)VD_L、VD_H声明为双向信号,但在该模块中只写不读,实质仅是输出信号!
(2)模块中没有任何关于nOE、VOE和VCE的逻辑。
(3)D_XL、D_XH、D_Y和D_DAT四个寄存器应该是8位,但却声明为1bit reg
(4)如果你想表示VA是ADDR寄存器的输出时,就直接使用assign语句在always语句外赋值,像你这种写法:
ADDR = D_Y*320+D_XH*256+D_XL;
VA= ADDR;
会导致综合和仿真结果不一致,VA的值不是当前ADDR更新的值而是时钟上升沿之前的旧值!
(5)设计中D_XL、D_XH、D_Y和D_DAT只赋值而不使用,这会被synthesized away(除非你没有把整个模块代码贴完整!)
(6)cyc_Reg和cyc_cnt的逻辑容易出现问题,最好改为(以cyc_cnt为例):
if( cyc_cnt == 0 )
begin
cyc_cnt <= 1;
...
end
else if( cyc_cnt == 1 )
begin
cyc_cnt <= 0;
...
end
总之,看你的代码很费劲,coding-style需要改进,否则逻辑很容易出问题,调试也不容易,最好是多分几个always块描述时序逻辑,不要
都写在一个always中!另外begin/end不要滥用,多层套用begin/end最好在end做说明,以提高可读性,if最好用elseif分支,不要顺序的
写if,特别对多个if条件都是完全互斥的情况,这样逻辑要清晰多,也要尽可能减少if嵌套,多个条件可以组合起来。
另外,综合工具将逻辑综合掉(synthesized away)是有原因的,一般分为以下几个情况:
(1)逻辑是冗余的。
(2)逻辑对输出没有任何影响(直接的或间接的)。
(3)仅仅执行一次逻辑,而不会再次触发执行。(例如:企图用HDL描述上电操作)。
如果不出现这些情况,一般是不会被综合掉,具体原因就需要仔细检查你的设计了。

谢谢你,大侠,我是个新手,听了你的建议很受用!

呵呵,我的也解决了,谢谢上面的大侠

要用用硬件思想来写

不要用软件编程的思路来写

最好先画好电路模块,再编码,否则谁也看不懂

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

网站地图

Top