1.数字电路中,1bit有四种状态:0、1、x、z
其中1‘bx未知电平是不允许的,1‘bz是无驱动的未知电平,仅在pad处(IO端口)允许,比如open-drain电路,enable无效的情况下,不对外驱动,即不对外输出电流,此时在板子上,可以通过上拉/下拉电阻固定电平。
2.反相器的输入有X、Z,输出为X。
3.-128的原码,补码,反码
原码(9bit):1,1000,0000
反码(9bit):0,0111,1111
补码(8bit): 1000,0000,为反码加一,注意补码的最高位不表示正负。
3.在数字电路系统中,通常使用补码表示数值,在数学上方便加减法运算的数字电路实现。例如:-1和1的补码相加为0。
原码 反码 补码
1 0000,0001 0000,0001 0000,0001
-1 1000,0001 1111,1110 1111,1111
4.Verilog 描述分为两大类:可综合描述和不可综合描述。
5.描述两输入and gate
module and(
a,
b,
y);
input wire a,b;
output wire y;
assign y = a & b;
endmodule
注:output 可以reg型和wire型,input只能wire型(模块内部)。
引用https://blog.csdn.net/biology24/article/details/94612247
testbench:
module tb_and();
reg a,b;
wire y;
initial begin
a=0;b=0;
#10;
a=0;b=1;
#10;
a=1;b=0;
#10;
a=1;b=1;
#10;
$display("Info: sim end.");//打印至终端
$finish();
end
and u_and(
.a (a),
.b (b),
.y (y)
);
endmodule
为什么a,b,y不用定义input,output?
因为对于tb顶层模块,它们是内部信号,因此括号里也没有。
6.Verilog是事件触发的并行语言。比如assign语句的右边就是它的触发条件,Verilog为了匹配数字电路的行为,定义这种事件触发的语法。语句块之间是并行执行的,语句块内顺序执行。
7.其他逻辑
assign y_buf = a;
assign y_not = ~a;
assign y_and = a & b;
assign y_or = a | b;
assign y_xor = a ^ b;
assign y_nand = ~(a & b);//与非
assign y_nor = ~(a | b); //或非
assign y_nxor = ~(a ^ b); //异或非
assign y_mux = sel ? b : a;
assign y_add = {1'b0,a} + {1'b0,b};
8.Verilog描述DFF
同步DFF
module DFF(
clk,
d,
q);
input wire clk, d;
output reg q;
always @(posedge clk)
q <= d;//non-blocking assignment
endmodule
可综合语法规则:如果描述的是寄存器,就用<=赋值
同步复位DFF
module DFF(
rstn,
clk,
d,
q);
input wire rstn,clk,d;
output reg q;
always@(posedge clk)
if(!rstn)
q <= 1'b0;
else
q <= d;
endmodule
异步复位DFF
module DFF(
rstn,
clk,
d,
q);
input wire rstn,clk,d;
output reg q;
always@(posedge clk or negedge rstn)
if(!rstn)
q <= #1 1'b0;//加上#1可避免时钟上升沿跟q同时变化
else
q <= #1 d;
endmodule
testbench:
module tb_DFF();
wire q;
reg rstn,clk,d;
always #5 begin
clk = ~clk;
end
initial begin
clk = 0;
rstn = 1;
d = 1;
#20;
#1;//delay一个time unit,让后续rstn,d的变化跟clk edge错开。
rstn = 0;
#30;
rstn = 1;
#20;
d = 0;
#20;
d = 1;
$display("Info: sim end.");//打印至终端
$finish();
end
DFF u_DFF(
.rstn (rstn),
.clk (clk),
.d (d),
.q (q)
);
endmodule
always语句块既可以描述时序逻辑,也可以描述组合逻辑。描述组合逻辑时,变量要定义为reg,同时用阻塞赋值。描述时序逻辑要用非阻塞赋值。
异步复位仿真结果: