博文

cpld的入门交流之一:GAL编程(2005-06-21 20:11:00)

摘要:最近有时间学学CPLD,很惭愧没能学好学透,但对于我预先想做的工作课题已经可以对付了。不求锦上添花,但求能解决实际问题。
    我认为学习CPLD首先有必要了解一下GAL的编程,虽然他们的语言可能不同,但是基本的程序思路、结构、需要表达的方法有很多类似的
地方,马马虎虎地说:N个GAL加在一起就是CPLD,严格说是不对的,但是对于没有入门之前可以简单的这样理解。所以粗略地了解一下GAL的
编程对学习CPLD有很大帮助。我希望我能够讲清楚学习掌握一些基本编程,通过学习能够掌握手头的简单应用方法,而进一步的深入研究就
不在入门之列了,掌握的基本方法就可以按自己的想法动手试验,然后才能步步深入。
    GAL编程,一般可以使用ABEL语言编程,ABEL的语法基本上是由一组逻辑表达式进行叙述,一片GAL能帮我完成什么功能呢?或者说能改
变成什么样的芯片呢?对GAL来说,由于内部的逻辑电路(门)比较少,一般只能完成一些简单的逻辑转换、简单的计数器(位数少)、锁存器
等。一般简单来讲,GAL的可用输入比输出多,如果想用他做地址译码器是比较合适的,在单片机的应用中,往往需要用几个不同的门电路组
合或加上138之类的3-8译码器组合,译出几个特定地址,这才是GAL的专长,可以在一个芯片内完成,使得你的电路简洁,而且输入输出在不
违背基本约定的前提下可以随意调换,使得布板走线容易。先看看下面的一个例子:

    module M273                                         "这是一个类似于74LS273的锁存器程序

阅读全文(6022) | 评论:2

FPGA和CPLD设计进阶(2005-06-21 20:12:00)

摘要:资料来源www.fpga.com.cn/advance.htm
撰写:    朱健军
版本:    1.0
时间:    20040308
§1   关于毛刺问题的探讨
§1.1 可靠性有关的几个概念

一  建立时间和保持时间
   建立时间(setup time)是指在触发器的时钟信号上升沿到来以前,数据稳定不变的时间,如果建立时间不够,数据将不能在这个时钟上升沿被打入触发器;保持时间(hold time)是指在触发器的时钟信号上升沿到来以后,数据稳定不变的时间, 如果保持时间不够,数据同样不能被打入触发器。如图1 。 数据稳定传输必须满足建立和保持时间的要求,当然在一些情况下,建立时间和保持时间的值可以为零。PLD/FPGA开发软件可以自动计算两个相关输入的建立和保持时间。

二  竞争和冒险
几乎所有关于数字电路的教材,都会提到数字电路中的竞争和冒险问题,但是这个问题往往被我们忽略。我们可以先来回顾一下关于竞争和冒险的一些基本概念。

(一)PLD内部毛刺产生的原因
我们在使用分立元件设计数字系统时,由于PCB走线时,存在分布电感和电容,所以几纳秒的毛刺将被自然滤除,而在PLD内部决无分布电感和电容,所以在PLD/FPGA设计中,竞争和冒险问题将变的较为突出。

