cjaizss 发表于 2010-01-11 13:42

硬件接口例子

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

cjaizss 发表于 2010-01-11 14:01

协议

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

cjaizss 发表于 2010-01-11 14:03

接口电路:
cpld端接口电路的verilog描述大致:

module parse(clk10M,nrst,sig,data,t,head);
input clk10M,nrst,sig;
output data,t,head;
reg data,t,head;
reg sig1,sig2,sig3;
reg count_high;
always@(negedge clk10M or negedge nrst)
if(!nrst)
begin
    sig1 <= 1'b0;
    sig2 <= 1'b0;
    sig3 <= 1'b0;
end
else
begin
    sig1 <= sig;
    sig2 <= sig1;
    sig3 <= sig2;
end
wire sig_posedge = sig & sig1 & !sig2 & !sig3;
wire sig_negedge = !sig & !sig1 & sig2 & sig3;

always@(negedge clk10M or negedge nrst)
if(!nrst)
begin
    count_high <= 0;
end
else
begin
    if(sig_negedge)
       count_high <= 0;
    else if(sig_posedge)
       count_high <= 1;
    else if((|count_high) & !(&count_high))
       count_high <= count_high + 1;
end

always@(negedge clk10M or negedge nrst)
if(!nrst)
begin
   head <= 1'b0;
   t <= 1'b0;   
end
else
begin
   if(sig_negedge)
   begin
       head <= &count_high;/*>6.4us*/
       t <= ~t;
       if(count_high > 35 && count_high < 55)/*3.5us~5.5us*/
       begin
         data <= 1'b1;
       end
       else if(count_high > 5 && count_high < 20)/*0.5us~2.0us*/
       begin
         data <= 1'b0;
       end
   end
end
endmodule

cjaizss 发表于 2010-01-11 14:08

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

cjaizss 发表于 2010-01-11 14:25

以下是软件发送接口

#define SEND_START() {\
      register int x;\
      PDATD = PDATD | ((0x1<<2));\
      mypause_us(7);\
      PDATD = PDATD & (~(0x1<<2));\
      mypause_us(2);\
}

#define SEND_BIT(bit) {\
      register int x;\
      PDATD = PDATD | ((0x1<<2));\
      if(bit)\
               mypause_us(4);\
      else\
               mypause_us(1);\
      PDATD = PDATD & (~(0x1<<2));\
      mypause_us(2);\
}

void send_cpld(unsigned char* c,int len)
{
      int i,j;
      unsigned char tmp;
      SEND_START();
      for(i=0;i<len;i++) {
                for(j=0;j<8;j++) {
                        tmp = (c&(1<<j))>>j;
                        SEND_BIT(tmp);
                }
      }
}

readkernel 发表于 2010-01-12 12:26

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

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

bluesea666 发表于 2010-01-13 14:43

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

zqy1005 发表于 2010-07-30 18:55

进来纯膜拜的

偶像~~
页: [1]
查看完整版本: 硬件接口例子