打印

请各位DX帮看看这个Verilog简单程序有问题吗。

[复制链接]
3696|16
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wayner|  楼主 | 2007-9-2 10:12 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我写了个Verilog简单程序,时钟信号输入是clk,输出:7个共阴极数码管段位seg(包括小数点共8段),7个位选择位是bit7。
程序思路:时钟信号送到8个10进制计数器计数,将前7位计数结果用数码管动态显示下来。完整程序如下:
module BCD7dp(seg,bit7,clk);
  output [7:0]seg;       //LED segment
  output [6:0]bit7;      //LED bit select  
  input clk;
  
  reg [7:0]seg_rg;
  wire [3:0]BD;
  reg [6:0]bt_rg;
  reg [2:0]cntl_rg;
  wire [32:1]ctdat;
  wire [8:1]tmp; 
  wire [2:0]cotl;
  reg global_rst;    
  //下面是8个十进制计数器
  ct4b U1(ctdat[4:1],tmp[1],global_rst,clk),
    U2(ctdat[8:5],tmp[2],global_rst,tmp[1]),
    U3(ctdat[12:9],tmp[3],global_rst,tmp[2]),
    U4(ctdat[16:13],tmp[4],global_rst,tmp[3]),
    U5(ctdat[20:17],tmp[5],global_rst,tmp[4]),
    U6(ctdat[24:21],tmp[6],global_rst,tmp[5]),
    U7(ctdat[28:25],tmp[7],global_rst,tmp[6]),
    U8(ctdat[32:29],tmp[8],global_rst,tmp[7]);  
  //下面是4个8选1选择器,实际用7选1
  MUX8sel U10(BD[3],{ctdat[8],ctdat[12],ctdat[16],ctdat[20],ctdat[24],ctdat[28],ctdat[32],ctdat[4]},cotl),
    U11(BD[2],{ctdat[7],ctdat[11],ctdat[15],ctdat[19],ctdat[23],ctdat[27],ctdat[31],ctdat[3]},cotl),
    U12(BD[1],{ctdat[6],ctdat[10],ctdat[14],ctdat[18],ctdat[22],ctdat[26],ctdat[30],ctdat[2]},cotl),
    U13(BD[0],{ctdat[5],ctdat[9],ctdat[13],ctdat[17],ctdat[21],ctdat[25],ctdat[29],ctdat[1]},cotl);
  
  always @(tmp[3])    //七段码译码器
  begin
  case(BD[3:0]) // hgfe_dcba
    0:seg_rg=8'b0011_1111;    //      a
    1:seg_rg=8'b0000_0110;    //
    2:seg_rg=8'b0101_1011;    //   f      b 
    3:seg_rg=8'b0100_1111;    //
    4:seg_rg=8'b0110_0110;    //      g
    5:seg_rg=8'b0110_1101;    //
    6:seg_rg=8'b0111_1101;    //   e      c      
    7:seg_rg=8'b0000_0111;    //
    8:seg_rg=8'b0111_1111;    //      d      h
    9:seg_rg=8'b0110_0111;    //common 
    default:seg_rg=8'bx;       //
    endcase
   end 
  
   always @(tmp[6])    //七位计数
   begin
        cntl_rg=cntl_rg+1;
        if(cntl_rg==7)
              cntl_rg=0;                          
   end
   
   always @(tmp[6])    //7位要显示位的选择器
   begin
       case(cntl_rg[2:0])
           0:bt_rg=7'b000_0001;
           1:bt_rg=7'b000_0010;
           2:bt_rg=7'b000_0100;
           3:bt_rg=7'b000_1000;
           4:bt_rg=7'b001_0000;
           5:bt_rg=7'b010_0000;
           6:bt_rg=7'b100_0000;
           default:bt_rg=7'bx;
       endcase
   end         
   
   assign seg=seg_rg;
   assign bit7=bt_rg;
   assign global_rst=1;
endmodule

module MUX8sel(ot,I8,cnl3);
    output ot;
    reg    ot;
    input  [0:7]I8;
    input  [0:2]cnl3;

    always @(I8 or cnl3)
    begin 
      case(cnl3)
          0:ot=I8[0];
          1:ot=I8[1];
          2:ot=I8[2];
          3:ot=I8[3];
          4:ot=I8[4];
          5:ot=I8[5];
          6:ot=I8[6];
          7:ot=I8[7];
      endcase    
    end      
endmodule
    
