格雷码转换
格雷码属于可靠性编码,是一种错误最小化的编码方式,因为虽然二进制码可以直接由数/模转换器转换成模拟信号,但在某些情况,例如从十进制的 3 转换为 4 时二进制码的每一位都要变,能使数字电路产 生很大的尖峰电流脉冲。而格雷码则没有这一缺点,它在相邻位间转换时,只有一位产生变化。它大大地减 少了由一个状态到下一个状态时逻辑的混淆。
二进制计数编码从 0 到 15 的计数过程如下:
使用格雷码的最高位作为二进制的最高位,二进制次高位产生过程是使用二进制的高位和次高位格雷 码相异或得到,其他位的值与次高位产生过程类似。假设二进制和格雷码各个位分别使用如下字符表示:
n 位的二进制:Bn, Bn-1, Bn-2。。。B2, B1 , B0;
n 位的格雷码:Gn, Gn-1, Gn-2。。。G2, G1, G0;
转换公式: Bn =Gn;
介绍完格雷码如何转换到二进制后,我们再来看下二进制码如何转换到格雷码。
二进制码转化为格雷码原理如下:
二进制的最高位作为格雷码的最高位,次高位的格雷码为二进制的高位和次高位相异或得到,其他位与次高位类似。假设二进制和格雷码各个位分别使用如下字符表示:
n 位的二进制:Bn, Bn-1,Bn-2。。。B2,B1,B0;
n 位的格雷码:Gn, Gn-1,Gn-2。。。G2,G1,G0;
转换公式: Gn = Bn;
Gi-1=Bi ^ Bi-1; ( i=0,1,2,n-1; )
其运算过程的示意图如下图所示(这里以8 位的数据位宽为例):
从图可以很容易的看出,二进制码右移1 位后与本身异或,其结果就是格雷码。从最右边一位起,依次将每一位与左边一位异或(XOR),作为对应格雷码该位的值,最左边一位不变。
复位电路
1、 数字逻辑为什么需要复位?
数字电路中寄存器和RAM在上电之后默认的状态和数据是不确定的,如果有复位,可以把寄存器复位到初始状态0,RAM的数据可以通过复位来触发RAM初始化到全0。那可能很多人会问为什么是全0呢?其实一般逻辑起始都是从0开始变化的,这个是根据设计的需要设定的一个值,如果设计需要寄存器上电复位为1,也是可以的。还有一种情况是逻辑进入了错误的状态,通过复位可以把所有的逻辑状态恢复到初始值,如果没有复位,那么逻辑可能永远运行在错误的状态。因此复位功能是很重要的一个功能。
2、 同步复位好还是异步复位好呢?
同步复位指的是当时钟上升沿检测到复位信号,执行复位操作,有效的时钟沿是前提。
always @ (posedge clk) begin
if (rst_n == 1'b0)
y <= 1'b0 ;
else
y <= b ;
end
同步复位的优点如下:
a、有利于仿真器的仿真;
b、可以使所设计的系统成为100%的同步时序电路,有利于时序分析,而且可综合出较高的Fmax;
c、由于只在时钟有效电平到来时才有效,所以可以滤除高于时钟频率的复位毛刺。
同步复位也有一些缺点,缺点如下:
a、复位信号的有效时长必须大于时钟周期,才能真正被系统识别并完成复位任务。同时还要考虑诸如时钟偏移、组合逻辑路径延时、复位延时等因素(所以复位信号有时需要脉冲展宽,用以保证时钟有效期间有足够的复位宽度);
b、由于大多数的逻辑器件的目标库内的DFF都只有异步复位端口,所以,倘若采用同步复位的话,综合器就会在寄存器的数据输入端口插入组合逻辑,这样就会一方面额外增加FPGA内部的逻辑资源,另一方面也增加了相应的组合逻辑门时延。
异步复位
异步复位指的是无论时钟沿是否到来,只要复位信号有效,就对系统进行复位。当时钟上升沿检测到复位信号,执行复位操作。
always @ (posedge clk or negedge rst_n) begin
if (rst_n == 1'b0)
y <= 1'b0 ;
else
y <= b ;
end
优点:
a、大多数目标器件库的DFF都有异步复位端口,那么该触发器的复位端口就不需要额外的组合逻辑,这样就可以节省资源;
b、设计相对简单;
c、异步复位信号产生和响应都很方便(电路在任何情况下都能复位而不管是否有时钟出现)。
异步复位也有一些缺点,缺点如下:
a、最大的问题在于它属于异步逻辑,问题出现在复位释放时,而不是有效时,如果复位释放接近时钟有效沿,则触发器的输出可能进入亚稳态(此时clk检测到的rst_n的状态就会是一个亚稳态,即是0是1是不确定的),从而导致复位失败。
b、可能因为噪声或者毛刺造成虚假复位信号(比如系统正常工作时突然复位)(注意:时钟端口、清零和置位端口对毛刺信号十分敏感,任何一点毛刺都可能会使系统出错,因此判断逻辑电路中是否存在冒险以及如何避免冒险是设计人员必须要考虑的问题);
c、静态定时分析比较困难,静态时序分析一般是针对同步设计的,都是基于时钟周期来分析时序的。
d、对于DFT(DesignForTest可测性设计)设计,如果复位信号不是直接来自于I/O引脚,在DFT扫描和测试时,复位信号必须被禁止,因此需要额外的同步电路。
总结下来,推荐使用异步复位、同步释放的方式,并且复位信号为低电平有效:
1、复位信号到来的有效与否与clk无关,而且复位信号的撤除也与clk无关,但是复位信号的撤除是在下一个clk来到后才起的作用。
2、异步复位同步撤离的目的为了防止复位信号撤除时,可能产生的亚稳态。
always @ (posedge clk or negedge rst_async_n) begin
if (!rst_async_n) begin
rst_s1 <= 1'b0;
rst_s2 <= 1'b0;
end
else begin
rst_s1 <= 1'b1;
rst_s2 <= rst_s1;
end
end
assign rst_sync_n = rst_s2;
always @ (posedge clk or negedge rst_sync_n ) begin
if (rst_sync_n == 1'b0)
y <= 1'b0 ;
else
y <= b ;
end