硬件接口例子
以下给一个硬件接口的例子,是前段时间的一个项目,项目中设计的cpu控制cpld的串行口,控制信号,小数据量通信.会涉及到协议/接口电路/软件处理代码.
接口电路和软件处理代码都是为了遵循协议,电路和软件其实只是手段而已. 协议
I/O信号在不通信的时候被拉低
当通信的时候,协议以连续高电平宽度来表达传输.
帧头:6.3~10us
数据1:3.5us~5.5us
数据0:0.5us~2.0us
相邻数据/帧头间隔:1us~5us
传输数据之前,先发送帧头
假设我想发送01010101,波形应该是 接口电路:
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
以上电路用原理图来表示,大致如下: 以下是软件发送接口
#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);
}
}
}
代版主说句话:
爷玩的不是别的,爷玩的是寂寞:em02: :m01:
估计论坛上写硬件Core的很少..:em10: :mrgreen:
"附件审核中"? 审的也太久了吧? 进来纯膜拜的
偶像~~
页:
[1]