2008年10月8日星期三

谈VHDL/Verilog的可综合性以及对初学者的一些建议

一、HDL不是硬件设计语言
过去笔者曾碰到过不少VHDL或Verilog HDL的初学者问一些相似的问题,诸如如何实现除法、开根号,如何写循环语句等等。在这个论坛上,也时常能看到一些网友提出这一类的问题。
对于这些问题,首先要明确的是VHDL和Veriglog并非是针对硬件设计而开发的语言,只不过目前被我们用来设计硬件。HDL是Hardware Description Language的缩写,正式中文名称是"硬件描述语言"。也就是说,HDL并不是"硬件设计语言(Hardware Design Language)"。别看只差这一个单词,正是这一个单词才决定了绝大部分电路设计必须遵循RTL的模式来编写代码,而不能随心所欲得写仅仅符合语法的HDL代码。
二、HDL的来历
之所以是"硬件描述语言",要从HDL的来历说起。
VHDL于1980年开始在美国国防部的指导下开发,完成于1983年,并于1987年成为IEEE的标准。当初开发这种语言,是出于美国国防部采购电子 设备的需要。美军的装备采购自私人企业,时常要面对这样一种风险:如果某种武器大量装备部队,而其中某个零件的供应商却在几年后倒闭了,那这种武器的再生 产、维修和保养都会出现大问题。而电子设备、尤其是集成电路的内部结构较为复杂,若出现前面所说的情况要找其他公司生产代用品非常困难。于是美国防部希望 供应商能以某种形式留下其产品的信息,以保证一旦其破产后能由其他厂商迅速生产出代用品。
显然,当初的设计文档显然是不能交出来的,这在美国会涉及商业机密和知识产权问题。于是美国防部就想出了一种折衷的方法――描述硬件的语言,也就是VHDL。通过VHDL,供应商要把自己生产的集成电路芯片的行为描述出来:比如说,加了什么样的信号后过多少时间它能输出什么等等。这样,如果有必要让其他厂商生产代用品,他们只需照着VHDL文档,设计出行为与其相同的芯片即可。这样的代用品相当于是新厂商在不了解原产品结构的情况下独立设计的,所以不太会涉及知识侵权。
Verilog HDL也形成于差不多的年代,是由Gateway Design Automation公司大约在1983年左右开发的。其架构同VHDL相似,但主要被用来进行硬件仿真。或许私人公司更注重实用,Verilog要比VHDL简洁得多。
由此可见,这两种最流行的用于电路设计的语言,没有一种是为了设计硬件而开发的(更何况80年代还没有现在的那些功能强大的EDA软件呢)。因此,当初制订HDL语言标准的时候,并没有考虑这些代码如何用硬件来实现。换句话说,有些代码写起来简单,实现起来却可能非常复杂,或者几乎不可能实现。
三、HDL代码的可综合性
现在回到最初的问题上。为什么诸如除法、循环之类的HDL代码总是会出错?
由上一部分可知,任何符合HDL语法标准的代码都是对硬件行为的一种描述,但不一定是可直接对应成电路的设计信息。行为描述可以基于不同的层次,如系统级,算法级,寄存器传输级(RTL)、门级等等。以目前大部分EDA软件的综合能力来说,只有RTL或更低层次的行为描述才能保证是可综合的。而众多初学者试图做的,却是想让软件去综合算法级或者更加抽象的硬件行为描述。
比如说,要想实现两个变量相除的运算,若在代码中写下C=A/B,你将会发现只有一些模拟软件在前仿真中能正确执行这句代码,但几乎任何软件都不能将其综合成硬件。不要怪软件太笨。试想一下,如果我们自己笔算除法是怎么做的?从高位到低位逐次试除、求余、移位。试除和求余需要减法器,商数和余数的中间结果必须有寄存器存储;而此运算显然不能在一个时钟周期里完成,还需要一个状态机来控制时序。一句简单的C=A/B同所有这些相比显得太抽象,对于只能接受RTL或更低层次描述的EDA软件来说确实太难实现。而如果代码是类似于(Verilog)
always @(posedge clk)
c<=A/B; 这样的,要求除法在一个时钟延上完成,那更是不可能实现的。(注:有些FPGA的配套软件提供乘除法的运算模块,但也只能支持直接调用,不支持把形如C=A/B的语句综合成除法模块。)
又比如,一个很多初学者常见的问题是试图让HDL进行循环运算,形同(Verilog):
for (i=0; iparity = parity xor data[i];
一些功能比较简单的综合软件会完全拒绝综合循环语句;而一些功能较强的软件仅当wordlength是常数的时候能综合;当wordlength为变量 时,任何软件都不能综合上面的语句。这是因为硬件规模必须是有限的、固定的。当综合软件遇到循环语句时,总是将其展开成若干条顺序执行的语句,然后再综合 成电路。若wordlength是常数,则展开的语句数是确定的,具有可综合性;而若它是变量时,展开的语句数不确定,对应的硬件电路数量也不能确定,无 法被综合。或许有人说用计数器就能实现变量循环,但这情形又和上面的除法运算相同。那需要额外的硬件,用来存储中间结果和进行时序控制,象上面那样的循环 语句对此描述得太抽象,软件接受不了。
四、如何判断自己写的代码是可综合的?
用一句简单的话概括:电脑永远没有你聪明。具体来说,通常EDA软件对HDL代码的综合能力总是比人差。对于一段代码,如果你不能想象出一个较直观的硬件 实现方法,那EDA软件肯定也不行。比如说,加法器、多路选择器是大家都很熟悉的电路,所以类似A B-C,(A>B)?C这 样的运算一定可以综合。而除法、开根、对数等等较复杂的运算,必须通过一定的算法实现,没有直观简单的实现方法,则可以判断那些计算式是不能综合的,必须 按它们的算法写出更具体的代码才能实现。此外,硬件无法支持的行为描述,当然也不能被综合(比如想在FPGA上实现DDR内存那样的双延触发逻辑,代码很 容易写,但却不能实现)。
不过,这样的判断标准非常主观模糊,遇到具体情况还得按设计人员自己的经验来判断。如果要一个相对客观的标准,一般来说:在RTL级的描述中,所有逻辑运 算和加减法运算、以及他们的有限次组合,基本上是可综合的,否则就有无法综合的可能性。当然,这样的标准仍然有缺陷,更况且EDA的技术也在不断发展,过 去无法综合的代码或许将来行,某些软件不支持的代码换个软件或许行。比如固定次数的循环,含一个常数参数的乘法运算等等,有些EDA软件支持对它们的综 合,而有些软件不行。
所以,正确的判断仍然要靠实践来积累经验。当你可以较准确判断代码的可综合性的时候,你对HDL的掌握就算完全入门了。
作者:董培良
电机和电子工程系博士生
英国University of Nottingham

关于嵌入式几个发展方向的前途(ZZ)

关于嵌入式几个发展方向的前途这或许是很多人想问的一个问题,学习嵌入式前途如何呢?
嵌入式在软件、硬件、开发平台、人才需求、应用领域、培训领域等都处在快速增长、逐步成熟的阶段,很多高校也逐渐开始嵌入式专业课程,企业对嵌入式人才的需求正在增加,高校师生、企业员工很多都开始转向嵌入式开发。 相比起普通IT开发,嵌入式开发薪资待遇更好。今天看了21ic的一个帖子,也顺便转过来,可以作为一种参考~ 嵌入式以下几方面: (1)嵌入式硬件 (2)BSP bootloader (3)内核 驱动 (4)上层应用
以我在嵌入式系统的从业的情况大体是这样,仅供参考 如果在一个层面上有六年及以上工作经验的话,以六年为准。 (1)嵌入式硬件   ---8000-12000,正常价为10000
(2)BSP bootloader ---10000-20000,正常价为15000
(3)内核驱动    ---10000-15000,正常价为12000
(4)上层应用    ---8000-10000,正常价为8000
另外和行业还有关系,比如,做手机公司还要相对高些。 这些情况一般是在外企公司或国内大公司的情况。小公司很少能开到这个价。 因此说什么公司用什么样的人,是有一定道理的。 还有这四层都是很有前途的,关键要根据自己的特长选择做那一层面,一个学计算机专业的人去搞硬件有点不太好搞,在基础这块就要比电子工程类专业的欠缺。 以上这些仅供参考,但目前国内能真正在嵌入式系统这块做上六年的都很少很少。国内嵌入式系统是从当年的Motorola的68K体系结构的DragonBall开始的,那个时间就是1999年,2000年底-2001年夏才达到了最高时期,以后才是ARM开始接替。

VCC、VDD、VSS、VEE和VPP的名词定义

VDD、VCC、VSS的名词定义?
这些通常代表的是电源接在晶体管的那一端. Vcc = collector (BJT) Vdd = drain (MOS) Vss = source (MOS)

另一说:
一、解释
VCC:C=circuit 表示电路的意思, 即接入电路的电压;
VDD:D=device 表示器件的意思, 即器件内部的工作电压;
VSS:S=series 表示公共连接的意思,通常指电路公共接地端电压;
VEE:负电压供电;
VPP:编程/擦除电压。

二、说明
1、对于数字电路来说,VCC是电路的供电电压,VDD是芯片的工作电压(通常Vcc>Vdd),VSS是接地点。
2、有些IC既有VDD引脚又有VCC引脚,说明这种器件自身带有电压转换功能。
3、在场效应管(或COMS器件)中,VDD为漏极,VSS为源极,VDD和VSS指的是元件引脚,而不表示供电电压。

2008达尔文进化奖

朋友们,一年中最激动人心的时刻到来了。现在特隆重颁发2008达尔文进化奖,以表彰那些在人类进化中走得最慢的人们,是他们,使得我们生活的折磨和压力不那么难以忍受。

得到本次大奖殊荣的是:

JAMES ELLIOT - 做为加利福尼亚长滩市的准打劫者,当他把点38左轮对准受害人开枪时,枪卡壳了。这时他做了非常有建设性的举动――把眼睛对准枪口仔细瞄了一眼,同时扣动了扳机――这次枪没有卡壳。

以下诸位是这个奖项的有力争夺者:

1. 一个瑞士酒店的厨师被一台切肉机夺去了一根手指,他愤然向保险公司要求赔偿。保险公司怀疑是他操作过失于是派了一个代表来检查机器。这个代表自己尝试操作了切肉机,他也失去了一根手指

――于是,这个厨子的赔偿要求得到了批准。

2.一个男人在暴风雪的芝加哥街头奋力铲雪一个小时,终于给自己的车清出了一个停车位。当他把车开来时,发现一位女士已经抢了他的位置――可以理解,他朝她开了一枪,把她干掉了。

3.由于在一个非法酒吧停车喝酒,津巴布韦的一个司机发现自己巴士上的20名精神病患者全部逃跑了,而他应该把他们送到BULAWAYO的精神病院的。出于害怕他的粗心大意被领导批评,这个司机把车开到了附近的一个公共汽车站,允诺免费搭乘每个乘客。他把这些乘客送到了精神病院,并且告诉医院工作人员这些"病人"非常容易激动而且胡言乱语充满幻觉

――这个诡计直到三天后才被识破。

4.一个美国少年因为头部被开来的列车严重撞伤而送进了医院。当警察问他怎么受伤时,他说他只是想试试看自己能够把头伸到行进中的列车多近的地方――然后他就晕了过去。

5.一个男人走进路易斯安那州某个便利店,拿出20元纸币要求破开,当职员打开收款机时,他亮出自己的手枪并要求职员把收款机里所有的现金给他。职员很快照做了,他拿了钱迅速消失,但把自己的20元钞票留在了柜台上――他一共拿走了15元。(事实上这引起了一场法律上的争论:如果一个人拿枪威胁着要给

你钱,这算不算犯罪?)

6.一个阿肯色小伙子似乎想喝啤酒想得要命,于是他朝一个卖酒商店的橱窗扔了一个空心砖,打算砸破玻璃,抢几瓶酒逃之夭夭――他没有注意到橱窗是树脂玻璃做的,空心砖反弹回来,把他砸得失去了知觉。整个过程被整个录了下来(我猜想这个家伙会不会把商店告上法庭)。

7.ANN ARBOR新闻报的犯罪专栏报道说密歇根州一个男子凌晨5点持枪走进快餐店打劫。职员拒绝说如果没有点餐他没法打开收款机。于是这个男子点了份炸洋葱圈,但职员说早餐时间不提供这玩意儿――该男子深感挫折,怅然离去。

年度特别大奖

警察在西雅图街道上发现一个严重不适的人蜷缩在一辆房屋汽车旁,那人后来承认他企图用虹吸管偷汽油――但他错误将吸管另一头放到了汽车房屋的粪桶里。

Slitaz Linux简体中文语言包(含Fcitx输入法)下载

转贴:http://hi.baidu.com/52abc/blog/item/4e58d2436180701572f05dfb.html

从Puppy Linux中文站下载然后repack出来的,不知道以后不会提交到官方软件库,这里给需要的人下载。这个软件包的名称叫chinese-pack,所以下载前请搜索下软件库,看有没有,没有再下载吧。

下载后使用cli包管理器导入,如软件包下载到桌面上:

cd Desktop

tazpkg chinese-pack-0.1.tazpkg

然后再将以下代码加入你的.profile里面:

export LC_CTYPE="zh_CN.UTF-8"
export XMODIFIERS="@im=fcitx"
export GTK_XIM_MODULES="fcitx"
export QT_XIM_MODULES="fcitx"
fcitx &

然后重新登录即可。默认的激活输入法按键是ctrl+空格键。

下载:

chinese-pack:https://dl.getdropbox.com/u/151075/chinese-pack-0.1.tazpkg
Slitaz Linux中文版:http://puppy.cnbits.com/node/231

PS.我本人未试用,仅保存,待来日重装备用。

Coding

vim做编辑
gcc做编译
gdb做调试
make做维护
ctags做交叉参考

ide在心中

2008年10月7日星期二

Linux系统的开机程序执行顺序(ZZ)

开机的程序是这样的:

1. 加载 BIOS 的硬件信息,并取得第一个开机装置的代号;

2. 读取第一个开机装置的 MBR 的 boot Loader (亦即是 lilo, grub, spfdisk 等

等) 的开机信息;

3. 加载 Kernel 操作系统核心信息, Kernel 开始解压缩,并且尝试驱动所有硬件装

置;

4. Kernel 执行 init 程序并取得 run-level 信息;

5. init 执行 /etc/rc.d/rc.sysinit 档案;

6. 启动核心的外挂模块 (/etc/modprobe.conf);

7. init 执行 run-level 的各个批次档( Scripts )