⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 教你设计pci总线的高速数据采集卡(基于pci9054)_沧海银沙.htm

📁 PLX网站上9054的所有PDF资料,应用软件自个另下。
💻 HTM
📖 第 1 页 / 共 2 页
字号:
<DIV class=date>2007-03-13 21:02</DIV>
<TABLE style="TABLE-LAYOUT: fixed">
  <TBODY>
  <TR>
    <TD>
      <DIV class=cnt id=blog_text>
      <P>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
      眼下有不少场合需要用到PCI总线的数据采集卡,下面我就来谈一下设计PCI数采卡的原理及要点。<BR>首先我要以我的实际经验,纠正存在于很多人心里的几个误区:</P>
      <P><BR>1. 
      设计PCI采集卡要通读PCI协议。<BR>相信有很多初学者都在这个地方被吓住了,几百页的英文要通读并理解谈何容易!其实PCI协议处理的这部分功能已经被PCI接口芯片完成了,如PLX公司的9054、9056和9052等等,它封装了PCI协议的细节,我们只需要控制这颗接口芯片local端的几个控制线就可以完成PCI总线的数据传输。PCI协议也有它的用处,我们只需要在某些需要注意的地方查阅一下相关章节即可,比如PRSNT1#和PRSNT2#引脚至少要有一个下拉,才能识别到卡,这就是PCI协议中的规定。</P>
      <P><BR>2. 
      PCI卡布线很复杂,一不小心就可能不成功。<BR>其实对于32位33MHz的PCI总线来说,布线相对比较简单,只要稍加注意就不会出问题。比如:PCI总线的时钟线要做成2500(+/-100)mil,这个是要注意的一点,一般PCI卡上的蛇行弯曲走线就是这条线,因为走直线距离一般都达不到此长度。其他要求,比如地址和数据线要在1500mil以内,其实你超过一些也没什么问题,不要超太多就好了。</P>
      <P><BR>3. 
      PCI卡的驱动程序编写很难。<BR>其实无论是软件还是硬件设计,都有一些相对成熟的资料可以参考。对驱动程序来说也是这样,对实际项目的开发没有几个是从头到尾自己在编代码,都可以在网上找到一些成熟的代码,然后自己修改一下即可,况且PCI卡的驱动程序又相对比较成熟,可参考的资料也较多。所以你要从网上找代码,向PCI接口芯片的供应商要代码,等收集到足够多的代码,再配以适当的教材(比如对于windows2000/XP系统下的WDM驱动程序,可以参考武安河老师的教材就足够),就可以进行你自己的驱动设计了。</P>
      <P>下面我再针对具体应用谈谈PCI采集卡的设计:</P>
      <P><BR>一般数采卡的情况是将A/D转换后的数据通过PCI总线上传到PCI机,然后利用上层的软件进行分析处理。</P>
      <P><BR>这里通常会将一片FPGA与PCI接口芯片相连,对于很多应用来说,PCI总线端向主机上传的速度远远大于A/D通过FPGA处理后的数据向9054传送的速度。比如如果采用PCI9054的DMA方式,向主机上传的带宽很轻松可以达到100MB/s。这是因为比较常用的A/D转换器的位数为8bit,10bit,12bit等,而PCI总线的宽度为32bit。另一方面PCI总线的频率为33MHz,一般应用的A/D也一般远小于此值,这样算下来,PCI总线的带宽自然要富余很多,设计起来还是比较轻松的。</P>
      <P><BR>对于8位的A/D来说,如果要完全利用PCI总线的32位宽度的话,需要在FPGA内做数据宽度转换的模块。当然对带宽要求比较低的场合,也可以直接把A/D的八位数据线直接连到PCI的32位数据线的低8位,但这样做是不值得推荐的,对PCI资源也是极大的浪费,况且该宽度转换模块并不复杂,只有几个锁存器就可以解决,也可以用FIFO来实现。</P>
      <P><BR>另外,为了将数据通过PCI总线上传,FPGA内要做PCI接口芯片的 
      local端的控制逻辑模块。所谓local端,就是指PCI9054开放给设计者的端口,主要包括这几条控制信号线:ADS#,blast#, lwr, 
      lhold, lholda, ready, reset#。 
      相对于local端的另一端是PCI总线端,也就是连到PCI卡金手指的那些信号,这是标准的PCI总线。也就是说,我们只需要通过控制local端的区区几个控制信号,就可以达到控制复杂的PCI总线的目的,而这个从local端到PCI端的映射工作,就是由9054来完成的。</P>
      <P><BR>当然,要使9054工作起来,要编写它的驱动程序,无非就是打开设备,初始化设备,设备读写,中断服务程序,关闭设备,这几步,可以先找些现成的驱动程序来看,把这几步的代码实现理清楚,然后把每一步搞懂就可以了。其实主要操作也就是读写9054的各个寄存器,这些可以参照芯片的datasheet来读,上面有寄存器的详细描述。我在这里主要说明一种数采卡的设计原理,以后有时间会继续探讨驱动程序编写的一些问题。</P>
      <P></P></DIV></TD></TR></TBODY></TABLE><BR>
