直接参考 https://soc.ustc.edu.cn/Digital/lab1/verilog1/ 就可以了
High-level programe-like Description of Logic circuit
常见的 HDL 语言:
- VHDL
- Verilog(和 C 语言很像,普及率很高)
标识符:大小写敏感,不能数字开头
特殊值:0 1 Z (高阻态) X(未知)
wire 连线(默认)只能连一次
reg 寄存器
字面量
2’b00 2bits bin 00
6’o00 6bits oct 000 000
8’h00 8bit hex 00000000
3’sb101 3bit sign bin “101” 补码
线只能接一次 默认状态是 z
wire [n-1:0] myvar;//Data bus
wire a;//normal data wire
register 可以赋值多次,纯粹代表一个变量,默认是 x
类型:reg integer real time realtime
reg [n-1:0] a,b;// n bit reg vartiable
reg c,d,e;// 1 bit
reg d[5:0]
module mo(in1,in2);
...
endmodule
开关层次描述 pmos nmos
门级电路层次描述 and or nand
数据流层次描述 assign
行为级的描述 直接像 C 了 initial (一次性) always(循环)行为流控制关键字和 C 一样
所有电路都是并行工作,只要开始都同步在进行了
module examplemodule(in1, in2, out1, out2); //定义了一个名为examplemodule的模块
input in1, in2; //定义了in1和in2为输入端口
output out1, out2; //定义了out1和out2为输出端口
wire x, y; //定义了两个wire类型的中间变量x和y
reg a, b; //定义了两个reg类型的中间变量a和b
assign x=in1&y; //连续赋值语句
assign module_name u1(in1, in2, …); //调用模块实例
always@(in2) //与同一模块的其他并发语句,并行执行
begin //过程语句,顺序执行
…
end
endmodule
阻塞式赋值
reg [1:0] a,b;
initial
begin
a=0;
b=0;
end
//阻塞
always@(posedge clk)
begin
a=a+1;
b=a+1;
end
//非阻塞
always@(posedge clk)
begin
a<=a+1;
b<=a+1;
end
module ADN_G(A,B,F);
input A,B;
input F;
and U1(F,A,B)
endmodule
module ADN_G(A,B,F);
...
assign F = A&B
endmodule
~
|
逻辑计算符
always@(
当参数有改变的时候执行
buf
延时
自带的 module 参数统一第一个是输出,其他都是输入
input [1:0] A;
always@(D0 or D1 or D2 or D3 or A)
case(A)
2'b00:Y=D0;
...
endcase