#50 ********和*****=#50 ****的区别:
前者对于的是整条语句 后者是对于计算出结果后延时50单位再赋值
对于非阻塞赋值 一般真正得到的值是语句快结束的赋值语句 因为延时还没过 就经历了很多运算,根本没有改变他的值,只有最后一个才能改变他的值
a<=d ;b<=a;q<=b综合出来是三个 因为是有延时传输的,不能忽略这个传输延时就是三个d触发器
a=d;b=a;q=b综合出来就是一个d触发器
不完整条件语句会经过综合生成锁存器 latch
不完整条件语句经常用在程序调试
优先编码器可以用if esle嵌套来实现优先级
if(enb)d<=q;else d<=4'hz用来描述三态门
双端端口当输入时候,必须先赋值成高阻态 用enb来调整 t=enb?d:4‘hz 不然会发生线与
多个三态门一般用多个always来写 不然在一个always里面写if很容易错
三态门可以用在总线 和分时传输 电平转换等
双向端口一般用在数据传输,双向数据总线的构建
自定义原件:
primitive XOR2(DOUT,X1,X2)
input X1,x2;
output DOUT;
table //X1 X2 : DOUT
0 0 : 0;
0 1 : 1;
1 0 : 1;
1 1 : 0;
endtable
endprimitive
调用语句:
XOR2 U1(so,a,b)
其中定义元件时候 列真值表的时候 可以用?来代表不关心
11分频 占空比为50%
module div11
11位加法计数器 cnt
上升沿cnt<11/2时候x_p=1 否则为0
下降沿时候x_n=x_p
然后把x_n和x_p相或 就得到最终波形
7.5分频
module div7p5x
先来一个7.5*2也就是15加法计数器cnt
上升沿时候 cnt<15/4 xp=1 否则为0
下降沿时候 cnt>15/2&&cnt<15/2+15/4 xn=1 否则为0
然后把xp和xn相或
.5是因为两个波形上升沿下降沿错位相或产生的
11分频是因为刚好都错开了 而加了1产生的偶分频