Archive for 一月, 2010

sendmail alias

使用sendmail的alias功能

設定檔路徑: /etc/aliases
ex: vr_name:  real_user1, real_user2

設定完需下指令"newaliases"

Perl脚本

http://www.vaciller.com/manage/article/articledetail.asp?ID=35
Perl脚本:

#!/usr/local/bin/perl -w

use strict;
use Getopt::Long;
#use vars qw ($para);
#use File::Copy;

#get options
my %options;
GetOptions(\%options, "help|h|?", "deb") || print_usage();
if(exists $options{help}){
  print_usage();
}

#tools paths
my $ncvlog = "/home/cf/eda/ius/tools/bin/ncvlog";
my $ncelab = "/home/cf/eda/ius/tools/bin/ncelab";
my $ncsim = "/home/cf/eda/ius/tools/bin/ncsim";
my $verdi = "/home/cf/eda/verdi2009/bin/verdi";
my $novas = "/home/cf/eda/verdi2009/share/PLI/nc61/LINUX/nc_loadpli1/debpli.so";

#source files
my $srcfile = "";
$srcfile = "/home/cf/workspace/nc/counter/count.v";
$srcfile .= " /home/cf/workspace/nc/counter/count_tb.v";

#run verdi to debug
if(exists $options{deb}){
  system("$verdi -2001 $srcfile -ssf counter.fsdb");
#  system("$verdi -2001 $srcfile");
  die;
}

#compile
system("$ncvlog -messages $srcfile");

#elab
system("$ncelab -messages -access +wrc -loadpli1 $novas:deb_PLIPtr  worklib.counter_tb:module");

#simulation
system("$ncsim -messages worklib.counter_tb:module");

#the following is sub functions
sub print_usage{
  print "Run scripts: $0\n";
  print "$0 [-help|h|?] [-deb]\n";
  die;
}

PHP做簡單日曆