<DIV class=opt><A title=查看该分类中所有文章 
href="http://hi.baidu.com/faramita2007/blog/category/pci&iquest;¨&Eacute;è&frac14;&AElig;">类别:pci卡设计</A> | 
<A title=将此文章添加到百度搜藏 onclick="return addToFavor();" 
href="http://cang.baidu.com/do/add" target=_blank>添加到搜藏</A> | 浏览(<SPAN 
id=result></SPAN>) | <A 
href="http://hi.baidu.com/faramita2007/blog/item/179e731607d04c4b21a4e93d.html#send">评论</A>&nbsp;(3)
<SCRIPT language=javascript>
/*<![CDATA[*/
var pre = [true,'PCI卡数据传输卡的详细设计经历及要点(基于PCI9054)', 'PCI卡数据传输卡的详细设计经历...','/faramita2007/blog/item/39e7e15812b36c80800a1817.html'];
var post = [true,'FPGA的乒乓帧技术在高速数据采集中的应用','FPGA的乒乓帧技术在高速数据采集...', '/faramita2007/blog/item/22f194c2806ed81a0ef477b3.html'];
if(pre[0] || post[0]){
	document.write('<div style="height:5px;line-height:5px;">&nbsp;</div><div id="in_nav">');
	if(pre[0]){
		document.write('上一篇:<a href="' + pre[3] + '" title="' + pre[1] + '">' +  pre[2] + '</a>&nbsp;&nbsp;&nbsp;&nbsp;');
	}
	if(post[0]){
		document.write('下一篇:<a href="' + post[3] + '" title="' + post[1] + '">' +  post[2] + '</a>');
	}
	document.write('</div>');
}
/*]]>*/
</SCRIPT>
 </DIV>
<DIV class=line></DIV>
<STYLE type=text/css>#in_related_doc A {
	TEXT-DECORATION: none
}
</STYLE>

<DIV id=in_related_tmp></DIV>
<SCRIPT language=javascript type=text/javascript>
/*<![CDATA[*/
function HI_MOD_IN_RELATED_DOC_CALLBACK(arg){
    if(arg.length <= 1) return false;
    var hasMore = arg[0];
    var D=function(A,B){A[A.length]=B;}
    if(arg.length % 2 == 0) D(arg, ["","","",""]);

    var html = ['<div id="in_related_doc"><div class="tit">相关文章:</div>'];
    D(html, '<table cellpadding="0" cellspacing="3" border="0">');
    for(var i = 1, j = arg.length; i < j; i += 2){
        D(html, '<tr>');
        D(html, '<td width="15px"><a style="font-size:25px" >&#8226;</a></td><td><a href="http://hi.baidu.com/' + arg[i][3] + '/blog/item/' + arg[i][2] + '.html" target="_blank" title="' + arg[i][0] + '">' + arg[i][1] + '</a>');
        D(html, new Array(10).join('\u3000'));
        D(html, '</td>');
        if(arg[i + 1][0] != "")
            D(html, '<td width="15px"><a style="font-size:25px" >&#8226;</a></td><td><a href="http://hi.baidu.com/' + arg[i + 1][3] + '/blog/item/' + arg[i + 1][2] + '.html" target="_blank" title="' + arg[i + 1][0] + '">' + arg[i + 1][1] + '</a></td>');
        else
            D(html, '<td>&nbsp;</td><td>&nbsp;</td>');
        D(html, '</tr>');
    }
    if(hasMore) D(html, '<tr><td colspan="4"><a target="_blank" href="/sys/search?pageno=1&type=7&sort=1&word=%BD%CC%C4%E3%C9%E8%BC%C6PCI%D7%DC%CF%DF%B5%C4%B8%DF%CB%D9%CA%FD%BE%DD%B2%C9%BC%AF%BF%A8%A3%A8%BB%F9%D3%DAPCI9054%A3%A9&item=179e731607d04c4b21a4e93d">更多&gt;&gt;</a></td></tr>');
    D(html, '</table></div><div class="line">&nbsp;</div>');

    var div = document.getElementById('in_related_tmp');
    if(div){
        div.innerHTML = html.join('');
        while(div.firstChild){
            div.parentNode.insertBefore(div.firstChild, div);
        }
        div.parentNode.removeChild(div);
    }
}

