sky 06笔记上

本文介绍了数字电路中的1bit状态、反相器行为、不同数制表示(包括补码)以及Verilog编程中的基本组件如andgate和寄存器(DFF)。重点讨论了Verilog的事件触发性质,可综合与非综合描述的区别,以及同步与异步复位DFF的实现。
摘要由CSDN通过智能技术生成

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,同时用阻塞赋值。描述时序逻辑要用非阻塞赋值。

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

  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值