liudingding 发表于 2017-7-28 11:28:07

请帮忙看看下面另外几个verilog HDL程序问题如何修改

本帖最后由 liudingding 于 2017-7-28 11:29 编辑

程序中第一个计数器能计数,想在几个特定数值输出脉冲信号,这几个脉冲信号作为清零信号或者合并后作为下一个计数器的时钟。但是第二个计数器不能计数。

另一个问题,第一个计数器程序中qy、hy、dec、yh等需要设定为reg(我理解reg型数据为寄存器型数据)型数据才能正常编译,我想把它们设定为门电路合并后数据,就是wire型数据,不想成为寄存器数据,怎么办。

第三个问题,三态数据d(程序中加************)想设定为八位,但是无论哪里加上,就是:d,程序都报错。我理解程序:assign d =!wr?fh:8'bz;是八位但是引脚设置就一位。

module CPLD(cs1,cs2,in,out,ck_out,
            fh,d,ra,hs,vs,pclk,wr);
         input in,    wr;
       output out,ck_out,cs1,hs,vs,pclk,cs2;   
         assign out    =!in;
       output fh;//
       reg    fh;
       
       inout d;//***************************************
       output ra;//ra:ram地址
       reg    ra;
       reg   fj;
       reg   fi;
       reg   fk;
       
       reg v0,v1,v2,v3,fkk,vv,ve;
       reg js,qy,hy,dec,yh,fjk,hs,vs,he,hh;
       
       assign d =!wr?fh:8'bz;//*****************************************
       
       assign ck_out = in;
       assign pclk   = in;
       assign cs1    = fj;
       assign cs2    = pclk;
             always @(posedge in)
                  begin
                           if(!js)    fh<=0;
                           else             fh<= fh+1;
                                if(fh==0)   qy=1;
                                if(fh==48)    hy=1;
                                if(fh==88)   dec=1;
                                if(fh==850)   yh=1;
                           if(fh==928)   js=1;
                               fjk=hy|dec|yh;
                                end
             always @(posedge fjk)
                  begin
                           if(!qy)   fj<=0;
                           else          fj<= fj+1;
                                if(fj==0)    hh=1;
                           if(fj==2)    he=1;
                                   hs    =!hh;
                                end
             always @(posedge qy)
                  begin
                           if(!v3)    fi<=0;
                           else             fi<= fi+1;
                                if(fi==0)   v0=1;
                           if(fi==3)   v1=1;
                                if(fi==29)    v2=1;
                                if(fi==525)   v3=1;
                                  fkk= v1|v2;
                                end
             always @(posedge fkk)
                  begin
                           if(!v0)    fk<=0;
                           else             fk<= fk+1;
                                if(fk==0)   vv=1;
                           if(fk==2)   ve=1;
                                        vs   =!vv;
                                end
      always @(posedge in)
                  beginra <=ra+1;   end
                       
endmodule

ArthurBruin 发表于 2017-7-28 11:48:07

楼主代码问题很多,并且程序很杂乱,我想很多想帮忙的人都因为懒得梳理你的程序放弃帮忙了
我说几点:
1.时序逻辑里面最好只用 “《=”赋值,这是基本原则,否则你代码量大了之后,出问题后时序查找很麻烦;
2.不允许用中间变量当时钟用,非要这样用的话,请与全局时钟同步,理由如上;
3.时序逻辑里面 always 左值 只能是reg型变量,你想想看用wire型怎么输出,wire就只是一条导线,如何做逻辑变换?
4.代码风格混乱
... ...
综上,楼主HDL功底还很差,请多看看基础书籍,自己多找找答案再提问,论坛里面很多太基础的东西大家都不削于回答你,因为网上一大把资料
明白了吧?

RAMILE 发表于 2017-7-29 12:19:02

楼主HDL功底还很差,请多看看基础书籍,100块我不敢要了

liudingding 发表于 2017-7-29 12:58:07

RAMILE 发表于 2017-7-29 12:19
楼主HDL功底还很差,请多看看基础书籍,100块我不敢要了

是我的AHDL语言程序,不是这段verilog HDL程序

RAMILE 发表于 2017-7-29 13:47:34

liudingding 发表于 2017-7-29 12:58
是我的AHDL语言程序,不是这段verilog HDL程序

把你程序 发出了看看
页: [1]
查看完整版本: 请帮忙看看下面另外几个verilog HDL程序问题如何修改