if(RelatedDocData == -1){	// not supported xhr
    var script = document.createElement('script');
    script.type = 'text/javascript';
    script.src = '/sys/search?type=8&word=%BD%CC%C4%E3%C9%E8%BC%C6PCI%D7%DC%CF%DF%B5%C4%B8%DF%CB%D9%CA%FD%BE%DD%B2%C9%BC%AF%BF%A8%A3%A8%BB%F9%D3%DAPCI9054%A3%A9&item=179e731607d04c4b21a4e93d&t=' + new Date().getTime();
    document.getElementsByTagName('HEAD')[0].appendChild(script);
}else if(RelatedDocData == null){
	GetAndEval = true;
}else{
	eval(RelatedDocData);
}

/*]]>*/
</SCRIPT>

<DIV id=in_reader>
<DIV class=tit>最近读者:</DIV>
<SCRIPT>

	var g_spAnnony=true;


var g_read=[
	
["scz15950544056","590773637a31353935303534343035361503","scz15950544056"],
	
["hnfhc","b95d686e666863fe00","hnfhc"],

{}
];
g_read.length=g_read.length-1;

var _rh1="";
var _rh2="";

function wrreader(){
	_rh1 += '<table width="100%" ><tr>';
	_rh2+='<tr>';
	if(g_spAnnony){
		_rh1+='<td align="center" width="10%" ><img border="0" width="55" height="55" src="http://img.baidu.com/hi/img/portraitn.jpg"></td>';
		_rh2+='<td>&nbsp;</td>';
		if(g_read.length>0){
			_rh1+='<td align="left" width="12%">';
		}else{
			_rh1+='<td align="left" width="100%">';
		}
		_rh1+="<a href='http://passport.baidu.com/?login&tpl=sp&tpl_reg=sp&u="+myref+"' target='_self'>登录</a>后,您就出现在这里。</td>";
		_rh2+='<td>&nbsp;</td>'
	}
	if(g_read.length==0){
		if(!g_spAnnony){
			_rh1+='<td align=left width="100%">最近还没有登录用户看过这篇文章……</td>';
			_rh2+='<td>&nbsp;</td>';
		}
	}else{
		for(i=0,len=g_read.length;i<len;i++){
			_rh1+='<td align="center" valign="bottom" width="10%" class="user"><a href="/'+g_read[i][0]+'" target="_blank"><img border="0" src="http://himg.baidu.com/sys/portraitn/item/'+g_read[i][1]+'.jpg"></a></td>';
			_rh2+='<td align="center" valign="top" class="user"><a href="/'+g_read[i][0]+'" target="_blank">'+g_read[i][2]+'</a></td>';
		}
	}
	_rh1+='<td width="100%"></td></tr>';
	_rh2+='<td></td></tr></table>';
	document.write(_rh1+_rh2);
}

wrreader();
</SCRIPT>
</DIV>
<DIV class=line></DIV>
<SCRIPT language=JavaScript>
allkey=allkey+"28d4fb13ec313923dd5401af_179e731607d04c4b21a4e93d_";
</SCRIPT>

<DIV id=in_comment><A name=comment></A>
<DIV class=tit>网友评论:</DIV>
<SCRIPT>
function writecmt(type,id,cmtname,cmturl,portraitId){
	var html1="";

	if(type==1){
			html1="<a href='"+cmturl+"' target='_blank' title='"+cmturl+"'><img  border='0' src='http://himg.baidu.com/sys/portraitn/item/"+portraitId+".jpg'><br>"+cmtname+"</a>";
	}else{
		if(cmtname=="" || cmtname=="匿名网友"){
			if(cmturl==""){
				html1="<a>匿名网友</a>";
			}else{
				html1="<a href='"+cmturl+"' target='_blank' title='"+cmturl+"'>"+cmtname+"</a>";
			}
		}else{
			if(cmturl==""){
				html1="<div class='f14' style='display:inline'>网友:<a>"+cmtname+"</a></div>";
			}else{
				html1="<div class='f14' style='display:inline'>网友:<a href='"+cmturl+"' target='_blank' title='"+cmturl+"'>"+cmtname+"</a></div>";
			}
		}
	}
	document.write(html1);
}