http://pink0420.pixnet.net/blog/post/4795571
<?
$year = date(“Y");
$month = date(“m");
$day = date(“d");
//本月最後一天
$lastday = date(“d",mktime (0,0,0,$month+1,0,$year));
//本月第一天星期幾
$firstweek = date(“D",mktime (0,0,0,$month,1,$year));
//上個月最後一天
$last_month_day = date(“d",mktime (0,0,0,$month,0,$year));

$week[“Sun"] = 0;
$week[“Mon"] = 1;
$week[“Tue"] = 2;
$week[“Wed"] = 3;
$week[“Thu"] = 4;
$week[“Fri"] = 5;
$week[“Sat"] = 6;

$first_day = $week[$firstweek];
$next_month_day =1;
$run7 = 1;
echo “<table>
<tr>
<td colspan=7 align=center><b>{$year}-{$month}</b></td>
</tr>
<tr>
<td>Sun</td>
<td>Mon</td>
<td>Tue</td>
<td>Wed</td>
<td>Thu</td>
<td>Fri</td>
<td>Sat</td>
</tr>";

for( $i=0 ; $i<35 ; $i++ ){
if($run7%7 ==1 ){
echo “<tr>";
}
if( $i<$first_day ){
$color = “#666666″;
$days = $lastday-($first_day-$i-1);
}else if($i<=$lastday+1){
$color = “#0000CC";
$days = $i-$first_day+1;
}
else{
$color = “#666666″;
$days = $next_month_day;
$next_month_day++;
}
echo “<td align=center><font color={$color}>{$days}</font></td>\n";

if($run7%7 ==0 ){
echo “</tr>\n";
$run7 = 1;
}else{
$run7++;
}

}
echo “</table>";

?>

毛刺信号及其消除

毛刺信号及其消除
在组合逻辑电路中,信号要经过一系列的门电路和信号变换。由于延迟的作用使得当输入信号发生变化时,其输出信号不能同步地跟随输入信号变化,而是经过一段 过渡时间后才能达到原先所期望的状态。这时会产生小的寄生毛刺信号,使电路产生瞬间的错误输出,造成逻辑功能的瞬时紊乱。在FPGA内部没有分布电感和电 容,无法预见的毛刺信号可通过设计电路传播,从而使电路出现错误的逻辑输出。
任何组合电路、反馈电路和计数器都可能是潜在的毛刺信号发生器。毛刺并不是对所有输入都有危害,如触发器的D输入端,只要毛刺不出现在时钟的上升沿并满足 数据的建立保持时间,就不会对系统造成危害。而当毛刺信号成为系统的启动信号、控制信号、握手信号,触发器的清零信号(CLEAR)、预置信号 (PRESET)、时钟输入信号(CLK)或锁存器的输入信号就会产生逻辑错误。任何一点毛刺都可能使系统出错,因此消除毛刺信号是FPGA设计中的一个 重要问题。毛刺问题在电路连线上是找不出原因的,只能从逻辑设计上采取措施加以解决。消除毛刺的一般方法有以下几种:
(1)利用冗余项消除毛刺
函数式和真值表所描述的是静态逻辑,而竞争则是从一种稳态到另一种稳态的过程。因此竞争是动态过程,它发生在输入变量变化时。此时,修改卡诺图,增加多余项,在卡诺图的两圆相切处增加一个圆,可以消除逻辑冒险。但该法对于计数器型产生的毛刺是无法消除的。
(2)取样法
由于冒险出现在变量发生变化的时刻,如果待信号稳定之后加入取样脉冲,那么就只有在取样脉冲作用期间输出的信号才能有效。这样可以避免产生的毛刺影响输出波形。
(3)吸收法
增加输出滤波,在输出端接上小电容C可以滤除毛刺,如图3所示。但输出波形的前后沿将变坏,在对波形要求较严格时,应再加整形电路,该方法不宜在中间级使用。

(4)延迟办法
因为毛刺最终是由于延迟造成的,所以可以找出产生延迟的支路。对于相对延迟小的支路,加上毛刺宽度的延迟可以消除毛刺。但有时随着负载增加,毛刺会继续出现,因而这种方法也是有局限性的。而且采用延迟线的方法产生延迟更会由于环境温度的变化而使系统变不可靠。
(5)锁存办法
当计数器的输出进行相"与"或相"或"时会产生毛刺。随着计数器位数的增加,毛刺的数量和毛刺的种类也会越来越复杂。毛刺在计数器电路输出中的仿真结果如图4所示,从图中可发现有毛刺出现。此时,可通过在输出端加D触发器加以消除。接D触发器后仿真结果如图5所示。

从图5可以看到,数据中的毛刺被明显消除。当FPGA输出有系统内其它部分的边沿或电平敏感信号时,应在输出端寄存那些对险象敏感的组合输出。对于异步输 入,可通过增加输入寄存器确保满足状态机所要求的建立和保持时间。对于一般情况下产生的毛刺,可以尝试用D触发器来消除。但用D触发器消除时,有时会影响 到时序,需要考虑很多问题。所以要仔细地分析毛刺产生的来源和毛刺的性质,采用修改电路或其它办法来彻底消除。

Latch 和 Flip-Flop

关于latch的讨论

latch和flip-flop都是时序逻辑,区别为:latch同其所有的输入信号相关,当输入信号变化时 latch就变化,没有时钟端;flip-flop受时钟控制,只有在时钟触发时才采样当前的输入,产生输出。当然因为二者都是时序逻辑,所以输出不但同 当前的输入相关还同上一时间的输出相关。
latch缺点:
1、没有时钟端,不受系统同步时钟的控制,无法实现同步操作;
2、对输入电平敏感,受布线延迟影响较大,很难保证输出没有毛刺产生;
在xilinx和altera器件的slice和LE中都能够同时支持生产d-latch和d-ff,在这一层面上二者有什么区别暂时没有想到。如果使用门电路来搭建latch和ff,则latch消耗的门资源比ff要少,这是latch比ff优越的地方。

latch的最大缺点就是没有时钟端,和当前我们尽可能采用时序电路的设计思路不符。
latch是电平触发,相当于有一个使能端,且在激活之后(在使能电平的时候)相当于导线了,随输出而变化,在非使能状态下是保持原来的信号,这就可以看出和flip-flop的差别,其实很多时候latch是不能代替ff的
1.latch对毛刺敏感
2.在ASIC中使用latch的集成度比DFF高,但在
FPGA中正好相反,因为FPGA中没有标准的latch单元,但有DFF单元,一个LATCH需要多个LE才能实现
3.latch将静态时序分析变得极为复杂
4.目前latch只在极高端电的路中使用,如intel 的P4等CPU。
FPGA中有latch单元,寄存器单元就可以配置成latch单元,在xilinx v2p的手册将该单元成为register/latch单元,附件是xilinx半个slice的结构图。其它型号和厂家的FPGA没有去查证。——个人认为xilinx是能直接配的而altera或许比较麻烦,要几个LE才行,然而也非xilinx的器件每个slice都可以这样配置
altera的只有DDR接口中有专门的latch单元,一般也只有高速电路中会采用latch的设计。
altera的LE是没有latch的结构的

又查了sp3和sp2e,别的不查了,手册上说支持这种配置。有关altera的表述wangdian说的对,altera的ff不能配置成latch,它使用查找表来实现latch,

一般的设计规则是:在绝大多数设计中避免产生LATCH.
它会让您设计的时序完蛋,并且它的隐蔽性很强,非老手不能查出.
latch最大的危害在于不能过滤毛刺。这对于下一级电路是极其危险的。
所以,只要能用D触发器的地方,就不用latch。
有些地方没有时钟,也只能用latch了。

很简单一个例子来说明:
比如现在用一个clk接到latch的使能端(假设是高电平使能),这样需要的setup时间,就是数据在时钟的下降沿之前需要的时间,但是如果是一个 DFF,那么setup时间就是在时钟的上升沿需要的时间.这就说明如果数据晚于控制信号的情况下,只能用latch,这种情况就是,前面所提到的 latch timing borrow.基本上相当于借了一个高电平时间.也就是说,latch借的时间也是有限的.

对latch进行STA的分析其实也是可以,但是要对工具相当熟悉才行.不过很容易出错.当前PrimeTime,是支持进行latch分析的.现在一些综合工具内置的STA分析功能也支持,比如RTL compiler, Design Compiler.
除了ASIC里可以节省资源以外。
我感觉latch这个东西在同步设计里出现的可能还是挺小的吧,
现在处理过程中大都放在ff里打一下,
影响不太大吧