(二)FPGA中的冒险现象
信号在FPGA器件内部通过连线和逻辑单元时,都有一定的延时。延时的大小与连线的长短和逻辑单元的数目有关,同时还受器件的制造工艺、工作电压、温度等条件的影响。信号的高低电平转换也需要一定的过渡时间。由于存在这两方面因素,多路信号的电平值发生变化时,在信号变化的瞬间,组合逻辑的输出有先后顺序,并不是同时变化,往往会出现一些不正确的尖峰信号,这些尖峰信号称为"毛刺"。如果一个组合逻辑电路中有"毛刺"出现,就说明该电路存在"冒险"。(与分立元件不......

阅读全文(4444) | 评论:1

IP地址分配(2005-06-21 20:12:00)

摘要:地址分配对应用来说更多的是如何理解为什么会这样分配给你ip地址,需要自己做ip规划的机会是很少的,除非是私有的大型的网络,真正需要考虑大规模ip规划的工程师在全国应该不会超过3位数。

1、IP地址

IP地址标识着网络中一个系统的位置。我们知道每个IP地址都是由两部分组成的:网络号和主机号。其中网络号标识一个物理的网络,同一个网络上所有主机需要同一个网络号,该号在互联网中是唯一的;而主机号确定网络中的一个工作端、服务器、路由器其它TCP/IP主机。对于同一个网络号来说,主机号是唯一的。每个TCP/IP主机由一个逻辑IP地址确定。

网络号和主机号

IP地址有两种表示形式:二进制表示(1和0太多了就搞不清)和点分十进制表示。每个IP地址的长度为4字节,由四个8位域组成,我们通常称之为八位体。八位体由句点.分开,表示为一个0-255之间的十进制数。一个IP地址的4个域分别标明了网络号和主机号。

2、地址类型

为适应不同大小的网络,internet定义了5种IP地址类型。

可以通过IP地址的前八位来确定地址的类型:

类型 IP形式 网络号 主机号

A类 w.x.y.z     w   x.y.z   w时1——126

B类 w.x.y.z     w.x   y.z   w是128——191

C类 w.x.y.z     w.x.y   z   w是192——223

我们来看一下这5类地址:

A类地址:可以拥有很大数量的主机,最高位为0,紧跟的7位表示网络号,余24位表示主机号,总共允许有126个网络。

B类地址:被分配到中等规模和大规模的网络中,最高两位总被置于二进制的10,允许有1......

阅读全文(3629) | 评论:0

fpga与cpld区别(2005-06-21 20:12:00)

摘要:一、
1.CPLD
CPLD主要是由可编程逻辑宏单元(LMC,Logic Macro Cell)围绕中心的可编程互连矩阵单元组成,其中LMC逻辑结构较复杂,并具有复杂的I/O单元互连结构,可由用户根据需要生成特定的电路结构,完成一定的功能。由于 CPLD内部采用固定长度的金属线进行各逻辑块的互连,所以设计的逻辑电路具有时间可预测性,避免了分段式互连结构时序不完全预测的缺点。到90年代,CPLD发展更为迅速,不仅具有电擦除特性,而且出现了边缘扫描及在线可编程等高级特性。较常用的有Xilinx公司的EPLD和Altera公司的CPLD。
2. FPGA
FPGA通常包含三类可编程资源:可编程逻辑功能块、可编程I/O块和可编程互连。可编程逻辑功能块是实现用户功能的基本单元,它们通常排列成一个阵列,散布于整个芯片;可编程I/O块完成芯片上逻辑与外部封装脚的接口,常围绕着阵列排列于芯片四周;可编程内部互连包括各种长度的连线线段和一些可编程连接开关,它们将各个可编程逻辑块或I/O块连接起来,构成特定功能的电路。不同厂家生产的FPGA在可编程逻辑块的规模,内部互连线的结构和采用的可编程元件上存在较大 的差异。较常用的有Altera、Xinlinx和Actel公司的FPGA。FPGA一般用于逻辑仿真。电路设计工程师设计一个电路首先要确定线路,然后进行软件模拟及优化,以确认所设计电路的功能及性能。然而随着电路规模的不断增大,工作频率的不断提高,将会给电路引入许多分布参数的影响,而这些影响用软件模拟的方法较难反映出来,所以有必要做硬件仿真。FPGA就可以实现硬件仿真以做成模型机。将软件模拟后的线路经一定处理后下载到FPGA,就可容易地得到一个模型机,从该模型机,设计者就很直观地测试其逻辑功能及性能指标。  
二、
系统的比较,与大家共享:
尽管FPGA和CPLD都是可编程ASIC器件,有很多共同特点,但由于CPLD和FPGA结构上的差异,具有各自的特点:
①CPLD更适合完成各种算法和组合逻辑,FP GA更适合于完成时序逻辑。换句话说,FPGA更适合于触发器丰富的结构,而CPLD更适合于触发器有限而乘积项丰富的结构。

②CPLD的连续式布线结构决定了它的时序延迟是均匀的和可预测的,而F......

阅读全文(5900) | 评论:1

c/c++头文件一览(转载)(2005-06-21 20:08:00)

摘要:C、传统 C++

#include <assert.h>    //设定插入点
#include <ctype.h>     //字符处理
#include <errno.h>     //定义错误码
#include <float.h>     //浮点数处理
#include <fstream.h>    //文件输入/输出
#include <iomanip.h>    //参数化输入/输出
#include <iostream.h>   //数据流输入/输出
#include <limits.h>    //定义各种数据类型最值常量
#include <locale.h>    //定义本地化函数
#include <math.h>     //定义数学函数
#include <stdio.h>     //定义输入/输出函数
#include <stdlib.h>    //定义杂项函数及内存分配函数
#include <string.h>    //字符串处理
#include <strstrea.h>   //基于数组的输入/输出
#include <time.h>     //定义关于时间的函数
#include <wchar.h>     //宽字符处理及输入/输出
#include <wctype.h>    //宽字符分类

//////////////////////////////////////////////////////////////////////////

标准 C++ (同上的不再注释)

#include <algorithm>    //STL 通用算法
#include <bitset>     //STL 位集容器
#include <cctype>
#include......

阅读全文(2444) | 评论:0

深入浅出ShellExecute(转载)(2005-06-21 20:14:00)

摘要:Q: 如何打开一个应用程序?

ShellExecute(this->m_hWnd,"open","calc.exe","","", SW_SHOW );



ShellExecute(this->m_hWnd,"open","notepad.exe",

"c:\MyLog.log","",SW_SHOW );





Q: 如何打开一个同系统程序相关连的文档?

ShellExecute(this->m_hWnd,"open",

"c:\abc.txt","","",SW_SHOW );



Q: 如何打开一个网页?

ShellExecute(this->m_hWnd,"open",

"http://www.google.com","","", SW_SHOW );



Q: 如何激活相关程序,发送EMAIL?

ShellExecute(this->m_hWnd,"open",

"mailto:nishinapp@yahoo.com","","", SW_SHOW );



Q: 如何用系统打印机打印文档?

ShellExecute(this->m_hWnd,"print",

"c:\abc.txt","","", SW_HIDE);



Q: 如何用系统查找功能来查......

阅读全文(5831) | 评论:0

伫立街头偶想(2005-06-21 20:10:00)

摘要:华灯初上
我在夜色中彷徨
流浪了几个世纪的情感
至今未找到栖息的地方......

阅读全文(3949) | 评论:0

外遇(2005-06-21 20:14:00)

摘要:一个人有了异性朋友,一般人统称为“艳遇”。一般来说,异性之间的情感之遇可分为五个层次: 
  
    一、“草木之遇”:纯粹是因为外貌吸引或欲念需求,或者只是因为都感到无聊甚至由于金钱关系,使双方走到一起,在短暂的欢娱之后各奔东西,很快就相互忘记,没有留下什么值得怀恋的记忆。这是最低层次的“艳遇”,也称“无情之遇”。 
  
  
    二、“浪花之遇”:两人都处在孤独之中,由于某种机缘而相遇,如水遇风,和岸相碰,在经历短暂的相互了解、相互熟悉之后,发现一些共同点,激起火花,产生兴奋,双方很快就掉进幻觉编织的情网里。当外部条件改变,幻觉消失,两人又重新成为陌路人。在这个层次上的“艳遇”往往持续时间不长,分别之后有恩有怨,日久之后印象就变得模糊。
  
    三、“金玉之遇”:一方遇到出色或出众的异性,惊为天人,于是使出浑身解数,刻意追求之。被追求的一方终于被吸引被感动,经过较长时间的交往后,双方发现在气质上、性格上、才学上有许多相通之处,于是渐渐产生感情,也就是通常所说的“爱情”。
  
    如果条件允许,也许会成为“爱人”,也许会成为“情人”。如果外部环境不支持,也可能只是精神上的异性朋友。无论结果如何,相互交往的那段时光,都会成为生命中的一段美好的回忆。这个层次的“艳遇”,是普通人所向往的。但是往往受外貌、气质、性格、才学、金钱、地位等外在条件的制约,如果有此一遇,也算可喜可贺了。 
  
    四、“珍珠之遇”:双方无意之间相遇,没有任何思想准备的,就被对方内在的涵养或音容笑貌所吸引,或者是因为无意之间的一件小事,引起两人的共鸣,在两人心间留下深刻印象。在不长时间的淡淡的交往过程中,双方都没有刻意去做什么、说什么。
  
    分别后,天各一方。而在记忆深处,时常闪现当初相遇的一幕。也许后来会通过书信、电话联络,也许什么也不做。双方都无意改变生活现状,只是在心底里珍惜这份美好情感,如珍藏圆圆滑滑的珍珠在心底。如果彼此的修养够水准,就此为止;如果一不小心,就会掉到第三层次上去,那就“堕落成爱情”了。 
  
    五、“钻石之遇”:往往在一瞥之间,或一句话,或一件事……瞬间如闪电般击中双方的内心,两人迅速地在内心为......

阅读全文(3239) | 评论:0

C编程技巧荟萃(2005-06-21 20:14:00)

摘要:转载:


/*从键盘中读取字符 功能:按下普通键时,返回其ASCII码 扫描码CODE=0*/
int INKEY(int *code)
{
int m;
while(!bioskey(1))/*可加入无按键时代码*/;
*code=bioskey(0);
m=*code*255;
if(!m) m=*code>>8;
*code=*code&255;
return m;
}

/*获取机器日期*/
int DATE(char *s,char type)
{
char dat[30];
int num;
struct tm *tblock;
time_t t;
t=time(NULL);
tblock=localtime(&t);
strcpy(dt,asctime(tblock));
strcpy(s,"");
switch(type)
{
case 'N':
num=(*tblock).tm_year+1900;
itoa(num,s,10);
break;
case 'Y':
num=(*tblock).tm_mon+1;
itoa(num,s,10);
break;
case 'R':
num=(*tblock).tm_mday;
itoa(num,s,10);
break;
case 'S':
strcpy(dt,asctime(tblock));
MID(s,dt,12,8);
break;
}
}
return num;
}