</SCRIPT>
<A name=3873cdfad16db4dab48f31c2></A>
<TABLE class=item 
style="TABLE-LAYOUT: fixed; OVERFLOW: hidden; WORD-WRAP: break-word" 
cellSpacing=0 cellPadding=0 width="100%" border=0 ;>
  <TBODY>
  <TR>
    <TD class=index vAlign=top width="5%">1</TD>
    <TD vAlign=top align=middle width="10%">
      <DIV class=user style="OVERFLOW: hidden">
      <SCRIPT>
writecmt(1,"3873cdfad16db4dab48f31c2","hnfhc","http://hi.baidu.com/hnfhc","b95d686e666863fe00");
</SCRIPT>
      </DIV></TD>
    <TD class=cnt style="PADDING-LEFT: 20px"><SPAN class=date>2007-12-10 11:03 
      </SPAN>
      <DIV class=desc 
      style="OVERFLOW: hidden; WORD-BREAK: normal">很好,向你学习。可以加一下msn不?我的msn:hnfhc@hotmail.com</DIV></TD></TR></TBODY></TABLE>
<DIV class=line></DIV><A name=13650af3fd322255342acc45></A>
<TABLE class=item 
style="TABLE-LAYOUT: fixed; OVERFLOW: hidden; WORD-WRAP: break-word" 
cellSpacing=0 cellPadding=0 width="100%" border=0 ;>
  <TBODY>
  <TR>
    <TD class=index vAlign=top width="5%">2</TD>
    <TD vAlign=top align=middle width="10%">
      <DIV class=user style="OVERFLOW: hidden">
      <SCRIPT language=javascript>
writecmt(2,"13650af3fd322255342acc45","miner","","00006d696e65720000");

</SCRIPT>
      </DIV></TD>
    <TD class=cnt style="PADDING-LEFT: 20px"><SPAN class=date>2008-04-13 14:39 
      </SPAN>
      <DIV class=desc 
      style="OVERFLOW: hidden; WORD-BREAK: normal">写的很好,学习啦!</DIV></TD></TR></TBODY></TABLE>
<DIV class=line></DIV><A name=016a7bfbabc67361034f56f2></A>
<TABLE class=item 
style="TABLE-LAYOUT: fixed; OVERFLOW: hidden; WORD-WRAP: break-word" 
cellSpacing=0 cellPadding=0 width="100%" border=0 ;>
  <TBODY>
  <TR>
    <TD class=index vAlign=top width="5%">3</TD>
    <TD vAlign=top align=middle width="10%">
      <DIV class=user style="OVERFLOW: hidden">
      <SCRIPT>
writecmt(1,"016a7bfbabc67361034f56f2","wujbclzw","http://passport.baidu.com/?business&un=wujbclzw","2cd077756a62636c7a779703");
</SCRIPT>
      </DIV></TD>
    <TD class=cnt style="PADDING-LEFT: 20px"><SPAN class=date>2008-04-17 18:13 
      </SPAN>
      <DIV class=desc style="OVERFLOW: hidden; WORD-BREAK: normal">学习 
    学习!</DIV></TD></TR></TBODY></TABLE>
<DIV class=line></DIV>
<DIV id=page></DIV></DIV>
<DIV id=in_send><A name=send></A>
<FORM id=popFormSubmit name=form1 onsubmit="return checkcmtform()" 
action=/faramita2007/commit method=post><INPUT type=hidden value=8 name=ct> 
<INPUT type=hidden value=1 name=cm> <INPUT type=hidden 
value=179e731607d04c4b21a4e93d name=spBlogID>
<SCRIPT language=JavaScript>
	document.write("<input type='hidden' name='spRefURL' value='"+window.location.href+"'>");
</SCRIPT>
 
<DIV class=tit>发表评论:</DIV>
<TABLE cellSpacing=5 cellPadding=0 width=620 border=0>
  <TBODY>
  <TR>
    <TD class=f14>姓 名:</TD>
    <TD><INPUT id=spBlogCmtor style="WIDTH: 220px" onfocus=hidErr(1); 
      tabIndex=1 maxLength=49 onchange="checkname('spBlogCmtor')" 
      name=spBlogCmtor>
      <SCRIPT>
document.write(" &nbsp;&nbsp; <a href='http://passport.baidu.com/?reg&tpl=sp&return_method=get&skip_ok=1&u=http://hi.baidu.com/sys/reg/' target='_blank'>注册</a>");
document.write(" | <a href='http://passport.baidu.com/?login&tpl=sp&tpl_reg=sp&u="+myref+"'>登录</a>");

