搜索
bottom↓
回复: 31

谁给我编写这段verilog代码我出一百元饭钱

[复制链接]

出390入22汤圆

发表于 2017-8-1 12:18:04 | 显示全部楼层 |阅读模式
我只会AHDL语言,但是编写的程序有致命缺陷,没人指点不知错在哪里,没法继续下去,只好用其它语言重写,无奈verilog看不懂,因此找人编写个样板,注释越多越好,我照葫芦画瓢,完成我的设计,内容如下:

一个非门构成晶振电路,该晶振电路频时钟三分频得时钟A。时钟A输出。

一个计数器F,时钟为A,在第十、二十、三十、四十时钟时输出脉冲B、C、D、E,计数到100时输出脉冲P与时钟A相或(这时计数器时钟等于P、A相或一直为高电平)终止计数,计数器各位输出,B、C、D、E输出。

另一个计数器G,时钟为C、D、E合并后的信号,B为清零信号。

两个八位锁存器L、N,八位锁存器的锁存时钟是51单片机低八位通过锁存器锁存(这个锁存器的输入用下面某个三态端口输入)的总共十六位的地址总线为某个数据时,L、N输出数据相加,相加结果与G输出通过控制信号M选择某一路输出。

两个八位三态端口J、K,数据从一个端口输入,另一个端口输出,两个端口的三态控制信号分别为H、I。

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入22汤圆

发表于 2017-8-1 12:24:50 | 显示全部楼层
会ahdl,就用ahdl呗

出0入0汤圆

发表于 2017-8-1 12:34:40 | 显示全部楼层
不复杂,不过,如果是FPGA的话,建议统一时钟,不要用多时钟的方式。
ASIC的话,另说了。

出0入0汤圆

发表于 2017-8-1 12:45:10 | 显示全部楼层
画图多方便,quartuesII有原理图输入

出0入0汤圆

发表于 2017-8-1 12:49:37 | 显示全部楼层
顶楼上。原理图多方便。

出0入0汤圆

发表于 2017-8-1 12:53:52 | 显示全部楼层
你画个时序图处理把,很多地方讲不明白,比如 “ 计数到100时输出脉冲P与时钟A相或” 。

出390入22汤圆

 楼主| 发表于 2017-8-1 12:58:20 | 显示全部楼层
90999 发表于 2017-8-1 12:53
你画个时序图处理把,很多地方讲不明白,比如 “ 计数到100时输出脉冲P与时钟A相或” 。 ...

就是说脉冲P与时钟A合并作为计数器的时钟,P为高电平了,时钟就一直为高电平了,就停止计数了

出0入0汤圆

发表于 2017-8-1 13:12:04 | 显示全部楼层
liudingding 发表于 2017-8-1 12:58
就是说脉冲P与时钟A合并作为计数器的时钟,P为高电平了,时钟就一直为高电平了,就停止计数了 ...

那你P作为A的开关不就好了。

到这为止我大概明白上面怎么写,但是



两个八位锁存器L、N,八位锁存器的锁存时钟是51单片机低八位通过锁存器锁存(这个锁存器的输入用下面某个三态端口输入)的总共十六位的地址总线为某个数据时,L、N输出数据相加,相加结果与G输出通过控制信号M选择某一路输出。

两个八位三态端口J、K,数据从一个端口输入,另一个端口输出,两个端口的三态控制信号分别为H、I。

这两个又这么理解?




你把思路理清楚,不用给我100你也写得出来了。

出0入59汤圆

发表于 2017-8-1 13:25:37 | 显示全部楼层
应该学过C语言吧,verilog和C语法很像的,学起来不难

出390入22汤圆

 楼主| 发表于 2017-8-1 13:34:03 | 显示全部楼层
本帖最后由 liudingding 于 2017-8-1 15:24 编辑
90999 发表于 2017-8-1 13:12
那你P作为A的开关不就好了。

到这为止我大概明白上面怎么写,但是

