当前位置:   article > 正文

sky 06笔记上

sky 06笔记上

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

注: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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

为什么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};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

可综合语法规则:如果描述的是寄存器,就用<=赋值

同步复位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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

异步复位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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

always语句块既可以描述时序逻辑,也可以描述组合逻辑。描述组合逻辑时,变量要定义为reg,同时用阻塞赋值。描述时序逻辑要用非阻塞赋值。

异步复位仿真结果:
在这里插入图片描述

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/355882
推荐阅读
相关标签
  

闽ICP备14008679号