/*将浮点数转化为字符串*/
/* 参数说明 data:需转换的浮点数;s:输出字符串;len:转换后的长度*/
void f_to_s(double data,char *s,int len)
{
int dec,sign,i;
char *s1,s2[......

阅读全文(4594) | 评论:1

SQL SERVER中mdf和ldf文件从一个服务器移到另一个服务器的处理方法(2005-06-21 20:13:00)

摘要:目前我知道我有三个方法,可以给大家参考:
一是:在目标服务器上新建一个数据库,将新建文件取与原文件相同的名称后,关闭服务器,往往还需要将计算机注销,然后将原文件覆盖新建的数据库文件,就可以在目标文件上应用了。
二是:把数据库的数据文件(*.mdf)和日志文件(*.ldf)都拷贝到目的服务器,在SQL Server Query Analyzer中用语句进行恢复:
>>>>EXEC sp_attach_db @dbname = 'test',
>>>>@filename1 = 'd:\mssql7\data\test_data.mdf',
>>>>@filename2 = 'd:\mssql7\data\test_log.ldf'
>>>>这样就把test数据库附加到SQL Server中,可以照常使用。如果不想用原来的日志文件,可以用如下的命令:
>>>>EXEC sp_detach_db @dbname = 'test'
>>>>EXEC sp_attach_single_file_db @dbname = 'test',
>>>>@physname = 'd:\mssql7\data\test_data.mdf'
>>>>这个语句的作用是仅仅加载数据文件,日志文件可以由SQL Server数据库自动添加,但是原来的日志文件中记录的数据就丢失了。
三是:在控制台管理器的数据库选项上右击,选择附加数据库选项,按照提示操作即可。但日志文件在这种方法中可能无法加入。
......

阅读全文(5000) | 评论:0