免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2945 | 回复: 7
打印 上一主题 下一主题

硬件接口例子 [复制链接]

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-01-11 13:42 |只看该作者 |倒序浏览
以下给一个硬件接口的例子,是前段时间的一个项目,项目中设计的cpu控制cpld的串行口,控制信号,小数据量通信.
会涉及到协议/接口电路/软件处理代码.
接口电路和软件处理代码都是为了遵循协议,电路和软件其实只是手段而已.

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
2 [报告]
发表于 2010-01-11 14:01 |只看该作者
协议

I/O信号在不通信的时候被拉低
当通信的时候,协议以连续高电平宽度来表达传输.
帧头:6.3~10us
数据1:3.5us~5.5us
数据0:0.5us~2.0us
相邻数据/帧头间隔:1us~5us
传输数据之前,先发送帧头
假设我想发送01010101,波形应该是

图1.JPG (14.43 KB, 下载次数: 12)

图1.JPG

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
3 [报告]
发表于 2010-01-11 14:03 |只看该作者
接口电路:
cpld端接口电路的verilog描述大致:

  1. module parse(clk10M,nrst,sig,data,t,head);
  2. input clk10M,nrst,sig;
  3. output data,t,head;
  4. reg data,t,head;
  5. reg sig1,sig2,sig3;
  6. reg[5:0] count_high;
  7. always@(negedge clk10M or negedge nrst)
  8. if(!nrst)
  9. begin
  10.     sig1 <= 1'b0;
  11.     sig2 <= 1'b0;
  12.     sig3 <= 1'b0;
  13. end
  14. else
  15. begin
  16.     sig1 <= sig;
  17.     sig2 <= sig1;
  18.     sig3 <= sig2;
  19. end
  20. wire sig_posedge = sig & sig1 & !sig2 & !sig3;
  21. wire sig_negedge = !sig & !sig1 & sig2 & sig3;

  22. always@(negedge clk10M or negedge nrst)
  23. if(!nrst)
  24. begin
  25.     count_high <= 0;
  26. end
  27. else
  28. begin
  29.     if(sig_negedge)
  30.        count_high <= 0;
  31.     else if(sig_posedge)
  32.        count_high <= 1;
  33.     else if((|count_high) & !(&count_high))
  34.        count_high <= count_high + 1;
  35. end

  36. always@(negedge clk10M or negedge nrst)
  37. if(!nrst)
  38. begin
  39.    head <= 1'b0;
  40.    t <= 1'b0;   
  41. end
  42. else
  43. begin
  44.    if(sig_negedge)
  45.    begin
  46.        head <= &count_high;/*>6.4us*/
  47.        t <= ~t;
  48.        if(count_high > 35 && count_high < 55)/*3.5us~5.5us*/
  49.        begin
  50.            data <= 1'b1;
  51.        end
  52.        else if(count_high > 5 && count_high < 20)/*0.5us~2.0us*/
  53.        begin
  54.            data <= 1'b0;
  55.        end
  56.    end
  57. end
  58. endmodule
复制代码

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
4 [报告]
发表于 2010-01-11 14:08 |只看该作者
以上电路用原理图来表示,大致如下:

数电.jpg (162.56 KB, 下载次数: 14)

数电.jpg

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
5 [报告]
发表于 2010-01-11 14:25 |只看该作者
以下是软件发送接口

  1. #define SEND_START() {\
  2.         register int x;\
  3.         PDATD = PDATD | ((0x1<<2));\
  4.         mypause_us(7);\
  5.         PDATD = PDATD & (~(0x1<<2));\
  6.         mypause_us(2);\
  7. }

  8. #define SEND_BIT(bit) {\
  9.         register int x;\
  10.         PDATD = PDATD | ((0x1<<2));\
  11.         if(bit)\
  12.                  mypause_us(4);\
  13.         else\
  14.                  mypause_us(1);\
  15.         PDATD = PDATD & (~(0x1<<2));\
  16.         mypause_us(2);\
  17. }

  18. void send_cpld(unsigned char* c,int len)
  19. {
  20.         int i,j;
  21.         unsigned char tmp;
  22.         SEND_START();
  23.         for(i=0;i<len;i++) {
  24.                 for(j=0;j<8;j++) {
  25.                         tmp = (c[i]&(1<<j))>>j;
  26.                         SEND_BIT(tmp);
  27.                 }
  28.         }
  29. }

复制代码

论坛徽章:
0
6 [报告]
发表于 2010-01-12 12:26 |只看该作者
代版主说句话:
爷玩的不是别的,爷玩的是寂寞

估计论坛上写硬件Core的很少..

论坛徽章:
0
7 [报告]
发表于 2010-01-13 14:43 |只看该作者

"附件审核中"? 审的也太久了吧?

论坛徽章:
0
8 [报告]
发表于 2010-07-30 18:55 |只看该作者
进来纯膜拜的

偶像~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP