Verilog学习总结

在这里插入图片描述
1、位操作 即按位与或 2 归约操作 |a 即 1|0|1|1 =1 3、逻辑操作 即正常的与或操作 观察是0与非0即可

assign a = a+b; 这种语法是不允许的,输入和输出信号不能是同一个名字, 否则的话会把一个组合逻辑电路变为一个时序逻辑电路,会出现反馈

assign小结
在这里插入图片描述

避免产生latch(锁存器)的方法:1、case(cur_state) ...**default**:next_state = 3'b000; endcase
2、next_state = 3'b000; //先声明 下一状态 case(cur_state) … //可以不用写default endcase

阻塞与非阻塞不能混用,组合逻辑电路只能用阻塞,时序逻辑电路则只能用非阻塞电路。
组合逻辑电路用[email protected]()括号内的输入信号:在所有赋值语句右侧出现的变量都要写在里面,也可以直接用*号表示

reg与wire的区别
一般[email protected]和initial输出的变量 用reg类型来定义。 wire为无逻辑连线,wire本身不带逻辑性,所以输入什么就的输出什么。所以如果用always语句对wire变量赋值,对不起,编译器报错。大体来说,reg和wire类似于C、C++的变量,但若此变量要放在begin…end之内,则该变量只能是reg型;在begin…end之外,则用wire型;使用wire型时,必须搭配assign;reg型可以不用。wire用在连续赋值语句assign中;reg用于always过程赋值语句中。

何时用wire

1、 assign 语句

reg a,b; wire out assign out = a|b; //wire只是一根无逻辑的线, 这条语句不是对out的赋值.综合时是将 a & b综合成 a、b经过一个与门,而out是连接到与门输出线,真正综合出来的是与门&,不是out。

如果定义out为reg 编译器会报错

2、元件实例化必须用wire
wire dout ram u_ram(.out(dout);)

initial与always的区别?
1、initial只执行一次,always循环执行
2、initial 的用处:产生激励信号、输出检查波形、赋初始值

编译引导语句`timescale的作用及使用?
1、用来说明程序中的时间单位和仿真精度
2、使用时必须放在模块最前端
3、尽可能的让时间单位和仿真精度接近

使用例程 timescale 10ns/1ns module mux (out,a,b,sel); and #2.33 and(a1,a,nsel);
这段代码即表示了时间单位为10ns,精度为1ns。 即延时了23ns

模块实例化的几种方法?
1、实例化时,实例对象必须有名字 2、没有连接的输入端口初始化值为x

代码示例
moudle comp(out1,out2,in1,in2)
input in1,in2; output out1 out2; endmodule

module text ;
comp c1(Q,R,J,K);//需按照顺序
comp c2(.in2(k),.out1(Q),.out2(R),.in1(J));//可以不按照顺序
comp c3(.in2(k),.in1(J));
comp c4(Q,K);//没有连接的默认初值为x
endmodule