</SCRIPT>
       
      <DIV id=nmerror style="DISPLAY: none">*姓名最长为50字节</DIV></TD></TR>
  <TR id=1_err style="DISPLAY: none">
    <TD>&nbsp;</TD>
    <TD>
      <DIV class=error id=1_err_con></DIV></TD></TR>
  <TR>
    <TD class=f14>网址或邮箱:</TD>
    <TD><INPUT id=spBlogCmtURL style="WIDTH: 360px" onfocus=hidErr(2); 
      tabIndex=2 maxLength=128 onchange="checkeandu('spBlogCmtURL')" 
      name=spBlogCmtURL> (选填)</TD>
    <SCRIPT>
G("spBlogCmtor").value="";
G("spBlogCmtURL").value="";
</SCRIPT>
  </TR>
  <TR id=2_err style="DISPLAY: none">
    <TD>&nbsp;</TD>
    <TD>
      <DIV class=error id=2_err_con></DIV></TD></TR>
  <TR>
    <TD class=f14 vAlign=top>内 容:</TD>
    <TD><TEXTAREA id=spBlogCmtText style="WIDTH: 520px; HEIGHT: 155px" onfocus=hidErr(3); tabIndex=3 name=spBlogCmtText></TEXTAREA>
      <SCRIPT>
G("spBlogCmtor").value=G("spBlogCmtor").defaultValue;
G("spBlogCmtText").value="";
</SCRIPT>
       </TD></TR>
  <TR id=3_err style="DISPLAY: none">
    <TD>&nbsp;</TD>
    <TD>
      <DIV class=error id=3_err_con></DIV></TD></TR>
  <TR id=vercode>
    <TD class=f14 vAlign=top>验证码:</TD>
    <TD vAlign=top><INPUT type=hidden 
      value=EEF9DFEF4560C35466D9E9F37325F023F9E2151A41261F5A92116D337082BF371068B9A7E140E46126B4578E666BB3FFD854F0B45D6674CDD8EDFCD3295AB020 
      name=spVcode> <INPUT id=spVerifyKey tabIndex=4 maxLength=4 size=6 
      name=spVerifyKey autocomplete="off">请输入下图中的四位验证码,字母不区分大小写。<BR>
      <SCRIPT language=JavaScript>

			var imgsrc="http://tieba.baidu.com/cgi-bin/genimg?EEF9DFEF4560C35466D9E9F37325F023F9E2151A41261F5A92116D337082BF371068B9A7E140E46126B4578E666BB3FFD854F0B45D6674CDD8EDFCD3295AB020";
			document.write("<img id='verifypic' src='"+imgsrc+"' width='120' height='40'>");

			function newverifypic(){
				document.getElementById("verifypic").src = imgsrc +"&t="+ Math.random();
			}
		</SCRIPT>
      <A title=看不清左边的字符 href="javascript:newverifypic();">看不清?</A> </TD></TR>
  <TR>
    <TD class=f14 vAlign=top>&nbsp;</TD>
    <TD class=f14 vAlign=top><INPUT id=btn_ok tabIndex=5 type=submit value=发表评论 name=btn_ok></TD></TR></TBODY></TABLE></FORM></DIV><BR></DIV>
<TABLE height=8 cellSpacing=0 cellPadding=0 width="100%" border=0>
  <TBODY>
  <TR>
    <TD class=modbl width=7>&nbsp;</TD>
    <TD class=modbc>&nbsp;</TD>
    <TD class=modbr width=7>&nbsp;</TD></TR></TBODY></TABLE></DIV></DIV></DIV></DIV>
<SCRIPT language=javascript>
<!--
var hstr="/faramita2007/brwstat?key1=1";
document.write("<script src='"+hstr+"&key2="+allkey+"'><\/script>");
//-->
</SCRIPT>
<BR>
<CENTER>
<DIV id=ft>&copy;2008 Baidu</DIV></CENTER>
<SCRIPT>
if(document.getElementById("m_blog"))
{
	var imgarray = document.getElementById("m_blog").getElementsByTagName('img');
	var imgw = document.getElementById("m_blog").offsetWidth;
	imgw =imgw-40;
	for(var i=0; i<imgarray.length; i++){
	if(imgarray[i].className=="blogimg" && imgarray[i].width>=imgw) imgarray[i].width=imgw;
	}
}

// Fix ff bugs
var blog_text = document.getElementById('blog_text');
blog_text.innerHTML = blog_text.innerHTML.replace(/href\s*=\s*("|')?(\.\.\/\.\.\/)/gi,"href=$1../$2");

</SCRIPT>
</CENTER><IMG style="DISPLAY: none" src=""> </BODY></HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -