硬件接口例子

发布于 2022-09-18 16:47:07 字数 123 浏览 13 评论 0

以下给一个硬件接口的例子,是前段时间的一个项目,项目中设计的cpu控制cpld的串行口,控制信号,小数据量通信.
会涉及到协议/接口电路/软件处理代码.
接口电路和软件处理代码都是为了遵循协议,电路和软件其实只是手段而已.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

王权女流氓 2022-09-25 16:47:07

协议

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

冰魂雪魄 2022-09-25 16:47:07

接口电路:
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

复制代码

月棠 2022-09-25 16:47:07

以上电路用原理图来表示,大致如下:

绝影如岚 2022-09-25 16:47:07

以下是软件发送接口

  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. }

复制代码

青瓷清茶倾城歌 2022-09-25 16:47:07

代版主说句话:
爷玩的不是别的,爷玩的是寂寞

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

绝情姑娘 2022-09-25 16:47:07


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

暮光沉寂 2022-09-25 16:47:07

进来纯膜拜的

偶像~~

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文