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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 6221|回复: 9

问一个Quartus的问题

[复制链接]
发表于 2007-9-4 11:39:42 | 显示全部楼层 |阅读模式

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

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

x
最近用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;
reg  clk_W;
reg  [1:0] cnt_W;
///////////第二部分的操作,对于读写RAM的数据//////////////////////
[email=always@(posedge]always@(posedge[/email] clk)//T=40ns
begin
cnt_W=cnt_W+1;
if(cnt_W==2)
clk_W=~clk_W;
end
[email=always@(posedge]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
发表于 2007-9-4 17:06:38 | 显示全部楼层
你代码写那么乱, 都没有层次,怎么会有人看进去呢?

能把tool给出的报告贴出来吗?
 楼主| 发表于 2007-9-5 13:52:37 | 显示全部楼层
+------------------------------------------------------------------+
; 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                            ;
+--------------------------------------------------------+--------------------------------+--------------------------------+
发表于 2007-9-6 11:16:51 | 显示全部楼层
学习了
看不到
发表于 2007-9-15 22:36:44 | 显示全部楼层
肯定是没有综合进去,我以前遇到过这个问题,你可以先找一个小程序综合一下,看看至少能综合出东西,然后再找找你的程序的问题,也有可能是设置的问题
发表于 2007-9-15 23:51:09 | 显示全部楼层
为了好看,我修改了你的代码风格:
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;
reg                  clk_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描述上电操作)。
如果不出现这些情况,一般是不会被综合掉,具体原因就需要仔细检查你的设计了。
 楼主| 发表于 2007-9-21 14:54:24 | 显示全部楼层
谢谢你,大侠,我是个新手,听了你的建议很受用!
发表于 2007-9-22 13:03:09 | 显示全部楼层
呵呵,我的也解决了,谢谢上面的大侠
发表于 2007-9-23 10:08:44 | 显示全部楼层
要用用硬件思想来写

不要用软件编程的思路来写
发表于 2007-9-23 20:25:58 | 显示全部楼层
最好先画好电路模块,再编码,否则谁也看不懂
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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


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

GMT+8, 2024-12-27 21:10 , Processed in 0.037464 second(s), 10 queries , Gzip On, Redis On.

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