module ct4b(q,cout,global_rst,clk); 
  output [3:0]q;
  output cout;   
  input global_rst;  
  input clk;   
    
  reg [3:0]q;  
  reg cout;  
    
  always @(global_rst)
    begin 
     if(!global_rst)
       begin
           assign q=4'b0000;
      assign cout=0;
       end
    else    
      begin
        deassign q;
        deassign cout;
     end   
   end
      
  always @(posedge clk)
    begin
      q = q+1;
      if(q==4'b1010)
        begin
            q=4'b0000;
          cout=1;
        end 
      else        
        cout=0;
  end  
endmodule           

可是用ISE9。1编译时出现如下错误:
Started : "Fit".
WARNING:Cpld - The signal(s) 'cntl_rg<0>' are in combinational feedback loops.
   These signals may cause hazards/glitches. Apply the NOREDUCE parameter to the hazard reduction circuitry.
   Timing analysis of paths involving this node may be inaccurate or incomplete.
WARNING:Cpld - The signal(s) '_old_cntl_rg_1<1>' are in combinational feedback loops.
   These signals may cause hazards/glitches. Apply the NOREDUCE parameter to the hazard reduction circuitry.
   Timing analysis of paths involving this node may be inaccurate or incomplete.
WARNING:Cpld - The signal(s) 'cntl_rg_cmp_eq0000' are in combinational feedback loops.
   These signals may cause hazards/glitches. Apply the NOREDUCE parameter to the hazard reduction circuitry.
   Timing analysis of paths involving this node may be inaccurate or incomplete.
WARNING:Cpld - The signal(s) '_old_cntl_rg_1<2>' are in combinational feedback loops.
   These signals may cause hazards/glitches. Apply the NOREDUCE parameter to the hazard reduction circuitry.
   Timing analysis of paths involving this node may be inaccurate or incomplete.

ERROR:Cpld:892 - Cannot place signal cntl_rg<0>. Consider reducing the
   collapsing input limit or the product term limit to prevent the fitter from creating high input and/or high product term functions.
.....
ERROR:Cpld:868 - Cannot fit the design into any of the specified devices with the selected implementation options.

Process "Fit" failed
请问DX,程序到底有没有问题啊?变量cntl_rg有什么不妥的?将它改为wire也不行

相关帖子

沙发
wayner|  楼主 | 2007-9-3 16:33 | 只看该作者

顶!这是一个简单实验,程序其实很小,请指导

使用特权

评论回复
板凳
wayner|  楼主 | 2007-9-11 15:18 | 只看该作者

没人会?还是太简单了?

使用特权

评论回复
地板
风中De舞者| | 2007-9-12 13:24 | 只看该作者

可能是由于你选择的器件不对 或者没有选择器件

使用特权

评论回复
5
sibaidong| | 2007-9-12 21:10 | 只看该作者

我用的是QuartusII

要不就可以帮你看看!
写得太多了,先写一位的驱动试试吧!

使用特权

评论回复
6
wayner|  楼主 | 2007-9-13 08:02 | 只看该作者

谢谢回复

谢谢风中De舞者:
 我选择的器件是XC9572XL-TQ100-7,用的软件是xilinx ISE9.1,选择是正确的。
谢谢sibaidong:
 请帮我看看吧。我用的器件XC9572XL内有72个D触发器,资源应该够了。
8个BCD码计数器用32个D触发器,管选择位的7进制计数器用3个D触发器

使用特权

评论回复
7
wayner|  楼主 | 2007-9-13 16:14 | 只看该作者

这版比侃单片机冷清多了,是用CPLD的人少?本版在业界知名

使用特权

评论回复
8
hapyang| | 2007-9-17 18:38 | 只看该作者

是不是这一点的问题

 always @(tmp[6])    //七位计数
   begin
        cntl_rg=cntl_rg+1;
        if(cntl_rg==7)
              cntl_rg=0;                          
   end


tmp[6]是不是有问题?
我用的是vhdl,看wanrning里好像是这得问题

使用特权

评论回复
9
wayner|  楼主 | 2007-9-20 15:23 | 只看该作者

谢谢hapyang,不是tmp[6]的问题,我画电原理图来实现也不行

使用特权

评论回复
10
wayner|  楼主 | 2007-9-22 16:58 | 只看该作者

看的人多,没人想回?

使用特权

评论回复
11
wrhwindboy| | 2007-10-31 17:58 | 只看该作者

请各位DX帮看看这个Verilog简单程序有问题吗。

你的assign 有没有用对地方哦
乱来的吧。你对reg 也用assign?

使用特权

评论回复
12
jzt369| | 2007-11-10 10:06 | 只看该作者

!

从软件提示的信息来看
1、组合电路会引起毛刺
2、器件资源不够放不下,can't fit

使用特权

评论回复
13
shang21ic| | 2007-11-10 23:47 | 只看该作者

我是初学者.

   最近工作的需要,边做边学了2个月的cpld,感觉入门容易,但是做项目梢复杂一点就问题出来了.语言虽然简单,一般用assign,always就可以实现,但是却不向C语言那样有条理有顺序的执行;verilog毕竟是硬件描述语言,必须对硬件要清楚,所以即使你描述的语言没错误,但是却有可能硬件是无法实现的.
   现在总结了一点经验:
1.程序分模块写,把每个模块都仿真无误.
2.顶层采用原理图把各个模块连接,这样比较直观,方面以后程序文档化.
3.pcb设计的时候尽量把无用到的引脚(2~5个)也引出去做测试点,方便调试.
4.使用多宗示波器观察时序.

使用特权

评论回复
14
vongy| | 2007-11-11 21:13 | 只看该作者

在组合逻辑里使用cntl_rg=cntl_rg+1??一般情况下都会出错的

使用特权

评论回复
15
xjg1111| | 2007-11-14 23:23 | 只看该作者

从提示上看应该不是代码的问题

可能是器件、管脚配置,是否匹配的问题。

使用特权

评论回复
16
hehui525| | 2007-11-22 14:53 | 只看该作者

问题挺多

 always @(tmp[6])    //七位计数
   begin
        cntl_rg=cntl_rg+1;
        if(cntl_rg==7)
              cntl_rg=0;                          
   end
   
看这段程序就有很多问题:1:tmp[6]是时钟吗?是时钟应该指明上升沿或者下降沿触发,。2:内部的=应该为<=。 这些你需要参考代码风格指南。
我的博客有这方面的**,你可以参考下:http://www.fpga.00bp.com

使用特权

评论回复
17
wayner|  楼主 | 2007-11-22 16:34 | 只看该作者

谢谢hehui525,谢谢大家

always @(tmp[6])这一句是没有错的,它是对电平触发。
assign用的也是对的

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

53

主题

848

帖子

1

粉丝