首页 > 代码库 > 自己的verilog经验
自己的verilog经验
1.中间变量和输出变量都要用reg类型暂存一下,输出必须用reg寄存
2.对一个n‘b(n>=2)的寄存器赋值时可以直接在声明时:
reg [n-1:0] register=0;
在中间部分赋值时register[7:0]=0 是不对的,
可以用 register[7:0]=8‘hff 来赋值。
3.在宏定义中的数如果在代码中用到它的运算,那么 宏定义的数值 必须是整数
4.always 的敏感信号列表中 不能有 两个 posedge
如果有两个延触发就
always @(posedge clk or negedge RST)
if(!RST)
复位
else
算法
5.总是忘记:时序电路用非阻塞赋值!
assign 只能用阻塞
6.去抖
always@(posedge clk or posedgerst)
if(!rst)
cnt<=‘b0;
else if (valid_en)
cnt <=‘b0;
else if(key_jitter)
cnt<= cnt+1;
else cnt <= 0;
assign valid_en =cnt==n;//n的值由clk的周期决定.
7.在编写时钟树时,会用到buffer,buffer 的写法可以直接用 always@ (a)b<=a,但是若要禁止时,用1‘bz置成高阻。
8.慎用for语句!
always @ (posedge clk) begin
if(!rst_n) begin
num = 0;
end
else begin
for(i=0;i<13;i=i+1)begin //用for循环进行计算
if(data[i]) num =num+1;end
end
在此使用阻塞赋值,在一个周期内即可完成for.
如果使用非阻塞赋值,则一个周期只计算一次。
9. 同一个reg变量不能被多个always块驱动
&& 同一个变量的赋值不能受多个时钟控制,也不能受两种不同的时钟条件(或者不同的时钟沿)控制。
10. 锁存器
综合系统推导出锁存器的规则是:
(1)变量在条件语句(if或case语句)中被赋值。
(2)变量未在条件语句的所有分支中都被赋值。
(3)在always语句的多次调用之间需要保存变量值。
必须同时满足以上3个条件,才会将变量推导成锁存器。在设计时应明确是否需要将某一个变量推导成锁存器,如果需要,就必 须按照上面3条规则来编写代码。否则就会
导致综合前后功能的不一致。
?11.分频的时候可以以某一位为1做条件,这样就可以同时分出多个时钟。
12.if()....
if()....
和
if ()
else if()
的区别:当两个条件全为真时 前者两个都执行,后者只执行if中的语句。
自己的verilog经验