verilogHDL快速教程
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
‘timescale 1ns/10ps module mux_2to1_gates(a,b,sel,y); input a,b,sel; output y; wire sel,a_sel,b_sel; not #1 U_inv (inv_sel,sel); and #2 U_anda (asel,a,inv_sel), #2 U_andb (bsel,b,sel); or #2.5 U_or (y,asel,bsel); endmodule
wire,reg和其它类型 的变量声明,位宽说明
可选 低层模块实例 always 和 initial块,所有 行为语句都在块内
数据流语句 (assign)
任务和函数(如$monitor)
一般出现在 测试块中
endmodule
模型的源自文库种(分级)描述方法
• 门级和开关级
– 底层模型用来准确计算延迟和信号强度 – 太麻烦,但是考试要看
x=0
状态 s0 s1 s2 s3 s4 信号 hwy=g hwy=y hwy=r hwy=r hwy=r cntry =r cntry =r cntry =r cntry =g cntry =y
s0 x=1 s4 x=0 x=1 s3 s2 s1
‘define true 1‟b1 „define false 1‟b0 „define y2rdelay 3 //黄灯到红灯的延迟 ‘define r2gdelay 2 //红灯到绿灯的延迟
•Verilog信号是固定的几种(离散的) 1,0,z,x,strong1.... •Verilog数的表示可以是任意进制,但是最常用的是 {1,0}的位相量(总线)表示二进制定点数或浮点 数。 •Verilog除了时间延迟之外,就是信号的值。
基本的结构——模块module
verilog 的变量是硬件的连线(wire)总线或者有记忆的信 号连线(reg),没有说明的线宽为1.一般模块内的变量多 是二进制码数字信号,即0和1,x,z. module fulladder(s,cout,a,b,c) 模块名 ( 端口列 表 ); input a,b,c; output s,cout; 端口声明,参数声明
Verilog 入门快速教程
第10章 用Verilog硬件描述语言描述系统
http://www.asic-world.com/examples/verilog/gate.html
Verilog 的常识和特点
•Verilog的用于逻辑 模拟 和 综合(延迟用于模拟不能 综合)
•Verilog是数字电路模型,不是程序,变量代表信号和 连线不是操作数
2‟d1: y = d1;
2‟d2: y = d2;
2‟d3: y = d3; default : $display( “invalid control signals”); endcase
endmodule
5.6
有四种循环语句:
循环语句
repeat:将一块语句循环执行确定次数。 repeat (次数表达式) <语句> while:在条件表达式为真时一直循环执行 while (条件表达式) <语句> forever:重复执行直到仿真结束 forever <语句> for:在执行过程中对变量进行计算和判断,在条件满足时执行 for(赋初值;条件表达式;计算) <语句>
module sig_control( hwy,cntry,x,clock,clear);
output [1:0] hwy, cntry;//三个状态的2位输出,green,red,yellow
reg [1:0] hwy, cntry; //声明输出为寄存器类型 input x , clock , clear; parameter red = 2‟d0, //交通灯的状态 yellow = 2‟d1, green = 2‟d2; parameter s0=3‟d0, //状态转换图状态定义 s1=3‟d1, s2=3‟d2, s3=3‟d3,
• 连线的声明
– wire, supply1,supply0,strong0,strong1...
4:1的Mux 分 路器使用了3个 2:1的Mux分 路器
时间尺度
module mux_4to1_gates(a,b,c,d,sel,y); input a,b,c,d; input [1:0] sel; output y; wire mux_1,mux_2; mux_2to1_gates U_mux1 (a,b,sel[0],mux_1), U_mux2 (c,d,sel[0],mux_2), U_mux3 (mux_1,mux_2,sel[1],y); endmodule
系统任务 函数 输 出显示
停止 模拟
连续赋值语句建模 assign
module mux_using_assign(din_0,din_1, sel , mux_out ); input din_0, din_1, sel ; output mux_out; wire mux_out; assign mux_out = (sel) ? din_1 : din_0; endmodule 对wire 信号的连续赋值语句; 综合时直接生成组合逻辑电路
//或门(注释) module nor2_switch (a,b,y); input a, b; output y; supply1 power; supply0 ground; wire connect; nmos (y,ground,a); nmos (y,ground,b); pmos (y,connect,b); pmos (power,connect,a); endmodule
//用case语句实现四选一多路选择器
module mux4_to_1 ( y, d0,d1,d2,d3,s1,s0) output y;
input d0,d1,d2,d3;
input s1,s0; reg y; always @(d0 or d1 or d2 or d3 or s1 or s0) case ( {s1,s0}) 2‟d0: y = d0;
s4=3‟d4;
reg [2:0] state;
//内部状态变量
reg [2:0] next_state;
always @ (posedge clock) // 状态在时钟的上升沿更新 if (clear) state <= s0; else state <= next_state; always @ (state) begin hwy =green; cntry = red; case (state) s0: ; s1: hwy = yellow; s2: hwy = red; s3: begin //每个状态上hwy和cntry的值
延迟说明 #123
开关级建模
//非门(注释)
module not_switch (out, in); output out; input in; supply1 power; supply0 ground; pmos (out, power, in); nmos (out, ground, in); endmodule
非阻塞式 赋值
a. 常规事件控制
使用符号 @
@
语句执行的条件是信号的值发生了变化
正向跳变posedge 负向跳变negedge
@ (clock) q =d; //只要信号clock发生改变,就执行q=d语句 @ (posedge clock) q=d; //只要信号clock发生正向跳变,就执行q=d @ (negedge clock) q=d; //只要信号clock发生负向跳变……. q=@ (posedge clock) d; //立即计算d的值,在clock上升沿赋值给q
• 不需要连接的端口直接忽略掉即可
门级和开关级建模——描述
• 网表连接,内部端口(input,output)和外 部连线wire • 基本门(Gate Primitive)
– not,and,nand or,nor,xnor,bufif0,bufif1,notif0,notif1... – nmos,pmos,rcmos,rnmos,rpmos...
输出在最左边——书上的错了
TestBench 测试台(板)——激发 信号和输出显示
module board; wire [3:0] count; wire clock, f,af; m16 counter (count, clock, f, af); m555 clockGen (clock); always @(posedge clock) $display ($time,,,"count=%d, f=%d, af=%d", count, f, af); endmodule
行为级建模——异步复位的D触发器
(可以比较简洁地表示复杂的系统)
module dff_async_reset (data, clk, reset, q); input data, clk, reset ; output q; reg q; always @ ( posedge clk or negedge reset) if (~reset) begin q <= 1'b0; end else begin q <= data; end endmodule
模型名称相当于器件型号,模型内部说明它的参数和运作
端口等价于硬件 的引脚(pin)
端口在模块名字 后的括号中列出
端口可以说明为 input, output及 inout
端口声明
• • •
input 输入端口 output 输出端口 inout 双向端口
.模块的引用 及 端口与外部信号的连接
• 在调用模块时,可以用顺序连接和按名连接把模块定义的 端口与外部信号连接起来
begin
if (clear) q<=4‟d0;//为了生成触发器构成的时序逻辑电路,使用非阻塞赋值
else
q<=q+1;
endmodule
交通信号灯控制器
功能说明:
cntry 支路 主 路 (hwy) 主 路 (hwy) cntry 支路
• 由于主干道车多,因此优先级高, 默认为绿灯。 • 支路车少,但有车的时候必须为绿 灯,且维持一段时间,让车通过。 • 只要支路上不在有车,那么支路上 的绿灯马上变黄灯,接着变红灯, 同时主干道变绿灯。 • 一个传感器x用来判断支路上是否有 车等待,若有车等待,则x=1,否则 x=0; • 由绿灯→黄灯→红灯→绿灯,必须 有一定的时间间隔
TestBench 只在模拟中用在综合里不会用到
module example_ tb; reg input; wire output; DUT u1 (output, input); initial begin $monitor($time, "input=%b, output=%b",input,output); #20 input= 1; #20 input= 0; #20 input= z; #30 $finish; end endmodule
– – 顺序连接:需要连接的信号需要与模块声明的端口列表一致; 按名连接:端口和外部信号按名字连接在一起.
D_FF
d0 (d[ 0], clk, clr, q[ 0], qb[ 0]);
需要自己加的器件代号(instance name)
已经定义的模型module
D_FF d0 (.d(d[ 0]), .clk(clk), .clr(clr), .q(q[ 0]), .qb(qb[ 0])); 点变量是模型端口信号名,括号内是外接信号名称
循环语句只能在always或initial块中使用,循环语句可 以包含延迟表达式
• 四位计数器的行为建模(例子)
在数据流级或门级,我们可以根据硬件实现方式将其设计成脉动进位、同 步计数等。但是在行为级.我们是从一个更加抽象的角度来考虑问题的, 并不关心具体的硬件实现方法,而是对它的功能进行说明。 module counter ( q,clock,clear); output q; input clock,clear; reg [3:0] q; always @(posedge clear or negedge clock)
• 寄存器传输级 行为描述always,initial内
– ,posedge,negedge, wait,时间控制 – <=,=(reg信号的赋值:非阻塞式的,阻塞式的) – 条件分支循环语句:case,if,while
• 对wire 信号的连续赋值语句:
– assign a=b+c; – 综合时直接生成组合逻辑电路