好比51单片机系统有个573锁存器,锁存低八位地址,这里的锁存器的锁存时钟信号是这51系统十六位地址为某一数据如FFFF,当这个地址产生锁存时钟,好比用一个片选信号作为锁存时钟,好比接RAM,在FFFF地址锁存一个数据,在FFFE地址锁存一个数据,这两个数据作为锁存器锁存的数据处理,这里有两组锁存器,一组锁存低八位地址数据,另一组锁存特定地址的数据

两个双向端囗就是CPU和RAM之间有一个CPLD,CPLD分别两个三态端口与CPU和RAM交换数据

出390入22汤圆

 楼主| 发表于 2017-8-1 15:32:34 | 显示全部楼层
谁帮我写一下呀?

出0入0汤圆

发表于 2017-8-1 15:46:12 | 显示全部楼层
本帖最后由 90999 于 2017-8-1 17:01 编辑
liudingding 发表于 2017-8-1 13:34
好比51单片机系统有个573锁存器,锁存低八位地址,这里的锁存器的锁存时钟信号是这51系统十六位地址为某一 ...


两个八位锁存器L、N,八位锁存器的锁存时钟是51单片机低八位通过锁存器锁存(这个锁存器的输入用下面某个三态端口输入)的总共十六位的地址总线为某个数据时,L、N输出数据相加,相加结果与G输出通过控制信号M选择某一路输出。

好比51单片机系统有个573锁存器,锁存低八位地址,这里的锁存器的锁存时钟信号是这51系统十六位地址为某一数据如FFFF,当这个地址产生锁存时钟,好比用一个片选信号作为锁存时钟,好比接RAM,在FFFF地址锁存一个数据,在FFFE地址锁存一个数据,这两个数据作为锁存器锁存的数据处理,这里有两组锁存器,一组锁存低八位地址数据,另一组锁存特定地址的数据



这个我还是不明白,是下面的意思么?

P0=0x20   ->L(锁存) \
                      (+) =0x40  ->M(触发)-> G=0x30
P1=0x10   ->N(锁存) /

还是


P0=0x20   ->L(锁存) \
                      {L,N} =0x2010 ->M(触发)-> G=0x2010
P1=0x10   ->N(锁存) /







两个八位三态端口J、K,数据从一个端口输入,另一个端口输出,两个端口的三态控制信号分别为H、I。

X Y Z
H Z H
L Z H
H H L
L L L

这个是这样吧。

出390入22汤圆

 楼主| 发表于 2017-8-1 16:01:26 | 显示全部楼层
本帖最后由 liudingding 于 2017-8-1 16:10 编辑

低八位数据   74HC573(用CPLD实现573的功能) 锁存\
                                                                            51系统的十六位地址数据如FFFF译码后的片选信号作为锁存时钟    +74HC573,后面这个573是L或N,一路包含两片573,一个地址锁存器,另一个数据锁存器
高八位直通                                                           /
以上这么两路,结果相加\
                                     这两路通过M选择一路输出
另一个计数器                /

两个八位三态端口,J、K都为高电平,三态门输出三态状态,J低电平K高电平,三态门连接CPU数据端的那个三态门高阻,连接RAM的那个三态们输出CPU输入到高阻三态门的数据,J高电平K低电平,连接RAM的三态门高阻,连接CPU的那个三态门输出RAM输入到三态门的数据

出0入0汤圆

发表于 2017-8-1 16:13:17 | 显示全部楼层
本帖最后由 90999 于 2017-8-2 11:43 编辑

  1. assign XO =!XI;
  2. assign CLK_IN = XO; //XI XO 反相器接晶体
复制代码

  1. //三分频
  2. reg [1:0]q1,q2;
  3. wire q3;

  4. always @(posedge CLK_IN) //CLK_IN 是时钟
  5. case (q1)
  6. 0:q1<=1;
  7. 1:q1<=2;
  8. 2:q1<=0;
  9. default:q1<=0;
  10. endcase
  11.        
  12. always @(negedge RXCK)
  13. case (q2)
  14. 0:q2<=1;
  15. 1:q2<=2;
  16. 2:q2<=0;
  17. default:q2<=0;
  18. endcase       

  19. assign q3=q1|q2;  //q3=CLK_IN/3  q3 = CLK_IN的1/3
复制代码



  1. //
  2. assign A= (1&&P)||(  CLK_IN&&(!P)  );

  3. reg [7:0]n100;
  4. reg B,C,D,E,P;

  5. always @ (posedge  A or negedge RST)        //RST ϽµÑظ´Î»£¬·ñÔòP=1»á¹Ø±ÕʱÖÓA
  6. begin
  7.         if(!RST)
  8.                 begin
  9.                 n100=0;
  10.                 end
  11.         else
  12.                 begin
  13.                 B=0;C=0;D=0;E=0;P=0;
  14.                 if(n100==9)  B=1;
  15.                 if(n100==19) C=1;
  16.                 if(n100==29) D=1;
  17.                 if(n100==39) E=1;
  18.                 if(n100==99) P=1;
  19.                 end
  20. end
复制代码









  1. reg [7:0]m255
  2. always @( posedge ( (C||D)||(E||B) )        //任意CDEB都触发
  3. begin

  4. if(B)                        //B触发清零
  5. begin
  6. m255=0;
  7. end
  8. else
  9. begin
  10. m255=m255+1;          //其他加一
  11. end

  12. end

复制代码


       


  1. wire [wire] ADD_INA;                        //地址A 低8位
  2. reg [7:0] ADD_OUTA;

  3. always @(posedge LATCH_ADD)        //地址锁存
  4. begin
  5. ADD_OUTA = ADD_INA;
  6. end

  7. assign ADD_A = {ADD_H8A,ADD_INA}; //地址A  = 高8位低8位


  8. wire [wire] DATA_INA;        //数据A输入
  9. reg [7:0] DATA_OUTA;        //数据A输出

  10. always @(posedge LATCH_DATA) //数据锁存
  11. begin
  12. DATA_OUTA= DATA_INA;
  13. end




  14. wire [wire] ADD_INB;
  15. reg [7:0] ADD_OUTB;

  16. always @(posedge LATCH_ADD)
  17. begin
  18. ADD_OUTB= ADD_INB;
  19. end

  20. assign ADD_B = {ADD_H8A,ADD_OUTB};



  21. wire [wire] DATA_INB;
  22. reg [7:0] DATA_OUTB;

  23. always @(posedge LatchDATA)
  24. begin
  25. DATA_OUTB = DATA_INB;
  26. end


  27. assign DATA_OUT = DATA_OUTA + DATA_OUTB; //数据 = 数据A+数据B


复制代码






  1. inout [7:0] JI, KI, JO, KO;
  2. wire H,I;

  3. assign JI        =(        H?        JO                        :8'bZZZZZZZZ        );                //74HC245
  4. assign JO        =(        H?        8'bZZZZZZZZ        :JI                        );


  5. assign KI        =(        I?        KO                        :8'bZZZZZZZZ        );
  6. assign KO        =(        I?        8'bZZZZZZZZ        :KI                        );

复制代码



出0入0汤圆

发表于 2017-8-1 16:25:14 | 显示全部楼层
本帖最后由 90999 于 2017-8-1 16:26 编辑

低八位数据   74HC573(用CPLD实现573的功能) 锁存\(1)
                                                                            51系统的十六位地址数据如FFFF译码后的片选信号作为锁存时钟    +74HC573,后面这个573是L或N,一路包含两片573,一个地址锁存器,另一个数据锁存器
高八位直通                                                           /
以上这么两路,结果相加\(2)
                                     这两路通过M选择一路输出
另一个计数器                /




老实讲我还是看不懂什么意思。

  1. reg [7:0] L8_IN,L8_O;       

  2. always @( posedge  LATCH_LOW_8)         //(1)
  3. begin
  4. L8_O=L8_IN;
  5. end

  6. wire [15:0] X16;


  7. //(2)

  8. //assign X16 = {H8_I,L8_O};         //H8=0x10,L8=0x20, X16=0x1020
  9. // assign X16 = H8_I+L8_O;         //H8=0x10,L8=0x20, X16=0x30

复制代码

出390入22汤圆

 楼主| 发表于 2017-8-1 16:29:43 | 显示全部楼层
本帖最后由 liudingding 于 2017-8-1 16:38 编辑
90999 发表于 2017-8-1 16:25
低八位数据   74HC573(用CPLD实现573的功能) 锁存\(1)
                                                ...


要这个
//assign X16 = {H8_I,L8_O}; //
H8=0x10,L8=0x20, X16=0x1020     , X16=0x1020译码后的片选信号作为锁存时钟锁存地址为0x1020时的数据,这就是L或N


非门做上了吗?


always @( posedge ( (C||D)||(E||B) )
begin
//???????????
end
复制代码
这个完善一下吧

出0入0汤圆

发表于 2017-8-1 16:29:52 | 显示全部楼层
楼主如果能想明白逻辑 说不定直接原理图也就出来了

出0入0汤圆

发表于 2017-8-1 16:32:58 来自手机 | 显示全部楼层
哈哈,100块的红包,诱人啊~

出0入0汤圆

发表于 2017-8-1 16:43:53 | 显示全部楼层
51的外置RAM , 应该是 地址,数据,锁存,读写 这些IO。 你要用单P0来处理,那么就要用一个573来锁存地址
那么就是P0=ADDRESS, 地址573锁存, P0=Z/DATA,  读写=READ/WRITE , 锁存RAM, 然后就能操作RAM了。

双向三态口,这个我没用过,也不知道能不能用,你自己试试了。

inout X;Y;
input oe;
assign X=oe?Y:Z;
assign Y=oe?Z:X;

出0入0汤圆

发表于 2017-8-1 16:45:08 | 显示全部楼层
jlhgold 发表于 2017-8-1 16:29
楼主如果能想明白逻辑 说不定直接原理图也就出来了

  我都说过了,他自己都表达不清楚。

出0入0汤圆

发表于 2017-8-1 16:58:38 | 显示全部楼层
fuze2009 发表于 2017-8-1 16:32
哈哈,100块的红包,诱人啊~

他给钱,我就是收,他不给钱,我就是雷锋。

我要再多他也没有,纯粹给论坛丢点范例,顺便弄点零花钱。






出0入0汤圆

发表于 2017-8-1 17:14:15 | 显示全部楼层
liudingding 发表于 2017-8-1 16:29
要这个
//assign X16 = {H8_I,L8_O}; //
H8=0x10,L8=0x20, X16=0x1020     , X16=0x1020译码后的片选信 ...

非门是 "!" ,取反是"~"



always @( posedge ( (C||D)||(E||B) )
begin
//???????????
end


这个我都不明白你实现什么?
随便画的SB的时序图

A(0)-(A9)-A(19)-A(29)-A(39)-A(99)-H
B000010000000000000000000000000
C000000000100000000000000000000
D000000000000001000000000000000
E000000000000000000010000000000
P000000000000000000000000001111



计数器G要实现什么样的图形,你要干什么,一会说CDE合并做时钟,B复位,一下说要和H8L8做片选?
B001000000000000100   
C000000001000000000
D000000000100000000   
E000000000010000000
变成
S0000000001111111000
S1000000000111111000
S2000000000011111000

这样?

那你就写

if(B)
begin
S=0;
end
if(C) S[0]=1;
if(D) S[1]=1;
if(E) S[2]=1;


出0入0汤圆

发表于 2017-8-1 17:17:03 | 显示全部楼层
你要单片机选地址,然后把计数器CDE状态存进去,然后过段时间读出来?

出390入22汤圆

 楼主| 发表于 2017-8-1 19:26:29 | 显示全部楼层
本帖最后由 liudingding 于 2017-8-1 19:33 编辑
90999 发表于 2017-8-1 17:17
你要单片机选地址,然后把计数器CDE状态存进去,然后过段时间读出来?


画了个图

本帖子中包含更多资源

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

x

出0入0汤圆

发表于 2017-8-1 20:32:32 | 显示全部楼层

CDE 来信号加1,B来信号清零就简单了。


  1. reg [7:0]m255
  2. always @( posedge ( (C||D)||(E||B) )
  3. begin

  4. if(B)
  5. begin
  6. m255=0;
  7. end
  8. else
  9. begin
  10. m255=m255+1;
  11. end


  12. end
复制代码

出0入0汤圆

发表于 2017-8-1 20:38:35 | 显示全部楼层

  1. wire [7:0] L8_IN;
  2. reg [7:0]L8_O;        

  3. always @( posedge  LATCH_LOW_8)         //(1)
  4. begin
  5. L8_O=L8_IN;
  6. end

  7. wire [15:0] X16;


  8. //(2)

  9. assign X16 = {H8_I,L8_O};         //H8=0x10,L8=0x20, X16=0x1020
  10. // assign X16 = H8_I+L8_O;         //H8=0x10,L8=0x20, X16=0x30



  11. wire [wire] DATA_IN;
  12. reg [7:0] DATA_OUT;
  13. always @(posedge LatchDATA)
  14. begin
  15. DATA_OUT = DATA_IN;
  16. end

  17. //assign DATA_OUT_3 = DATA_OUT_1 + DATA_OUT_2;



复制代码


自己修改组合一下应该差不多了。

出390入22汤圆

 楼主| 发表于 2017-8-1 21:33:36 | 显示全部楼层
90999 发表于 2017-8-1 20:38
自己修改组合一下应该差不多了。

款给你打过去了,请查收。
最后麻烦你照一楼要求把各部分合成一个文件就行了。
我把我程序中需要的几个不同部分画入这个图,因此从该图看不出干什么。
第二个计数器是在第一个计数器基础上进行计数,达到效果是脉冲CDE到来后输出不同状态,B进行清零,可以连续输出一连串的周期性脉冲信号。

本帖子中包含更多资源

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

x

出0入0汤圆

发表于 2017-8-1 22:35:31 | 显示全部楼层
liudingding 发表于 2017-8-1 21:33
款给你打过去了,请查收。
最后麻烦你照一楼要求把各部分合成一个文件就行了。
我把我程序中需要的几个不 ...

去14楼看。

出390入22汤圆

 楼主| 发表于 2017-8-2 07:24:33 来自手机 | 显示全部楼层
好,我慢慢整一下看看

出390入22汤圆

 楼主| 发表于 2017-8-2 10:29:39 | 显示全部楼层
本帖最后由 liudingding 于 2017-8-2 11:16 编辑


程序上机过了一遍,除了第一个计数器外都通过了,你把第一个计数器的程序编译通过贴出来吧,这一关过了就没疑问了,贴出编译通过的程序交易结束

出0入0汤圆

发表于 2017-8-2 11:43:54 | 显示全部楼层
本帖最后由 90999 于 2017-8-2 11:46 编辑
liudingding 发表于 2017-8-2 10:29
程序上机过了一遍,除了第一个计数器外都通过了,你把第一个计数器的程序编译通过贴出来吧,这一关过了就 ...


  1. assign A= (1&&P)||(  CLK_IN&&(!P)  );

  2. reg [7:0]n100;
  3. reg B,C,D,E,P;

  4. always @ (posedge  A or negedge RST)        //RST ϽµÑظ´Î»£¬·ñÔòP=1»á¹Ø±ÕʱÖÓA
  5. begin
  6.         if(!RST)
  7.                 begin
  8.                 n100=0;
  9.                 end
  10.         else
  11.                 begin
  12.                 B=0;C=0;D=0;E=0;P=0;
  13.                 if(n100==9)  B=1;
  14.                 if(n100==19) C=1;
  15.                 if(n100==29) D=1;
  16.                 if(n100==39) E=1;
  17.                 if(n100==99) P=1;
  18.                 end
  19. end
复制代码


稍微漏点东西你自己改不好么?


本帖子中包含更多资源

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

x

出390入22汤圆

 楼主| 发表于 2017-8-2 12:06:07 来自手机 | 显示全部楼层
这就没问题了
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-25 14:27

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表