在verilog中基本逻辑单元分为两类时许逻辑和组和逻辑电路。区分方法,用always加时钟边沿检测的就是时许逻辑电路,其它的都是组合逻辑电路。组合逻辑电路赋值需要使用阻塞赋值,时许逻辑电路需要用非阻塞赋值。
当输入为wire类型时可以省略不写,在信号列表中无需体现信号的位数。
//四选一数据选择器,输入信号a,b,c,d,sel都为wire类型可以省略不写。
//sel位宽为两位,在信号列表中可以省略不写。
module mux4_to_1(a,b,c,d,sel,out);
input a,b,c,d;
input [1:0]sel;
output reg out;
always@(*)
begin
case(sel)
0:out=a;
1:out=b;
2:out=c;
default out=d;
end
endmodule
使用always时只有敏感条件为取边沿检测时才需要写铭感条件,其实时候敏感列表为“*”。
case中的x与z的用法,x和z可以用在case的后面,组成casex与casez,或者用在case的分支项。使用case时表达式需要与分支项相同,使用casez时表达式与分支向中除有z或?的那一位,其他位数需要相同,使用casex时表达式与分支项除有z或x或?的位数,其它位数需要一致。
同步复位与异步复位
同步复位是与时钟同步的复位,异步复位为无需时钟的边沿检测
//异步复位,只要clear信号为1时直接清零cnt
module counter(cnt,clear,clock);
input reg [3:0] cnt;
input clear,clock;
always@(posedge clear or negedge clock)
if(clear==1)cnt<=0;
else cnt<=cnt+1;
endmodule
//同步复位,当clear为1时不会立刻复位,需要等待时钟的下降沿到来后才进行清除
module counter(cnt,clear,clock);
input reg [3:0] cnt;
input clear,clock;
always@(negedge clock)
if(clear==1)cnt<=0;
else cnt<=cnt+1;
endmodule
“?”的嵌套用法
//使用assign和“?”写出case或if的用法
reg [1:0] sl;
reg a,b,c,d;
assign out = (sl==0)?a:
(sl==1)?b:
(sl==2)?c:d;