第3章数字系统设计verilog hdl第6版,王金明
EDA技术及应用—Verilog HDL版第6章
第6章 Verilog HDL设计应用实例
3) 8位布斯乘法器 布斯(booth)乘法算法,是先将被乘数的最低位加设一虚 拟位,开始时虚拟位设为0,并存放于被乘数中。根据最低 位与虚拟位构成的布斯编码的不同,分别执行如下四种运算: (1) 00:不执行运算,乘积缓存器直接右移1位。 (2) 01:将乘积加上被乘数后右移1位。 (3) 10:将乘积减去被乘数后右移1位。 (4) 11:不执行运算,乘积缓存器直接右移1位。
第6章 Verilog HDL设计应用实例
第6章 Verilog HDL设计应用实例
6.1 8位加法器的设计 6.2 8位乘法器的设计 6.3 8位除法器的设计 6.4 可调信号发生器的设计 6.5 PWM信号发生器的设计 6.6 数字频率计的设计 6.7 数字秒表的设计 6.8 交通灯信号控制器的设计 6.9 高速PID控制器的设计 6.10 FIR滤波器的设计 6.11 CORDIC算法的应用设计 6.12 闹钟系统的设计
pc1[k] = pp[k] & pc[k] | pp[k] & ps[k+1] | pc[k] & ps[k+1];//
end ps1[width-1] = pp[width-1];
//将pp乘积指定给ps1
第6章 Verilog HDL设计应用实例
pc1[width-1] = 0; //设定每列的最后一个进位都为0
//a为被乘数,b为乘数 //16位乘积
第6章 Verilog HDL设计应用实例
begin ra = a; rb = b; if (a==0 || b==0)
//当a=0或b=0时,rp=0
rp = 16'b0;
else if (a==1)
数字系统设计与veriloghdl课后答案
数字系统设计与veriloghdl课后答案【篇一:数字逻辑与数字系统设计习题参考答案】>第1章习题解答1.3 (1)86(2)219(3)106.25(4)0.6875 (4)0.1011.4 (1)101111(2)1001000(3)100001l.111.5 (1)(117)10=(165)8=(1110101)2=(75)16(2)(3452)10=(6574)8=(110101111100)2=(d7c)16(3)(23768.6875)10=(56330.54)8=(101110011011000.1011)2=(5cd 8.b)16 (4)(0.625)10=(0.5)8=(0.101)2=(0.a)16 1.6(1)(117)8=(1001111)2=(79)10(2)(7456)8=(111100101110)2=(3886)10(3)(23765.64)8=(10 0111 1111 0101.1101)2=(10229.8125)10(4)(0.746)8=(0.11111)2=(0.96875)10 1.7 (1)(9a)16=(10011010)2=(154)10(2) (3cf6)16=(11110011110110)2=(15606)10(3) (7ffe.6)16=(111111*********.011)2=(32766.375)10 (4)(0.c4)16=(0.110001)2=(0.765625)10 1-8(1)(125)10=(000100100101)8421bcd(2)(7342)10=(0111001101000010)8421bcd(3)(2018.49)10=(0010000000011000.01001001)8421bcd(4)(0.785)10=(0.011110000101)8421bcd1.9(1)(106)10=(1101010)2 原码=反码=补码=01101010 (2)(-98)10=(-1100010)2原码=11100010反码=10011101 补码=11100011(3)(-123)10=(-1111011)2 原码=11111011反码=10000101 补码=11111011(4)(-0.8125)10=(-0.1101)2 原码=1.1101000反码=1.0010111 补码=1.00110001.10(1)(104)10=(1101000)2 [1101000]补=01101000(-97)10=(-1100001)2 [-1100001]补=1001111101101000 + 10011111 0000011110000011 + 01001111 11010010[104-97]补=01101000+10011111=00000111, 104-97=(00000111)2=7 (2) (-125)10=(-1111101)2(79)10=(01001111)2[-1111101]补=10000011 [01001111]补=0100111101111000 [-125+79]补=10000011+01001111=11010010,-125+79=(-0101110)2=-46 (3) (120)10=(1111000)2[01111000]补=01111000(-67)10=(-1000011)2[-1000011]补=10111101[120-67]补=10000011+01001111=00110101,-125+79=(00110101)2=53 (4) (-87)10=(-1010111)2[-1010111]补=10101001(12)10=(1100)2[1100]补=00001100[-87+12]补=10101001+00001100=10110101,-125+79=(-1001011)2=-75+ 10111101 0011010110101001+ 00001100 10110101第2章习题解答2.3 解:根据逻辑图可直接写出逻辑表达式:(a) f=ab?bc;(b)f=abbcac解:设3个输入变量分别为a、b、c,输出为f,按题意,其中有奇数个为1,则输出f=1,因此可写出其逻辑表达式为f=abc?abc?abc?abc。
EDA技术与Verilog设计王金明版第6章
6.2 块语句
并行块fork-join fork-join块中的所有语句是并发执行的。
ቤተ መጻሕፍቲ ባይዱ
比如: fork regb=rega; regc=regb; join 由于fork-join块内的语句同时执行,在上面的块语句执行完 后,regb更新为rega的值,而regc的值更新为没有改变前 regb的值,故执行完成后,regb与regc的值是不同的。
如果加上时序控制,则这个always语句将变为一条 非常有用的描述语句。见下例:
[例]:always #half_period areg = ~areg; 这 个 例 子 生 成 了 一 个 周 期 为 :period(=2*half_period) 的无限延续的信号波形, 常用这种方法来描述时钟信号,作为激励信号来测 试所设计的电路。 Verilog提供三种时序控制方法:基于延迟的时 序控制、基于事件的时序控制和电平敏感的时序控 制。
������ initial 过程块的使用主要是面向功能模拟的,通常用 来描述测试模块的初始化、监视、波形生成等功能; ������ always过程块的使用主要是对硬件功能模拟的行为进 行描述,也可以在测试模块用来对时钟进行描述。利用 always过程块可以实现触发器、锁存器和组合电路。 一个模块中可有多个initial和always语句,代表多个过程 块的存在,它们之间相互独立,并行运行
Verilog HDL行为语句
类别 initial 过程语句 块语句 always 串行块begin-end 并行块fork-join √ √ 语句 可综合性
赋值语句
持续赋值assign
过程赋值=、<= if-else
√
√ √ √ √
数字系统设计verilog HDL 第 版 王金明
第3章 Quartus Prime使用指南3.1 Quartus Prime原理图设计n3.1.1 半加器原理图设计输入Quartus Prime的主界面Quartus Prime的主界面3.1.1 半加器原理图设计输入输入元件Quartus Prime的主界面3.1.1 半加器原理图设计输入半加器电路图Quartus Prime的主界面3.1.1 半加器原理图设计输入使用New Project Wizard创建工程Quartus Prime的主界面3.1.1 半加器原理图设计输入设置Directory,Name,Top-Level Entity对话框Quartus Prime的主界面3.1.1 半加器原理图设计输入将设计文件加入当前工程中Quartus Prime的主界面3.1.1 半加器原理图设计输入选择目标器件Quartus Prime的主界面3.1.1 半加器原理图设计输入选择综合器、仿真器Quartus Prime的主界面3.1.1 半加器原理图设计输入工程信息汇总显示Quartus Prime的主界面3.1.2 1位全加器设计输入Quartus Prime的主界面创建元件符号对话框3.1.2 1位全加器设计输入Quartus Prime的主界面1位全加器原理图3.1.3 1位全加器的编译n选择菜单Processing→Start Compilation,或者单击按钮,即启动了完全编译,完全编译包括如下5个过程:n分析与综合(Analysis & Synthesis);n适配(Fitter);n装配(Assembler);n定时分析(TimeQuest Timing Analysis);n网表文件提取(EDA Netlist Writer)。
Quartus Prime的主界面3.1.3 1位全加器的编译Quartus Prime的主界面编译信息汇总3.1.4 1位全加器的仿真Quartus Prime的主界面建立Quartus Prime和Modelsim的链接3.1.4 1位全加器的仿真Quartus Prime的主界面设置仿真文件的格式和目录3.1.4 1位全加器的仿真Quartus Prime的主界面自动生成的Test Bench模板文件3.1.4 1位全加器的仿真Quartus Prime的主界面对Test Bench进一步设置3.1.4 1位全加器的仿真1位全加器时序仿真波形图Quartus Prime的主界面3.1.5 1位全加器的下载n本例针对的下载板为DE2-115,故目标器件应为:EP4CE115F29C7。
Verilog HDL数字设计实训教程第1章 Verilog HDL数字设计实训基础
图1-2 按键电路连接图和管脚对应图
1.1 实训平台
4个LED灯:
图1-3 LED电路连接图和管脚对应图
1.1 实训平台
2个数码管:
图1-4 数码管电路连接图和管脚对应图
1块液晶:
1.1 实训平台
图1-5 液晶电路连接图和管脚对应图
1个UART:
1.1 实训平台
图1-6 UART电路连接图和管脚对应图
if(p==N-1) begin p=0; clk_p=~clk_p; end else p=p+1; end always @(negedge clk) begin
if(q==N-1) q=0; else q=q+1;
if(p==(N-1)/2) clk_q=~clk_q; end assign clk_N=clk_p^clk_q; endmodule
图1-39 设置USB硬件端口
QuartusII设计流程
5.引脚锁定和硬件验证
图1-40 下载界面
QuartusII设计流程
5.引脚锁定和硬件验证
图1-41 选择下载文件
QuartusII设计流程
5.引脚锁定和硬件验证
图1-42 led灯闪烁的效果
1.3 分频器设计
分频器电路是非常有用的一种电路, 分频的方法很多,最常见的是利用加 法计数器对时钟信号进行分频。
begin if(p==N/2-1) begin p=0; clk_N=~clk_N; end else p=p+1;
end endmodule
图1-44 任意偶数分频仿真波形
1.3 分频器设计
【例1-5】 可设置参数的任意整数分频器:占空比可变。 module divf_parameter(rst,clk,en,clkout); input rst,clk,en; output clkout; integer temp; //最大值为2的32次方 parameter N=7,M=3; //N为分频系数,M/N为占空比 always @(posedge clk)
verilog数字系统设计教程PPT课件
• 复杂数字系统的构成; • 基本电路和 Verilog 的对应关系; • 同步有限状态机在电路中的作用; • 时钟树与自动综合技术
数字逻辑电路的构成
- 组合逻辑:输出只是输入逻辑电平的函
数(有延时),与电路的原始状态无关。
• 时序逻辑:输出不只是输入的逻辑电
平的函数,还与电路所处的状态有关。
8 ‘ d 31
8‘d
t
out[15:0]
202
16 ‘ d
16‘ d
t
Sn 开
93
606
t 关
全局时钟网和平衡树结构
触发器1
全局时钟网络 触发器 图1 全局时钟网示意图
缓冲器
触发器n
图2 平衡树结构示意图
避免冒险和竞争
• 由于组合逻辑和布线的延迟引起
a
c
b
a
b
t
c
t
clock
避免冒险和竞争与流水线
t
t
带寄存器的八位数据通路控制器的波形
ControlSwitch
in[7]
out[7]
CLOCK
out[7]
D Q[7]
ControlSwitch
in[0]
out[0]
CLOCK
out[0]
D Q[0]
带寄存器的八位数据通路控制器的Verilog描述
`define ON 1 ‘b 1 `define OFF 1 ‘b 0 wire ControlSwitch; wire clock wire [7:0] out, in;
ControlSwitch in[7]
out[7]
…... …...
in[0]
第3章 Verilog HDL数据流级建模
对于除法
11%4 结果为3 12%4 结果为0,整除 -11%4 结果为为-3,计算11%4, 再取第一个数的正负号作为结果的符号 11%-4 结果为3,计算11%4, 再取第一个数的正负号作为结果的符号
21
按位操作符
Verilog HDL数字系统设计及仿真
~:按位取反,单目操作,即只有一个操作数。 &:按位与操作,双目操作,带两个操作数 | :按位或操作,双目操作,带两个操作数 ^ :按位异或操作,双目操作,带两个操作数 ^~:按位同或操作,双目操作,带两个操作数பைடு நூலகம்
6
操作数
Verilog HDL数字系统设计及仿真
数据类型 parameter型 wire型 reg型 integer型 time型
功能 用于参数的描述 用于描述线网 用于描述寄存器 用于描述整数类型 用于描述时间类型
7
数字
Verilog HDL数字系统设计及仿真
基本格式
2'b01 4'd11
可选 不可缺少
size=6 delay=6
14
Verilog HDL数字系统设计及仿真
使用关键字defparam
module example(A,Y); …… parameter size=8,delay=15; …… endmodule
module test; …… example t1(a1,y1); example t2(a2,y2); …… endmodule
>>:逻辑右移。 <<:逻辑左移。 >>>:算术右移。 <<<:算术左移。
例如
a=4'b0101 b=x>>1; b为0010 c为0100 c=x<<2; integer a; a= -10; c值为-2 c=a>>>3;
verilog hdl教材
verilog hdl教材
Verilog HDL教材有很多,以下是一些推荐:
《EDA技术实用教程:Verilog/HDL版(第6版)》,潘松、黄继业著,大中专教材教辅/书籍/大学教材。
《Verilog HDL与CPLD/FPGA项目开发教程第3版》,对ASIC/FPGA
系统芯片工程设计开发的关键技术与流程进行了深入讲解,内容包括:集成电路芯片系统的建模,电路结构权衡、流水线技术、多核微处理器、功能验证、时序分析、测试平台、故障模拟、可测性设计、逻辑综合、后综合验证等集成电路系统的前后端工程设计与实现中的关键技术及设计案例。
此外,HDL Bits和牛客网也有相关课程推荐,HDL Bits上面从最基础的wire,vector等基础概念,到各种门电路,组合电路,时序电路应有尽有,非常全面!同时还有在线仿真的功能。
以上推荐仅供参考,建议根据自身需求选择合适的教材。
verilogHDL(王金明版源码)
王金明:《Verilog HDL 程序设计教程》- 1 -【例3.1】4 位全加器module adder4(cout,sum,ina,inb,cin);output[3:0] sum;output cout;input[3:0] ina,inb;input cin;assign {cout,sum}=ina+inb+cin;endmodule【例3.2】4 位计数器module count4(out,reset,clk);output[3:0] out;input reset,clk;reg[3:0] out;always @(posedge clk)beginif (reset) out<=0; //同步复位else out<=out+1; //计数endendmodule【例3.3】4 位全加器的仿真程序`timescale 1ns/1ns`include "adder4.v"module adder_tp; //测试模块的名字reg[3:0] a,b; //测试输入信号定义为reg 型reg cin;wire[3:0] sum; //测试输出信号定义为wire 型wire cout;integer i,j;adder4 adder(sum,cout,a,b,cin); //调用测试对象always #5 cin=~cin; //设定cin 的取值initialbegina=0;b=0;cin=0;for(i=1;i<16;i=i+1)#10 a=i; //设定a 的取值Endinitialbeginfor(j=1;j<16;j=j+1)#10 b=j; //设定b 的取值Endinitial //定义结果显示格式begin$monitor($time,,,"%d + %d + %b={%b,%d}",a,b,cin,cout,sum);#160 $finish;endendmodule【例3.4】4 位计数器的仿真程序`timescale 1ns/1ns`include "count4.v"module coun4_tp;reg clk,reset; //测试输入信号定义为reg 型wire[3:0] out; //测试输出信号定义为wire 型parameter DELY=100;count4 mycount(out,reset,clk); //调用测试对象always #(DELY/2) clk = ~clk; //产生时钟波形initialbegin //激励信号定义clk =0; reset=0;#DELY reset=1;#DELY reset=0;#(DELY*20) $finish;end//定义结果显示格式initial $monitor($time,,,"clk=%d reset=%d out=%d", clk, reset,out);endmodule【例3.5】“与-或-非”门电路module AOI(A,B,C,D,F); //模块名为AOI(端口列表A,B,C,D,F) input A,B,C,D; //模块的输入端口为A,B,C,Doutput F; //模块的输出端口为Fwire A,B,C,D,F; //定义信号的数据类型assign F= ~((A&B)|(C&D)); //逻辑功能描述endmodule【例5.1】用case 语句描述的4 选1 数据选择器module mux4_1(out,in0,in1,in2,in3,sel);output out;input in0,in1,in2,in3;input[1:0] sel;reg out;always @(in0 or in1 or in2 or in3 or sel) //敏感信号列表case(sel)2'b00: out=in0;2'b01: out=in1;2'b10: out=in2;2'b11: out=in3;default: out=2'bx;endcaseendmodule【例5.2】同步置数、同步清零的计数器module count(out,data,load,reset,clk);output[7:0] out;input[7:0] data;input load,clk,reset;reg[7:0] out;always @(posedge clk) //clk 上升沿触发beginif (!reset) out = 8'h00; //同步清0,低电平有效else if (load) out = data; //同步预置else out = out + 1; //计数endendmodule【例5.3】用always 过程语句描述的简单算术逻辑单元`define add 3'd0`define minus 3'd1`define band 3'd2`define bor 3'd3`define bnot 3'd4module alu(out,opcode,a,b);output[7:0] out;reg[7:0] out;input[2:0] opcode; //操作码input[7:0] a,b; //操作数always@(opcode or a or b) //电平敏感的always 块begincase(opcode)`add: out = a+b; //加操作`minus: out = a-b; //减操作`band: out = a&b; //求与`bor: out = a|b; //求或`bnot: out=~a; //求反default: out=8'hx; //未收到指令时,输出任意态endcaseendendmodule`timescale 1ns/1ns`include "alu.v"module alu_tb;wire [7:0] out;reg [7:0] a,b;reg [2:0] opcode;initialbegina = 8'h12;b = 8'h34;opcode = `add;#10 opcode = `minus;#10 opcode = `band;#10 opcode = `bor;#10 opcode = `bnot;endalu alu(.out(out),.a(a),.b(b),.opcode(opcode)); endmodule【例5.4】用initial 过程语句对测试变量A、B、C 赋值`timescale 1ns/1nsmodule test;reg A,B,C;initialbeginA = 0;B = 1;C = 0;#50 A = 1; B = 0;#50 A = 0; C = 1;#50 B = 1;#50 B = 0; C = 0;#50 $finish ;endendmodule【例5.5】用begin-end 串行块产生信号波形`timescale 10ns/1nsmodule wave1;reg wave;parameter cycle=10;initialbeginwave=0;#(cycle/2) wave=1;#(cycle/2) wave=0;#(cycle/2) wave=1;#(cycle/2) wave=0;#(cycle/2) wave=1;#(cycle/2) $finish ;endinitial $monitor($time,,,"wave=%b",wave); endmodule【例5.6】用fork-join 并行块产生信号波形`timescale 10ns/1nsmodule wave2;reg wave;parameter cycle=5;initialforkwave=0;#(cycle) wave=1;#(2*cycle) wave=0;#(3*cycle) wave=1;#(4*cycle) wave=0;#(5*cycle) wave=1;#(6*cycle) $finish;joininitial $monitor($time,,,"wave=%b",wave); endmodule【例5.7】持续赋值方式定义的2 选1 多路选择器module MUX21_1(out,a,b,sel);input a,b,sel;output out;assign out=(sel==0)?a:b;//持续赋值,如果sel 为0,则out=a ;否则out=b Endmodule【例5.8】阻塞赋值方式定义的2 选1 多路选择器module MUX21_2(out,a,b,sel);input a,b,sel;output out;reg out;always@(a or b or sel)beginif(sel==0) out=a; //阻塞赋值else out=b;endendmodule【例5.9】非阻塞赋值module non_block(c,b,a,clk);output c,b;input clk,a;reg c,b;always @(posedge clk)beginb<=a;c<=b;endendmodule【例5.10】阻塞赋值module block(c,b,a,clk);output c,b;input clk,a;reg c,b;always @(posedge clk)beginb=a;c=b;endendmodule`timescale 1ns/1ns`include "block.v"module block_tb;wire c,b;reg clk,a;initialbeginclk = 0;a = 0;#30 a = 1;#30 a = 0;#30 a = 1;#30 $stop;endalways #10 clk = ~clk;block block(.c(c),.b(b),.clk(clk),.a(a));endmodule【例5.11】模为60 的BCD 码加法计数器module count60(qout,cout,data,load,cin,reset,clk); output[7:0] qout;output cout;input[7:0] data;input load,cin,clk,reset;reg[7:0] qout;always @(posedge clk) //clk 上升沿时刻计数beginif (reset) qout<=0; //同步复位else if(load) qout<=data; //同步置数else if(cin)beginif(qout[3:0]==9) //低位是否为9,是则beginqout[3:0]<=0; //回0,并判断高位是否为5if (qout[7:4]==5) qout[7:4]<=0;elseqout[7:4]<=qout[7:4]+1; //高位不为5,则加1endelse //低位不为9,则加1qout[3:0]<=qout[3:0]+1;endendassign cout=((qout==8'h59)&cin)?1:0; //产生进位输出信号endmodule`timescale 1ns/1ns`include "count60.v"module count60_tb;wire [7:0] qout;wire cout;reg [7:0] data;reg load,cin,clk,reset;always #5 clk = ~clk;count60cnt(.qout(qout),.cout(cout),.data(data),.load(load),.cin(cin),.cl k(clk),.reset(reset));initialbeginclk = 0;reset = 1;load = 1; cin = 0; data = 8'h25;#20 reset = 0;#20 load = 0;#30 cin = 1;#100 load = 1;#30 load = 0;#300 cin = 0;#50 cin = 1;#500 $stop;endendmodule【例5.12】BCD 码—七段数码管显示译码器module decode4_7(decodeout,indec);output[6:0] decodeout;input[3:0] indec;reg[6:0] decodeout;always @(indec)begincase(indec) //用case 语句进行译码4'd0:decodeout=7'b1111110;4'd1:decodeout=7'b0110000;4'd2:decodeout=7'b1101101;4'd3:decodeout=7'b1111001;4'd4:decodeout=7'b0110011;4'd5:decodeout=7'b1011011;4'd6:decodeout=7'b1011111;4'd7:decodeout=7'b1110000;4'd8:decodeout=7'b1111111;4'd9:decodeout=7'b1111011;default: decodeout=7'bx;endcaseendendmodule【例5.13】用casez 描述的数据选择器module mux_casez(out,a,b,c,d,select); output out;input a,b,c,d;input[3:0] select;reg out;always @(select or a or b or c or d) begincasez(select)4'b1: out = a;4'b??1?: out = b;4'b?1??: out = c;4'b1: out = d;endcaseendendmodule【例5.14】隐含锁存器举例module buried_ff(c,b,a);output c;input b,a;reg c;always @(a or b)beginif((b==1)&&(a==1)) c=a&b;endendmodule【例5.15】用for 语句描述的七人投票表决器module voter7(pass,vote);output pass;input[6:0] vote;reg[2:0] sum;integer i;reg pass;always @(vote)beginsum=0;- 9 -for(i=0;i<=6;i=i+1) //for 语句if(vote[i]) sum=sum+1;if(sum[2]) pass=1; //若超过4 人赞成,则pass=1else pass=0;endendmodule【例5.16】用for 语句实现2 个8 位数相乘module mult_for(outcome,a,b);parameter size=8;input[size:1] a,b; //两个操作数output[2*size:1] outcome; //结果reg[2*size:1] outcome;integer i;always @(a or b)beginoutcome=0;for(i=1; i<=size; i=i+1) //for 语句if(b[i]) outcome=outcome +(a << (i-1));endendmodule【例5.17】用repeat 实现8 位二进制数的乘法module mult_repeat(outcome,a,b);parameter size=8;input[size:1] a,b;output[2*size:1] outcome;reg[2*size:1] temp_a,outcome;reg[size:1] temp_b;always @(a or b)beginoutcome=0;temp_a=a;temp_b=b;repeat(size) //repeat 语句,size 为循环次数beginif(temp_b[1]) //如果temp_b 的最低位为1,就执行下面的加法outcome=outcome+temp_a;temp_a=temp_a<<1; //操作数a 左移一位程序文本- 10 -temp_b=temp_b>>1; //操作数b 右移一位endendendmodule`include "mult_repeat.v"module mult_repeat_tb;parameter size = 8;reg [size:1] a,b;wire [2*size:1] outcome;initialbegina = 8'h25;b = 8'h16;#10 a = 8'ha4; b = 8'h20;endmult_repeat mult(.a(a),.b(b),.outcome(outcome)); endmodule【例5.18】同一循环的不同实现方式module loop1; //方式1integer i;initialfor(i=0;i<4;i=i+1) //for 语句begin$display(“i=%h”,i);endendmodulemodule loop2; //方式2integer i;initial begini=0;while(i<4) //while 语句begin$display ("i=%h",i);i=i+1;endendendmodulemodule loop3; //方式3integer i;initial begini=0;repeat(4) //repeat 语句begin$display ("i=%h",i);i=i+1;endendendmodule【例5.19】使用了`include 语句的16 位加法器- 11 -`include "adder.v"module adder16(cout,sum,a,b,cin);output cout;parameter my_size=16;output[my_size-1:0] sum;input[my_size-1:0] a,b;input cin;adder my_adder(cout,sum,a,b,cin); //调用adder 模块endmodule//下面是adder 模块代码module adder(cout,sum,a,b,cin);parameter size=16;output cout;output[size-1:0] sum;input cin;input[size-1:0] a,b;assign {cout,sum}=a+b+cin;endmodule【例5.20】条件编译举例module compile(out,A,B);output out;input A,B;`ifdef add //宏名为addassign out=A+B;`elseassign out=A-B;`endifEndmodule【例6.1】加法计数器中的进程module count(data,clk,reset,load,cout,qout);output cout;output[3:0] qout;reg[3:0] qout;input[3:0] data;input clk,reset,load;程序文本- 12 -always @(posedge clk) //进程1,always 过程块beginif (!reset) qout= 4'h00; //同步清0,低电平有效else if (load) qout= data; //同步预置else qout=qout + 1; //加法计数endassign cout=(qout==4'hf)?1:0; //进程2,用持续赋值产生进位信号endmodule【例6.2】任务举例module alutask(code,a,b,c);input[1:0] code;input[3:0] a,b;output[4:0] c;reg[4:0] c;task my_and; //任务定义,注意无端口列表input[3:0] a,b; //a,b,out 名称的作用域范围为task 任务内部output[4:0] out;integer i;beginfor(i=3;i>=0;i=i-1)out[i]=a[i]&b[i]; //按位与endendtaskalways@(code or a or b)begincase(code)2'b00: my_and(a,b,c);/* 调用任务my_and,需注意端口列表的顺序应与任务定义中的一致,这里的a,b,c 分别对应任务定义中的a,b,out */2'b01: c=a|b; //或2'b10: c=a-b; //相减2'b11: c=a+b; //相加endcaseendendmodule- 13 -【例6.3】测试程序`include "alutask.v"module alu_tp;reg[3:0] a,b;reg[1:0] code;wire[4:0] c;parameter DELY = 100;alutask ADD(code,a,b,c); //调用被测试模块initial begincode=4'd0; a= 4'b0000; b= 4'b1111;#DELY code=4'd0; a= 4'b0111; b= 4'b1101;#DELY code=4'd1; a= 4'b0001; b= 4'b0011;#DELY code=4'd2; a= 4'b1001; b= 4'b0011;#DELY code=4'd3; a= 4'b0011; b= 4'b0001;#DELY code=4'd3; a= 4'b0111; b= 4'b1001;#DELY $finish;endinitial $monitor($time,,,"code=%b a=%b b=%b c=%b", code,a,b,c); endmodule【例6.4】函数function[7:0] get0;input[7:0] x;reg[7:0] count;integer i;begincount=0;for (i=0;i<=7;i=i+1)if (x[i]=1'b0) count=count+1;get0=count;endendfunction【例6.5】用函数和case 语句描述的编码器(不含优先顺序)module code_83(din,dout);input[7:0] din;output[2:0] dout;程序文本- 14 -function[2:0] code; //函数定义input[7:0] din; //函数只有输入,输出为函数名本身casex (din)8'b1xxx_xxxx : code = 3'h7;8'b01xx_xxxx : code = 3'h6;8'b001x_xxxx : code = 3'h5;8'b0001_xxxx : code = 3'h4;8'b0000_1xxx : code = 3'h3;8'b0000_01xx : code = 3'h2;8'b0000_001x : code = 3'h1;8'b0000_000x : code = 3'h0;default: code = 3'hx;endcaseendfunctionassign dout = code(din) ; //函数调用endmodule【例6.6】阶乘运算函数module funct(clk,n,result,reset);output[31:0] result;input[3:0] n;input reset,clk;reg[31:0] result;always @(posedge clk) //在clk 的上升沿时执行运算beginif(!reset) result<=0; //复位else beginresult <= 2 * factorial(n); //调用factorial 函数endendfunction[31:0] factorial; //阶乘运算函数定义(注意无端口列表)input[3:0] opa; //函数只能定义输入端,输出端口为函数名本身reg[3:0] i;beginfactorial = opa ? 1 : 0;for(i= 2; i <= opa; i = i+1) //该句若要综合通过,opa 应赋具体的数值factorial = i* factorial; //阶乘运算end- 15 -endfunctionendmodule【例6.7】测试程序`define clk_cycle 50`include "funct.v"module funct_tp;reg[3:0] n;reg reset,clk;wire[31:0] result;initial //定义激励向量beginn=0; reset=1; clk=0;for(n=0;n<=15;n=n+1)#100 n=n;endinitial $monitor($time,,,"n=%d result=%d",n,result);//定义输出显示格式always #1 `clk_cycle clk=~clk; //产生时钟信号funct funct_try(.clk(clk),.n(n),.result(result),.reset(reset)); //调用被测试模块Endmodule【例6.8】顺序执行模块1module serial1(q,a,clk);output q,a;input clk;reg q,a;always @(posedge clk)beginq=~q;a=~q;endendmodule【例6.9】顺序执行模块2module serial2(q,a,clk);output q,a;程序文本- 16 -input clk;reg q,a;always @(posedge clk)begina=~q;q=~q;endendmodule【例6.10】并行执行模块1module paral1(q,a,clk);output q,a;input clk;reg q,a;always @(posedge clk)beginq=~q;endalways @(posedge clk)begina=~q;endendmodule【例6.11】并行执行模块2module paral2(q,a,clk);output q,a;input clk;reg q,a;always @(posedge clk)begina=~q;endalways @(posedge clk)beginq=~q;endendmodule【例7.1】调用门元件实现的4 选1 MUX- 17 -module mux4_1a(out,in1,in2,in3,in4,cntrl1,cntrl2); output out;input in1,in2,in3,in4,cntrl1,cntrl2;wire notcntrl1,notcntrl2,w,x,y,z;not (notcntrl1,cntrl2),(notcntrl2,cntrl2);and (w,in1,notcntrl1,notcntrl2),(x,in2,notcntrl1,cntrl2),(y,in3,cntrl1,notcntrl2),(z,in4,cntrl1,cntrl2);or (out,w,x,y,z);endmodule【例7.2】用case 语句描述的4 选1 MUXmodule mux4_1b(out,in1,in2,in3,in4,cntrl1,cntrl2);output out;input in1,in2,in3,in4,cntrl1,cntrl2;reg out;always@(in1 or in2 or in3 or in4 or cntrl1 or cntrl2)case({cntrl1,cntrl2})2'b00:out=in1;2'b01:out=in2;2'b10:out=in3;2'b11:out=in4;default:out=2'bx;endcaseendmodule【例7.3】行为描述方式实现的4 位计数器module count4(clk,clr,out);input clk,clr;output[3:0] out;reg[3:0] out;always @(posedge clk or posedge clr)beginif (clr) out<=0;else out<=out+1;endendmodule程序文本- 18 -【例7.4】数据流方式描述的4 选1 MUXmodule mux4_1c(out,in1,in2,in3,in4,cntrl1,cntrl2);output out;input in1,in2,in3,in4,cntrl1,cntrl2;assign out=(in1 & ~cntrl1 & ~cntrl2)|(in2 & ~cntrl1 & cntrl2)| (in3 & cntrl1 & ~cntrl2)|(in4 & cntrl1 & cntrl2);Endmodule【例7.5】用条件运算符描述的4 选1 MUXmodule mux4_1d(out,in1,in2,in3,in4,cntrl1,cntrl2);output out;input in1,in2,in3,in4,cntrl1,cntrl2;assign out=cntrl1 ? (cntrl2 ? in4:in3):(cntrl2 ? in2:in1); endmodule【例7.6】门级结构描述的2 选1MUXmodule mux2_1a(out,a,b,sel);output out;input a,b,sel;not (sel_,sel);and (a1,a,sel_),(a2,b,sel);or (out,a1,a2);endmodule【例7.7】行为描述的2 选1MUXmodule mux2_1b(out,a,b,sel); output out;input a,b,sel;reg out;always @(a or b or sel)beginif(sel) out = b;else out = a;endendmodule【例7.8】数据流描述的2 选1MUX module MUX2_1c(out,a,b,sel); output out;- 19 -input a,b,sel;assign out = sel ? b : a; endmodule【例7.9】调用门元件实现的1 位半加器module half_add1(a,b,sum,cout); input a,b;output sum,cout;and (cout,a,b);xor (sum,a,b);endmodule【例7.10】数据流方式描述的1 位半加器module half_add2(a,b,sum,cout); input a,b;output sum,cout;assign sum=a^b;assign cout=a&b;endmodule【例7.11】采用行为描述的1 位半加器module half_add3(a,b,sum,cout); input a,b;output sum,cout;reg sum,cout;always @(a or b)begincase ({a,b}) //真值表描述2'b00: begin sum=0; cout=0; end2'b01: begin sum=1; cout=0; end2'b10: begin sum=1; cout=0; end2'b11: begin sum=0; cout=1; end endcaseendendmodule【例7.12】采用行为描述的1 位半加器module half_add4(a,b,sum,cout); input a,b;output sum,cout;程序文本- 20 -reg sum,cout;always @(a or b)beginsum= a^b;cout=a&b;endendmodule【例7.13】调用门元件实现的1 位全加器module full_add1(a,b,cin,sum,cout); input a,b,cin;output sum,cout;wire s1,m1,m2,m3;and (m1,a,b),(m2,b,cin),(m3,a,cin);xor (s1,a,b),(sum,s1,cin);or (cout,m1,m2,m3);endmodule【例7.14】数据流描述的1 位全加器module full_add2(a,b,cin,sum,cout);input a,b,cin;output sum,cout;assign sum = a ^ b ^ cin;assign cout = (a & b)|(b & cin)|(cin & a);endmodule【例7.15】1 位全加器module full_add3(a,b,cin,sum,cout);input a,b,cin;output sum,cout;assign {cout,sum}=a+b+cin;endmodule【例7.16】行为描述的1 位全加器module full_add4(a,b,cin,sum,cout);input a,b,cin;output sum,cout;- 21 -reg sum,cout; //在always 块中被赋值的变量应定义为reg 型reg m1,m2,m3;always @(a or b or cin)beginsum = (a ^ b) ^ cin;m1 = a & b;m2 = b & cin;m3 = a & cin;cout = (m1|m2)|m3;endendmodule【例7.17】混合描述的1 位全加器module full_add5(a,b,cin,sum,cout);input a,b,cin;output sum,cout;reg cout,m1,m2,m3; //在always 块中被赋值的变量应定义为reg 型wire s1;xor x1(s1,a,b); //调用门元件always @(a or b or cin) //always 块语句beginm1 = a & b;m2 = b & cin;m3 = a & cin;cout = (m1| m2) | m3;endassign sum = s1 ^ cin; //assign 持续赋值语句endmodule【例7.18】结构描述的4 位级连全加器`include "full_add1.v"module add4_1(sum,cout,a,b,cin);output[3:0] sum;output cout;input[3:0] a,b;input cin;full_add1 f0(a[0],b[0],cin,sum[0],cin1); //级连描述full_add1 f1(a[1],b[1],cin1,sum[1],cin2);full_add1 f2(a[2],b[2],cin2,sum[2],cin3);程序文本- 22 -full_add1 f3(a[3],b[3],cin3,sum[3],cout); endmodule【例7.19】数据流描述的4 位全加器module add4_2(cout,sum,a,b,cin);output[3:0] sum;output cout;input[3:0] a,b;input cin;assign {cout,sum}=a+b+cin;endmodule【例7.20】行为描述的4 位全加器module add4_3(cout,sum,a,b,cin);output[3:0] sum;output cout;input[3:0] a,b;input cin;reg[3:0] sum;reg cout;always @(a or b or cin)begin{cout,sum}=a+b+cin;endendmodule【例8.1】$time 与$realtime 的区别`timescale 10ns/1nsmodule time_dif;reg ts;parameter delay=2.6;initialbegin#delay ts=1;#delay ts=0;#delay ts=1;#delay ts=0;endinitial $monitor($time,,,"ts=%b",ts); //使用函数$time- 23 -Endmodule【例8.2】$random 函数的使用`timescale 10ns/1nsmodule random_tp;integer data;integer i;parameter delay=10;initial $monitor($time,,,"data=%b",data);initial beginfor(i=0; i<=100; i=i+1)#delay data=$random; //每次产生一个随机数endendmodule【例8.3】1 位全加器进位输出UDP 元件primitive carry_udp(cout,cin,a,b);input cin,a,b;output cout;table//cin a b : cout //真值表0 0 0 : 0;0 1 0 : 0;0 0 1 : 0;0 1 1 : 1;1 0 0 : 0;1 0 1 : 1;1 1 0 : 1;1 1 1 : 1;endtableendprimitive【例8.4】包含x 态输入的1 位全加器进位输出UDP 元件primitive carry_udpx1(cout,cin,a,b);input cin,a,b;output cout;table// cin a b : cout //真值表0 0 0 : 0;程序文本- 24 -0 1 0 : 0;0 0 1 : 0;0 1 1 : 1;1 0 0 : 0;1 0 1 : 1;1 1 0 : 1;1 1 1 : 1;0 0 x : 0; //只要有两个输入为0,则进位输出肯定为00 x 0 : 0;x 0 0 : 0;1 1 x : 1; //只要有两个输入为1,则进位输出肯定为11 x 1 : 1;x 1 1 : 1;endtableendprimitive【例8.5】用简缩符“?”表述的1 位全加器进位输出UDP 元件primitive carry_udpx2(cout,cin,a,b);input cin,a,b;output cout;// cin a b : cout //真值表0 0 : 0; //只要有两个输入为0,则进位输出肯定为00 ? 0 : 0;0 0 ? : 0;1 1 : 1; //只要有两个输入为1,则进位输出肯定为11 ? 1 : 1;1 1 ? : 1;endtableendprimitive【例8.6】3 选1 多路选择器UDP 元件primitive mux31(Y,in0,in1,in2,s2,s1);input in0,in1,in2,s2,s1;output Y;table//in0 in1 in2 s2 s1 : Y0 ? ? 0 0 : 0; //当s2s1=00 时,Y=in01 ? ? 0 0 : 1;0 0 1 : 0; //当s2s1=01 时,Y=in1- 25 -1 0 1 : 1;0 1 : 0; //当s2s1=1?时,Y=in21 1 : 1;0 0 ? 0 ? : 0;1 1 ? 0 ? : 1;0 ? 0 ? 0 : 0;1 ? 1 ? 0 : 1;0 0 1 : 0;1 1 1 : 1;endtableendprimitive【例8.7】电平敏感的1 位数据锁存器UDP 元件primitive latch(Q,clk,reset,D);input clk,reset,D;output Q;initial Q = 1'b1; //初始化table// clk reset D : state : Q1 : : 0 ; //reset=1,则不管其他端口为什么值,输出都为0 0 0 0 : ? : 0 ; //clk=0,锁存器把D 端的输入值输出0 0 1 : ? : 1 ;1 0 ? : ? : - ; //clk=1,锁存器的输出保持原值,用符号“-”表示endtableendprimitive【例8.8】上升沿触发的D 触__________发器UDP 元件primitive DFF(Q,D,clk);output Q;input D,clk;reg Q;table//clk D : state : Q(01) 0 : ? : 0; //上升沿到来,输出Q=D(01) 1 : ? : 1;(0x) 1 : 1 : 1;(0x) 0 : 0 : 0;(?0) ? : ? : -; //没有上升沿到来,输出Q 保持原值() : : - ; //时钟不变,输出也不变程序文本- 26 -endtableendprimitive【例8.9】带异步置1 和异步清零的上升沿触发的D 触发器UDP 元件primitive DFF_UDP(Q,D,clk,clr,set);output Q;input D,clk,clr,set;reg Q;table// clk D clr set : state : Q(01) 1 0 0 : ? : 0;(01) 1 0 x : ? : 0;0 x : 0 : 0;(01) 0 0 0 : ? : 1;(01) 0 x 0 : ? : 1;x 0 : 1 : 1;(x1) 1 0 0 : 0 : 0;(x1) 0 0 0 : 1 : 1;(0x) 1 0 0 : 0 : 0;(0x) 0 0 0 : 1 : 1;1 : : 1; //异步复位 0 1 : : 0; //异步置1n ? 0 0 : ? : -;* : : -;(0) : : -;(0): : -;: : x;endtableendprimitive【例8.12】延迟定义块举例module delay(out,a,b,c); output out;input a,b,c;and a1(n1,a,b);or o1(out,c,n1);specify(a=>out)=2;(b=>out)=3;(c=>out)=1;- 27 -endspecifyendmodule【例8.13】激励波形的描述'timescale 1ns/1nsmodule test1;reg A,B,C;initialbegin //激励波形描述A = 0;B = 1;C = 0;#100 C = 1;#100 A = 1; B = 0;#100 A = 0;#100 C = 0;#100 $finish;endinitial $monitor($time,,,"A=%d B=%d C=%d",A,B,C); //显示endmodule【例8.15】用always 过程块产生两个时钟信号module test2;reg clk1,clk2;parameter CYCLE = 100;alwaysbegin{clk1,clk2} = 2'b10;#(CYCLE/4) {clk1,clk2} = 2'b01;#(CYCLE/4) {clk1,clk2} = 2'b11;#(CYCLE/4) {clk1,clk2} = 2'b00;#(CYCLE/4) {clk1,clk2} = 2'b10;endinitial $monitor($time,,,"clk1=%b clk2=%b",clk1,clk2); endmodule【例8.17】存储器在仿真程序中的应用module ROM(addr,data,oe);output[7:0] data; //数据信号input[14:0] addr; //地址信号input oe; //读使能信号,低电平有效程序文本- 28 -reg[7:0] mem[0:255]; //存储器定义parameter DELAY = 100;assign #DELAY data=(oe==0) ? mem[addr] : 8'hzz;initial $readmemh("rom.hex",mem); //从文件中读入数据endmodule【例8.18】8 位乘法器的仿真程序`timescale 10ns/1nsmodule mult8_tp; //测试模块的名字reg[7:0] a,b; //测试输入信号定义为reg 型wire [15:0] out; //测试输出信号定义为wire 型integer i,j;mult8 m1(out,a,b); //调用测试对象//激励波形设定initialbegina=0;b=0;for(i=1;i<255;i=i+1)#10 a=i;endinitialbeginfor(j=1;j<255;j=j+1)#10 b=j;endinitial //定义结果显示格式begin$monitor($time,,,"%d * %d= %d",a,b,out); #2560 $finish;endendmodulemodule mult8(out, a, b); //8 位乘法器源代码parameter size=8;input[size:1] a,b; //两个操作数output[2*size:1] out; //结果assign out=a*b; //乘法运算符- 29 -Endmodule【例8.19】8 位加法器的仿真程序`timescale 1ns/1nsmodule add8_tp; //仿真模块无端口列表reg[7:0] A,B; //输入激励信号定义为reg 型reg cin;wire[7:0] SUM; //输出信号定义为wire 型wire cout;parameter DELY = 100;add8 AD1(SUM,cout,A,B,cin); //调用测试对象initial begin //激励波形设定A= 8'd0; B= 8'd0; cin=1'b0;#DELY A= 8'd100; B= 8'd200; cin=1'b1;#DELY A= 8'd200; B= 8'd88;#DELY A= 8'd210; B= 8'd18; cin=1'b0;#DELY A= 8'd12; B= 8'd12;#DELY A= 8'd100; B= 8'd154;#DELY A= 8'd255; B= 8'd255; cin=1'b1;#DELY $finish;end//输出格式定义initial $monitor($time,,,"%d + %d + %b = {%b, %d}",A,B,cin,cout,SUM); endmodulemodule add8(SUM,cout,A,B,cin); //待测试的8 位加法器模块output[7:0] SUM;output cout;input[7:0] A,B;input cin;assign {cout,SUM}=A+B+cin;endmodule【例8.20】2 选1 多路选择器的仿真`timescale 1ns/1nsmodule mux_tp;reg a,b,sel;wire out;程序文本- 30 -MUX2_1 m1(out,a,b,sel); //调用待测试模块initialbegina=1'b0; b=1'b0; sel=1'b0;#5 sel=1'b1;#5 a=1'b1; sel=1'b0;#5 sel=1'b1;#5 a=1'b0; b=1'b1; sel=1'b0;#5 sel=1'b1;#5 a=1'b1; b=1'b1; sel=1'b0;#5 sel=1'b1;endinitial $monitor($time,,,"a=%b b=%b sel=%b out=%b",a,b,sel,out); endmodulemodule MUX2_1(out,a,b,sel); //待测试的2 选1MUX 模块input a,b,sel;output out;not #(0.4,0.3) (sel_,sel); //#(0.4,0.3)为门延时and #(0.7,0.6) (a1,a,sel_);and #(0.7,0.6) (a2,b,sel);or #(0.7,0.6) (out,a1,a2);endmodule【例8.21】8 位计数器的仿真`timescale 10ns/1nsmodule counter8_tp;reg clk,reset; //输入激励信号定义为reg 型wire[7:0] qout; //输出信号定义为wire 型parameter DELY=100;counter8 C1(qout,reset,clk); //调用测试对象always #(DELY/2) clk = ~clk; //产生时钟波形initialbegin //激励波形定义clk =0; reset=0;- 31 -#DELY reset=1;#DELY reset=0;#(DELY*300) $finish;end//结果显示initial $monitor($time,,,"clk=%d reset=%d qout=%d",clk,reset,qout); endmodulemodule counter8(qout,reset,clk); //待测试的8 位计数器模块output[7:0] qout;input clk,reset;reg[7:0] qout;always @(posedge clk)begin if (reset) qout<=0;else qout<=qout+1;endendmodule【例9.1】基本门电路的几种描述方法(1)门级结构描述module gate1(F,A,B,C,D);input A,B,C,D;output F;nand(F1,A,B); //调用门元件and(F2,B,C,D);or(F,F1,F2);endmodule(2)数据流描述module gate2(F,A,B,C,D);input A,B,C,D;output F;assign F=(A&B)|(B&C&D); //assign 持续赋值endmodule(3)行为描述module gate3(F,A,B,C,D);input A,B,C,D;output F;程序文本- 32 -reg F;always @(A or B or C or D) //过程赋值beginF=(A&B)|(B&C&D);endendmodule【例9.2】用bufif1 关键字描述的三态门module tri_1(in,en,out);input in,en;output out;tri out;bufif1 b1(out,in,en); //注意三态门端口的排列顺序endmodule【例9.3】用assign 语句描述的三态门module tri_2(out,in,en);output out;input in,en;assign out = en ? in : 'bz;//若en=1,则out=in;若en=0,则out 为高阻态Endmodule【例9.4】三态双向驱动器module bidir(tri_inout,out,in,en,b);inout tri_inout;output out;input in,en,b;assign tri_inout = en ? in : 'bz;assign out = tri_inout ^ b;endmodule【例9.5】三态双向驱动器module bidir2(bidir,en,clk);inout[7:0] bidir;input en,clk;reg[7:0] temp;assign bidir= en ? temp : 8'bz;always @(posedge clk)begin- 33 -if(en) temp=bidir;else temp=temp+1;endendmodule【例9.6】3-8 译码器module decoder_38(out,in);output[7:0] out;input[2:0] in;reg[7:0] out;always @(in)begincase(in)3'd0: out=8'b11111110;3'd1: out=8'b11111101;3'd2: out=8'b11111011;3'd3: out=8'b11110111;3'd4: out=8'b11101111;3'd5: out=8'b11011111;3'd6: out=8'b10111111;3'd7: out=8'b01111111;endcaseendendmodule【例9.7】8-3 优先编码器module encoder8_3(none_on,outcode,a,b,c,d,e,f,g,h); output none_on;output[2:0] outcode;input a,b,c,d,e,f,g,h;reg[3:0] outtemp;assign {none_on,outcode}=outtemp;always @(a or b or c or d or e or f or g or h)beginif(h) outtemp=4'b0111;else if(g) outtemp=4'b0110;else if(f) outtemp=4'b0101;else if(e) outtemp=4'b0100;else if(d) outtemp=4'b0011;。
《数字系统设计与Verilog HDL》教学大纲
《数字系统设计与Verilog HDL》教学大纲课程中文名称: 数字系统设计与Verilog HDL 课程英文名称: Digital system design with Verilog HDL课程代码: 学时/实践或实验/学分:40/8/2.5课程类别: 课程性质: 选修课适用专业:执笔人: 审定人:审批人:一、教学目标教学目标是使学生了解掌握EDA技术的基础知识、可编程逻辑器件的基本结构、硬件描述语言的语法、编程方法以及相关开发软件的使用方法。
重点掌握:PLD器件的结构和开发流程、开发软件的使用方法、Verilog HDL语言的基本语法和利用Verilog HDL语言建模、仿真和综合的设计复杂数字逻辑电路与系统设计的方法和技术。
目标1:了解EDA技术的发展概况,掌握EDA技术的基本概念及相关的基础知识,掌握数字系统设计的设计方法和流程。
了解可编程逻辑器件的分类,掌握可编程逻辑器件的基本结构掌握,掌握CPLD及FPGA器件的基本结构掌握。
目标2:掌握Verilog HDL的语言要素、各种语句以及设计方法等基础知识;掌握Verilog HDL 模块和测试模块的基本结构,能够利用Verilog HDL语言对数字电路进行建模。
目标3:掌握Verilog HDL的三种描述方式;掌握层次设计的方法以及一些设计技巧;并掌握利用有限状态机对数字电路进行建模的方式。
目标4:掌握开发软件及仿真软件的使用流程及方法,能够对设计文件进行仿真验证。
二、课程教学目标与毕业要求关系矩阵注:用☆☆☆、☆☆、☆分别表示教学目标对毕业要求的贡献度为强、中、弱。
三、教学内容和学时分配(32学时)《数字系统设计与Verilog HDL》在理论教学方面侧重于PLD基本原理、Verilog HDL语法要素和行为语句、Verilog HDL阻塞与非阻塞赋值、Verilog HDL有限状态机设计和数字电路设计。
实验教学方面侧重于利用现代 EDA设计流程、软件仿真应用、仿真测试程序设计、层次设计。
VerilogHDL数字设计与综合(第二版)第三章课后习题答案
VerilogHDL数字设计与综合(第二版)第三章课后习题答案1.试写出以下数字:a.将十进制数123用8位二进制数表示出来,使用“_”增加可读性;b.未知的16位十六进制数,各位均为x;c.将十进制数 2使用4位二进制数表示出来,并写出结果的2的补码形式;d.一个无位宽说明的十六进制数1234。
答:a. 8’b0111_1011b. 16’hxc. -4’b0010,补码4’b1110d. ’h12342.下面的各个字符串是否合法?如果非法,请写出正确答案。
a.“This is a string displaying the % sign”b.“out =in1 +in2 ”c.“Please ring a bell \007”d.“This is a backslash \character\n”答:a是错误的,应改为“This is a string displaying the % %sign”,编译后输出:# This is a string displaying the % sign(注意,输出结果前#符号是仿真器输出每行前自带的标志符,在本习题解答中不予去除,下同)b# out =in1 +in2c# Please ring a belld# This is a backslash character#应改为双斜线\\,如“This is a backslash \\character\n”(主要考察的是特殊字符的输出,比如a中的输出%需要%%操作。
C中的\007在编译器中输出为空,复制到word中输出是一个,有兴趣的同学可以自己试验一下,比如\006输出是,\004输出是,等等。
d中的\character在转义操作符\后跟的单词无语法意义,故在输出character,而\n 表示换行,仿真后的输出也是如此显示的。
)3.下面的各个标识符是否合法?a.system1b.1regc.$latchd.exec$答:a是合法的;b、c不能以1和$开头;d是合法的。
Verilog HDL数字系统设计及实践
读书笔记
中规中矩的verilog书,该有的都有。 个人感觉前面章节都比较好理解,最后一章有点难,适合新手阅读。 新手看它就像活在梦里,初期代码风格似乎有变化,但是之后稳定了,也容易明白了。
目录分析
1.2模块和端口
1.1一个简单的例 子—— 4位全加器
的设计
1.3层次化设计思 想
1.4 Testbench的 概念
9.3 include 9.4 timescale
本章小结
9.5预编译处理实 例
思考与练习
0 1
10.1阻塞 语句与非阻 塞语句
0 2
10.2敏感 变量的不完 备性
0 3
10.3锁存 器的产生与 危害
0 4
10.4组合 逻辑反馈
0 6
10.6优先 级与并行编 码
0 5
10.5 for 循环
10.7多路控制分支 结构
Verilog HDL数字系统设计及实践
读书笔记模板
01 思维导图
03 读书笔记 05 作者介绍
目录
02 内容摘要 04 目录分析 06 精彩摘录
思维导图
关键字分析思维导图
设计
内容
逻辑
层次化
建模
小结
实例
数字
行为
共章 设计
形式
设计
语句
时间
描述
行为
时序
器
内容摘要
本书介绍硬件描述语言Verilog HDL及电路设计方法,共11章,主要内容包括:Verilog HDL层次化设计、 Verilog HDL基本语法、Verilog HDL行为描述、组合逻辑建模、行为级仿真模型建模、各层次Verilog HDL描 述形式与电路建模、任务和函数、编译预处理、Verilog HDL设计与综合中的陷阱、异步设计与同步设计的时序 分析。
贵州大学集成电路工程硕士培养方案-201413
集成电路工程专业学位硕士研究生培养方案(085209)(2014年修订)一、学科简介集成电路工程领域是集成电路设计、制造、测试、封装、材料以及集成电路在网络通信、数字家电、信息安全等方面应用的工程技术领域。
集成电路是电子信息产业的基础,随着集成电路向高密度、高性能方向发展,使得集成电路工程技术成为当今最具渗透性和综合性的工程技术领域之一。
集成电路工程依托贵州大学大数据与信息工程学院电子科学与技术一级学科,培养适应国内、省内集成电路领域发展需求的应用型、复合型高层次工程技术和工程管理人才。
通过培养达到了解本领域的技术现状和发展趋势,掌握本领域的基础理论和解决工程实际问题的先进技术方法与现代技术手段,在集成电路领域的某一方向具有独立从事工程设计、工程实施、工程研究、工程开发、工程管理等能力。
二、培养目标集成电路工程专业硕士侧重于工程应用,主要培养应用型、复合型高层次的工程技术人才和工程管理人才,具体培养目标是:1、热爱祖国,遵纪守法,具有良好的道德品质和创业精神,愿为祖国的经济建设和社会发展服务。
2、掌握集成电路工程领域坚实的基础理论和宽广的专业知识。
掌握解决工程实际问题的先进技术方法和现代技术手段,具有创新意识和独立担负工程技术或管理工作的能力,特别是具有较强的解决工程实际问题的能力。
3、能综合运用现代科技成果,特别是半导体、集成电路技术的最新成果,具有研制开发新产品、新技术、新设备或新工程方法的能力。
4、掌握一门外语,能比较熟练地阅读本学科领域的外文资料,并具有一定的外文写作能力。
5、具有科学严谨和求真务实的学习态度和工作作风,身心健康。
6、具备独立从事科学研究工作的能力,能胜任在科研单位、产业部门或高等院校从事相关方面的研究、科技开发、教学和管理工作。
三、研究方向该研究方向包括:电子材料与器件,集成电路设计,集成电路应用系统,电路系统设计与智能仪器技术,集成电路工艺,集成电路与片上系统设计,电子设计自动化技术及其应用,电子器件及系统检测与可靠性技术。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第3章 Quartus Prime使用指南
3.1 Quartus Prime原理图设计n3.1.1 半加器原理图设计输入
Quartus Prime的主界面
Quartus Prime的主界面
3.1.1 半加器原理图设计输入
输入元件
Quartus Prime的主界面
3.1.1 半加器原理图设计输入
半加器电路图
Quartus Prime的主界面
3.1.1 半加器原理图设计输入
使用New Project Wizard创建工程
Quartus Prime的主界面
3.1.1 半加器原理图设计输入
设置Directory,Name,Top-Level Entity对话框
Quartus Prime的主界面
3.1.1 半加器原理图设计输入
将设计文件加入当前工程中
Quartus Prime的主界面
3.1.1 半加器原理图设计输入
选择目标器件
Quartus Prime的主界面
3.1.1 半加器原理图设计输入
选择综合器、仿真器
Quartus Prime的主界面
3.1.1 半加器原理图设计输入
工程信息汇总显示
Quartus Prime的主界面
3.1.2 1位全加器设计输入
Quartus Prime的主界面创建元件符号对话框
3.1.2 1位全加器设计输入
Quartus Prime的主界面1位全加器原理图
3.1.3 1位全加器的编译
n选择菜单Processing→Start Compilation,或者单击按钮,即启动了完全编译,完全编译包括如下5个过程:
n分析与综合(Analysis & Synthesis);
n适配(Fitter);
n装配(Assembler);
n定时分析(TimeQuest Timing Analysis);
n网表文件提取(EDA Netlist Writer)。
Quartus Prime的主界面
3.1.3 1位全加器的编译
Quartus Prime的主界面
编译信息汇总
3.1.4 1位全加器的仿真
Quartus Prime的主界面
建立Quartus Prime和Modelsim的链接
3.1.4 1位全加器的仿真
Quartus Prime的主界面设置仿真文件的格式和目录
3.1.4 1位全加器的仿真
Quartus Prime的主界面
自动生成的Test Bench模板文件
3.1.4 1位全加器的仿真
Quartus Prime的主界面对Test Bench进一步设置
3.1.4 1位全加器的仿真
1位全加器时序仿真波形图
Quartus Prime的主界面
3.1.5 1位全加器的下载
n本例针对的下载板为DE2-115,故目标器件应为:EP4CE115F29C7。
n选择菜单Assignments→Pin Planner,在Pin Planner对话框中,进行引脚的锁定。
n A →PIN_AB28 SW0(拨动开关)
n B →PIN_AC28 SW1(拨动开关)
n CIN →PIN_AC27 SW2(拨动开关)
n SUM →PIN_E21 LEDG0(LED灯)
n COUT→PIN_AB28 LEDG1(LED灯)
3.1.5 1位全加器的下载
编程下载窗口
Quartus Prime的主界面
第3章 Quartus Prime使用指南
3.2 基于IP 核的设计
Quartus Prime 的主界面LPM_COUNTER 模块命名
n 3.2.1 用LPM_COUNTER 设计模24
方向可控计数器
3.2.1 用LPM_COUNTER设计模24方向可控计数器
Quartus Prime的主界面
启动MegaWizard Plug-In Manager,对LPM_COUNTER模块进行参数设置
3.2.1 用LPM_COUNTER 设计模24方向可控计数器
Quartus Prime 的主界面
模24
方向可控计数器原理图
3.2.1 用LPM_COUNTER 设计模24方向可控计数器
Quartus Prime 的主界面
模24
方向可控计数器门级仿真波形图
3.2.2 用LPM_ROM模块实现4×4无符号数乘法器
Save IP Variation对话框
Quartus Prime的主界面
3.2.2 用LPM_ROM模块实现4×4无符号数乘法器
基于lpm_rom实现的4×4无符号数乘法器原理图
Quartus Prime的主界面
3.2.2 用LPM_ROM模块实现4×4无符号数乘法器
ROM存储器的内容存储在*.mif文件中
Quartus Prime的主界面
3.2.2 用LPM_ROM 模块实现4×4无符号数乘法器
Quartus Prime 的主界面
4×4
无符号数乘法器波形仿真结果
第3章 Quartus Prime使用指南
3.3 SignalTap II的使用方法
n Quartus Prime的嵌入式逻辑分析仪SignalTap II为设计者提供了一种方便高效的硬件测试手段,它可以随设计文件一起下载到目标芯片中,捕捉目标芯片内信号节点或总线上的数据,将这些数据暂存于目标芯片的嵌入式RAM中,然后通过器件的JTAG 端口将采到的信息和数据送到计算机进行显示,供用户分析。
Quartus Prime 的主界面
调入待测信号3.3 SignalTap II 的使用方法
Quartus Prime 的主界面 SignalTap II 参数设置窗口
3.3 SignalTap II
的使用方法
Quartus Prime 的主界面
SignalTap II 数据窗口显示的实时采样的信号波形3.3 SignalTap II
的使用方法
第3章 Quartus Prime使用指南
Quartus Prime 的主界面
编译器设置3.4 Quartus Prime
的优化设置与时序分析
Quartus Prime 的主界面
查看Design Assistant
报告3.4 Quartus Prime 的优化设置与时序分析
Quartus Prime 的主界面资源优化指导(Resource Optimization Advisor )3.4 Quartus Prime
的优化设置与时序分析
3.1 基于Quartus Prime软件,用D触发器设计一个2分频电路,并做波形仿真,在此基础上,设计一个4分频和8分频电路,做波形仿真。
1.4 数字系统的实现方式有哪些?各有什么优缺点?
3.2 基于Quartus Prime软件,用74161设计一个模10计数器,并进行编译和仿真。
3.3 基于Quartus Prime软件,用74161设计一个模99的计数器,个位和十位都采用8421BCD码的编码方式设计,分别用置0和置1两种方法实现,完成原理图设计输入、编译、仿真和下载整个过程。
3.5 基于Quartus Prime软件,用74283(4位二进制全加器)设计实现一个8位全加器,并进行综合和仿真,查看综合结果和仿真结果。