数字IC零散知识点记录--同步更新(2024/01/18)

两种不同延时

#10 a = b; 线路延时
a = #10 b; 时钟延时

并行块 fork … join

格雷码

相邻数字每次只有1bit变化
实现方法: assign gray = ( bin>>1)^bin ;bin为2进制数,gray为转换的格雷码
即bin从左边第二个数起,每个bit与左边的bit做异或运算

异步复位与同步复位

异步
always@(posedge clk or negedge rst_n)
同步
always@(posedge clk)
因为异步复位可能会给电路带来亚稳态问题,因此需要异步复位同步释放;
部分代码示意:

output reg  rst_s1;
output reg  rst_s2;
always@(posedge clk or negedge rst_n)
begin
	if(~rst_n)
		begin
			rst_s1 <= 0;
			rst_s2 <= 0;
			end
	else
		begin
			rst_s1 <= 1;
			rst_s2 <= rst_s1;
			end
end

在这里插入图片描述
综合电路描述:(两个DFF 相同clk 输入上拉)

跨时钟域 (CDC问题) 单bit

1、由慢同步到快时钟域(简单)
慢时钟与快时钟相差2倍以上,直接打两拍即可;
或者用边沿检测
如果相差不多,1-2倍,可以采用握手信号的方式(缺点:需要很多cycle)

2、由快时钟域到慢时钟域(复杂)
常用方法:展宽
快时钟域下的脉冲信号,送到慢时钟域打2拍,再送到快时钟域中打2拍,此时2拍后作为展宽脉冲的下降沿;

跨时钟域 多bit

当信号是多bit时,如果他是每一bit都是单独有意义,即是由多个单bit拼接起来的,那把每个bit分别跨时钟处理即可;
但如果是addr地址线这种,属于真多bit信号,则要按其他方法处理
常用放法:
一、多bit信号转单bit信号(※)
如果多bit信号,它的bit之间是有逻辑关系的,即你知道1bit,其他bit你也能推出来,那么你可以将它转换为单bit处理,和前面刚说的假 多bit有点相似;

二、MUX/DMUX同步(※※※)
提供一个和多bit数据同步的使能信号,使能信号有效时,你再去同步;
如下图所示:(以慢到快为例)将使能信号从源时钟过渡到目的时钟后,作为MUX的选择信号,当enable_A有效时再进行同步,保证了所有bit在同一个使能信号有效时刻同步。其做法无非就是给多bit信号来个单bit“替身”,让单bit替身先去在Clkb打2拍同步去,同步好了再回来叫我多bit“本身”,替身单bit已经是被同步了,那它回来叫多bit时(由于是慢到快),自然已经是稳定状态,让clkb去采集。(感觉就是延时一段时间啊)。
在这里插入图片描述
(图来自同站博主:carrotbanana,侵删)

那如果多bit 是快时钟呢?
那解决方法类似于展宽,将多bit数据拉长处理,再用以上类似方法

三、握手机制(※※※)
采用握手机制也可以处理数据的CDC问题,其方法就是利用req和ack信号,示意图如下:
请求信号req和应答信号ack都是单bit即可,同步问题即单bit问题不赘述;

感觉写到这里,跨时钟域问题已经不想分类总结了,无论什么方式方法,只要是慢到快时钟,你就打2拍;快到慢时钟,你就让快时钟信号保持一段时间不变,等会慢时钟,让它采到了,你再变化,都是一个路子~~🤐🤐🤐
在这里插入图片描述
(图来自同站博主:carrotbanana,侵删)

同步FIFO

特点:先入先出,读写一个时钟
读空的判断:读指针r_addr追上了写指针w_addr
写满的判断:当w_addr绕了一圈回来,追上r_addr时,为写满
简单画个示意图:
同步fifo
同步fifo
代码思路
可以用一个二维数组实现RAM
reg [DATA_WITCH-1 : 0] fifo_buffer [DATA_DEPTH-1 : 0];

输出输出
I: clk, rst_n, wrreq, rdreq, [DATA_WIDTH-1:0]data_in;
O: empty, full, almost_empty, almost_full, usedw(已使用fifo量),data_out;

参数设置
parameter --> FIFO的位宽,深度

写操作&写地址
wrreq & ~full -->写指针加1,输入数据

读操作&读地址
rdreq & ~empty --> 读指针加1,输出数据

计算fifo中的数据个数:
case({wrreq,rdreq})
4中情况 00,01,10,11
不读不写,数据量不变,usedw不变
只读不写,usedw -1
只写不读,usedw+1
又写又读,usedw不变

将空,将满将fifo_cnt与0,DEPTH比较即可。

异步FIFO

特点:读写时钟不一致
关键点:读空写满的判断
本质:对读指针(地址)与写指针的判断
总结:“写满”的判断:将读指针同步到写指针的时域,再与写指针判断;
“读空”的判断:将写指针同步到读指针时域,再与读指针判断;

我们先来考虑写满的情况:写指针绕了一圈回来追上读指针(此时情况,写时钟快,读时钟慢)
r_addr -->转格雷码–>跨时域–>判断:读写指针相同,写满了

但实际情况呢?当读指针同步过来时(一般2个写时钟,上面假设的是写时钟快,那慢时钟到快时钟域一般打2拍就可以了),读指针可能往前继续读(写clk比读clk快的越多,读指针往前的距离应该越小),即此时你把读指针同步过来后的判断,写指针==读指针,是假“写满“”,因为可能还有一点刚被读出去的空间。
所以这种方式:1、不会对FIFO的功能造成破坏,不会在写满的情况还继续写,反而保留了一点空间。
※FIFO的深度是2^N
上面说的是写指针快读时钟慢的情况,那么反过来呢?
如果读指针的时钟比写的块,那你同步过来,问题就先变成了多bit 的快到慢的跨时钟域问题;
可采用的解决方法:格雷码
假设读写地址是16位的,由于每个相邻地址只有1bit变化,那么即使发生漏采(写慢时钟采读快时钟),也可能是相对于16bit的后面几位发生了变化而漏采,那么会导致写满提前判断为真,和上一种情况一样,只是多留了一些空间,不会影响FIFO的功能。
或者采用其他多bit快到慢的方法(但是一般好像都用格雷码),上面有不赘述;

再看“读空的判断”
思路是一样的,所以回归这个问题的本质:就是格雷码下判断读写地址。
读空:格雷码相等
写满:因为写满需要写指针绕一圈回来,再等于读指针,因此我们需要扩展一bit,作为写有没有超过读一圈的标志。
这1bit标志,可以让它只要到了最大地址就翻转一下就行了…
在这里插入图片描述
(图片来自同站博主Rose Island 侵删)
那么写满就是最高扩展的那bit相反,次高位也相反,其余相同;(格雷码的特点,镜像对称)
这个读空写满的判断,应该是发生在读写之后,指针跳到下一个时,去判断;

数字IC常用Verilog代码(common code)

单bit信号同步

module data_sync(
clk,
rstn,
din,
dout
);

input clk;
input rstn;
input din;
output dout;

reg	d_sync;
reg	dout;
always@(posedge clk or negedge rstn)
	if(~rstn)
		d_sync <=0;
	else
		d_sync <= din;

always@(posedge clk or negedge rstn)
	if(~rstn)
		dout <= 0;
	else
		dout <= d_sync;

endmodule

单bit信号上升沿

module data_pos_det(
clk,
rstn,
din,
dout
);
 
input	clk;
input	rstn;
input	din;
output 	dout;

reg din_r;
always@(posedge clk or negedge rstn)
	if(~rstn)
		din_r <= 1'b0;
	else
		din_r <= din;

assign dout = (~din_r) & din;

endmodule

单bit信号下降沿

module data_pos_det(
clk,
rstn,
din,
dout
);
 
input	clk;
input	rstn;
input	din;
output 	dout;

reg din_r;
always@(posedge clk or negedge rstn)
	if(~rstn)
		din_r <= 1'b0;
	else
		din_r <= din;

assign dout = ~din_r & (~din);

endmodule

低功耗设计之isolation cell

作用:不同电压域之间的电压钳制和隔离作用;
isolation cell是shutdown模块和always on模块之间的接口,用于隔离两个不同的 power domain;
在这里插入图片描述
控制端EN来决定输入端A是否输出到Y;A输出到Y,此时iso相当于一个buffer;断开时,Y端保持固定的高电平或者低电平;

为了保证isolation cell能够在power down的时候仍然能够正常工作,一般来说isolation cell都会有一个primary power和一个secondary power,后者能够保证前者power down时器件仍然能够工作。
即如上图所示:iso cell 的两组 power:primary power VDD 和 backup power VDDB,当 左边domain 关掉时, VDD off,此时就由 VDDB 供电,维持 Y 端的固定电平。

复习总结下各种门电路

·半导体
在硅(Si)中掺了磷§元素,有一个负电荷到处跑,我们称之为N型掺杂;
在硅(Si)中掺了硼(B)元素,有一个空穴到到处跑,我们称之为P型掺杂;
在这里插入图片描述
将两个连在一起,组成了PN结,P端有空穴,N端有电子,连在一起,N端的电子就想往P端的空穴跑,如果将其两端连上电源,电源正极接P,负极接N,那么电流就正好流动起来了,电路导通;
在这里插入图片描述
反之则不能导通(简单理解)

`CMOS(互补式金属氧化物半导体)
互补,是指由PMOS和NMOS两种管组成的电路;
理解与记忆:拿NMOS管举例
NMOS管就是N沟道场效应管,它的衬底是P型半导体,两边是N型半导体,如下图示意:
在这里插入图片描述
(参考知乎博主:Celeste 侵删)
这就相当于形成了2个PN结,但是你外接一个电源,无论电源正负方向,有一个PN结总是导通不了的,但此时你在上下方向再加一路电源(P接正N接负),类似电容,在电压电场的作用下,会有电子从上往下移动,而这个位置正好是两个N型中间,类似一道水沟,而这个水沟流动的电子,也正好把两旁隔开的N型连通了,那整天就可以看做是一个大的PN结,上下是在左侧电源下导通了,而AB两端的N型也由此导通了。
抽象的符号如下
在这里插入图片描述
X端加电压(为1),AB端导通,有点类似水龙头有没有,X端就是开关,AB端是水管。。。

  • 11
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值