Verilog的135个经典设计实例
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
、 b n o t : out = 呻a ;
default: out=8 ’ hx ; endcase end endm。dul e
//操作码 //操作数 // 电平敏感的 a lways 块
//加操作 //减操作 //求与 //求或 //求反 //未收到指令时,输出任意态
【 19~ 5.4 】用 initial 过程语旬对测试变量 A、 B、 C 赋值 、 timescale lns/ ln s
//持续赋值,如 果 sel 为 0 , 贝I] out =a : 否则 out =b endmo dule
【 19~ 5. 8 】 阻塞赋值方式定义的 2 选 l 多路选择器 m。dule MUX2 1_2(out , a , b , sel) ; input a , b , sel ;
-5 -
程序文本
#(cycle/2) wave= O;
#(cycle/2) wave=l;
#(cycle/2) $finish
end
initial $monitor {♀ t ime ,,,” wave= 告b ”, wave) ;
endm。dul e
自
【 19~ 5. 6 】用 fork才oin 并行块产生信号波形 、 timescale l Ons/ l ns
begin
if (!reset )
out = 8 ’ h OO ;
else if (load) out = data;
else
out = out + 1;
end
endm。dul e
//e l k 上升沿触发
// 同步清 0 ,低电平有效 // 同步预置 //计数
【 19~ 5. 3 】用 always 过程语旬描述的简单算术逻辑单元 、 define add 3 ’ dO 、 define minus 3 ’ dl 、 define band 3 ’ d2 、 define bo r 3 ’ d3 、 define bnot 3 ’ d4
#DELY
reset =l;
#DELY
reset=O;
#(DELY 女 20) $fi nish ; end //定义结果显示格式
i n i t i a l $monitor($ time , ,,” elk= 毛d re set = 屯d out =毛d”, e l k , re set , out) ;
王金明: 《 Verilog HDL 程序设计教程 》
【 例 3. 2 】 4 位计数器
m。dule count 4 (o u t ,reset, c l k ) ;
。utput [3 : 0 ]。ut ;
input rese t , clk;
reg [3 : 0] out ;
always @( p。sedge elk)
。utput c , b ;
input c l k, a ;
reg c , b ;
always @( p。sedge elk)
begin
b<=a ; c<=b ; end endm。dul e
// 阻塞赋值
【 19~ 5. 10 】 阻塞赋值
m。dule b l ock(c , b , a , clk) ;
//测试输入信号定义为 reg 型 //测试输出信号定义为 wi re 型
count4 mycount(out,reset , c l k );
//调用测试对象
always #(DELY/2) elk = ~e l k ;
//产生时钟波形
initial begin
//激励信号定义
elk = 0 ; reset= O;
【 19~ 3.1 】 4 位全加器 m。dule adder4 (cout , sum,ina , inb , c in ) ; 。utput [3 : 0] sum; 。utput cout ; input [3 : 0] ina ,inb ; input cin; assign {cout , sum} =ina+i nb+ci n ; endm。dul e
begin if (reset ) else if (load)
qout<=O; qout<=data ;
// 同步复位 // 同步置数
else if (cin)
begin if (qout[3:0 ] ==9) begin qout[3:0]<=0 ;
//低位是否为 9 ,是则 //囡 0 , 并判断高位是否为 5
endm。dul e
【 19~ 3.4 ] 4 位计数器的仿真程序
、 timescale lns/lns
、 include ” count 4 . v ”
m。 d xulqe counre4s一 t p.,
e
cl
b h
’
et ;
wire [3 : 0] out ; parameter DELY= l OO ;
1- J< 咱 i
rb ·
「J
l ·
I「
+
d
o A甘
1
4
LA 气 」
end
//设定 b 的取值
initial
// 定义结果显示格式
begin
♀mon itor ($time ,,,” 毛d +毛d + 毛b={ 告b, 毛d } ”, a, b , cin , cout , sum) ;
#160 $finish; end
endm。dul e
【 侣。 3 . 5 】 “与-或-非”门电路 m。dule AOI(A,B , C, D, F) ; input A,B,C,D; 。utput F; -2 -
//模块名为 AOI ( 端 口 歹lj 表 A, B, C, D, F) //模块的输入端 口 为 A, B, C, D //模块的输出端口为 F
#(6*cycl e) $finish;
3。in
i n i t i a l $monitor($ t ime ,,, ” wave= 每b ”, wave) ; endm。dul e
【 例 5.7 】 持续赋值方式定义的 2 选 l 多路选择器 m。dule MUX2 1_1(out , a,b , sel); input a , b , sel ; 。utput out ; assign out =( sel==O)?a:b;
if (qout[ 7 : 4 ] ==5) qout [ 7 : 4]<=0 ;
else qout [7 : 4]<=qout[ 7 : 4 ]+1; end else
//高位不为 5 ,则加 l //低位不为 9 ,则加 l
qout [3 : 0]<=qout[3:0 ]+1; end
。utput [ 7 : 0] qout ;
。utput cout ; input [7 : 0] dat a ;
input l oad, cin , c l k ,reset;
reg [7 : 0] qout ; always @( p。sedge elk)
//el k 上升沿时刻计数
-6 -
王金明: 《 Verilog HDL 程 序设计教程》
endcase
endm。dul e
【 19~ 5. 2】同步置数、同步清零的计数器 m。dule count(out,data,load,reset,clk );
。utput [ 7 : 0] out ;
input [7 : 0] data;
input load,cl k , r e set;
reg [7 : OJ out; always @( p。sedge elk)
。utput c , b ;
input c l k, a ;
reg c , b ;
always @( p。sedge elk)
begin
b c
=问 =
L的
e nd d
en
· 伽
。
Байду номын сангаас
U. e
【 侣。 5.11 】 模为 60 的 BCD 码加法计数器
m。dule count60(qout , cout, data , load, c i n ,rese t , clk) ;
m。dule t e st ;
reg A, B, C;
initial
begin
A = O; B = l; C = O;
#50 A = l; B = O; #50 A = O; c = l;
#50
B = l;
#50
B = O; C = O;
#50
$ fini sh
end
endmodule
【 例 5. 5 】用 be伊1-end 串行块产生信号波形 、 timescale lOns/ l ns
。utput out ; reg out; always @(a 。z b 。z sel)
begin
if (sel = = O) out=a ;
else
out =b ;
end
endmodule 【 侣。 5.9 】 非阻塞赋值
m。dule n on_ b lock(c , b , a , c l k) ;
reg c in; wire [3 : 0 ] sum;
wire cou t ;
integer i, j ;
//测试模块的名字 //测试输入信号定义为 reg 型
//测试输出信号定义为 wi r e 型
adder 4 adder (sum, cout , a , b , c i n ); always #5 cin= ~c i n ;
m。dule wave l ;
reg wave;
-- pazinamet&』 aer 咽
y e c c、4
- -
牛
nu
-l
-- ·
-
begin
-4-
王金明: 《 Verilog HDL 程序设计教程 》
wave= O;
#(cycle/2) wave=l;
#(cycle/2) wave= O;
#(cycle/2) wave=l;
// 调用 测试对象 // 设定 c i n 的取值
init ial begin a =O; b =O; c i n =O;
f。r (i= l;i < 1 6 ; i = i+l )
#10 a =i; end
// 设定 a 的取值
-1 -
程序文本
initial
h U
e
qi zn
S -E 。
= UF -- ( --
。utput out ;
input in0,inl ,in2,in3;
input [l : O] sel;
reg out; always @( inO 。z i nl 。z in2 。z in3 。z sel)
//敏感信号列表
case (sel )
2 ’ bOO: out=in O;
2 ’ bO l : out=inl; 2 ’ blO: out = i口2; 2 ’ bll: out=in3; default : out=2 ’ bx;
-3 -
程序文本 m。dule alu(out , opcode , a , b) ; 。utput [ 7 : 0 ] out ; reg [7 : 0] out ; input [2 : 0 ] opcode; input [7 : 0 ] a , b ; always @(opcode 。x a 。z b) begin case (opcode) 、 add : out = a+b; 、 m inus : out = a-b ; 、 band : out = a&b ; 、 bor : out = a l b ;
wire A, B,C,D,F; assign F= ~( (A&B) I (C&D));
endm。dul e
王金明: 《 Verilog HDL 程序设计教程 》 // 定义信号的数据类型 // 逻辑功能描述
【 19~ 5.1 】用 case 语旬描述的 4 选 1 数据选择器 m。dule mux4_l (out,in0,in l , i n2,in3,sel);
begin
if (rese t ) out<=O;
else
out <=out+l ;
end
endm。dul e
// 同步复位 // 计数
【 19~ 3 . 3 】 4 位全加器的仿真程序 、 timescale l ns/ lns
、 include ” adder4 . v ”
m。 d xu 1qe aα 1 ‘ dJea r J P., e fL3: nu ’ b.,
m。dule wave2 ;
reg wave;
parinamet+』 aez cV4C14 e=JR.,
-· 唱
-L
· -
f。rk
#(cycle)
w a ve = O; wave=l;
#(2*cycl e) wave= O; #(3*cycl e) wave=l ;
#(4*cycl e) wave=O; #(S*cycl e) wave=l;
default: out=8 ’ hx ; endcase end endm。dul e
//操作码 //操作数 // 电平敏感的 a lways 块
//加操作 //减操作 //求与 //求或 //求反 //未收到指令时,输出任意态
【 19~ 5.4 】用 initial 过程语旬对测试变量 A、 B、 C 赋值 、 timescale lns/ ln s
//持续赋值,如 果 sel 为 0 , 贝I] out =a : 否则 out =b endmo dule
【 19~ 5. 8 】 阻塞赋值方式定义的 2 选 l 多路选择器 m。dule MUX2 1_2(out , a , b , sel) ; input a , b , sel ;
-5 -
程序文本
#(cycle/2) wave= O;
#(cycle/2) wave=l;
#(cycle/2) $finish
end
initial $monitor {♀ t ime ,,,” wave= 告b ”, wave) ;
endm。dul e
自
【 19~ 5. 6 】用 fork才oin 并行块产生信号波形 、 timescale l Ons/ l ns
begin
if (!reset )
out = 8 ’ h OO ;
else if (load) out = data;
else
out = out + 1;
end
endm。dul e
//e l k 上升沿触发
// 同步清 0 ,低电平有效 // 同步预置 //计数
【 19~ 5. 3 】用 always 过程语旬描述的简单算术逻辑单元 、 define add 3 ’ dO 、 define minus 3 ’ dl 、 define band 3 ’ d2 、 define bo r 3 ’ d3 、 define bnot 3 ’ d4
#DELY
reset =l;
#DELY
reset=O;
#(DELY 女 20) $fi nish ; end //定义结果显示格式
i n i t i a l $monitor($ time , ,,” elk= 毛d re set = 屯d out =毛d”, e l k , re set , out) ;
王金明: 《 Verilog HDL 程序设计教程 》
【 例 3. 2 】 4 位计数器
m。dule count 4 (o u t ,reset, c l k ) ;
。utput [3 : 0 ]。ut ;
input rese t , clk;
reg [3 : 0] out ;
always @( p。sedge elk)
。utput c , b ;
input c l k, a ;
reg c , b ;
always @( p。sedge elk)
begin
b<=a ; c<=b ; end endm。dul e
// 阻塞赋值
【 19~ 5. 10 】 阻塞赋值
m。dule b l ock(c , b , a , clk) ;
//测试输入信号定义为 reg 型 //测试输出信号定义为 wi re 型
count4 mycount(out,reset , c l k );
//调用测试对象
always #(DELY/2) elk = ~e l k ;
//产生时钟波形
initial begin
//激励信号定义
elk = 0 ; reset= O;
【 19~ 3.1 】 4 位全加器 m。dule adder4 (cout , sum,ina , inb , c in ) ; 。utput [3 : 0] sum; 。utput cout ; input [3 : 0] ina ,inb ; input cin; assign {cout , sum} =ina+i nb+ci n ; endm。dul e
begin if (reset ) else if (load)
qout<=O; qout<=data ;
// 同步复位 // 同步置数
else if (cin)
begin if (qout[3:0 ] ==9) begin qout[3:0]<=0 ;
//低位是否为 9 ,是则 //囡 0 , 并判断高位是否为 5
endm。dul e
【 19~ 3.4 ] 4 位计数器的仿真程序
、 timescale lns/lns
、 include ” count 4 . v ”
m。 d xulqe counre4s一 t p.,
e
cl
b h
’
et ;
wire [3 : 0] out ; parameter DELY= l OO ;
1- J< 咱 i
rb ·
「J
l ·
I「
+
d
o A甘
1
4
LA 气 」
end
//设定 b 的取值
initial
// 定义结果显示格式
begin
♀mon itor ($time ,,,” 毛d +毛d + 毛b={ 告b, 毛d } ”, a, b , cin , cout , sum) ;
#160 $finish; end
endm。dul e
【 侣。 3 . 5 】 “与-或-非”门电路 m。dule AOI(A,B , C, D, F) ; input A,B,C,D; 。utput F; -2 -
//模块名为 AOI ( 端 口 歹lj 表 A, B, C, D, F) //模块的输入端 口 为 A, B, C, D //模块的输出端口为 F
#(6*cycl e) $finish;
3。in
i n i t i a l $monitor($ t ime ,,, ” wave= 每b ”, wave) ; endm。dul e
【 例 5.7 】 持续赋值方式定义的 2 选 l 多路选择器 m。dule MUX2 1_1(out , a,b , sel); input a , b , sel ; 。utput out ; assign out =( sel==O)?a:b;
if (qout[ 7 : 4 ] ==5) qout [ 7 : 4]<=0 ;
else qout [7 : 4]<=qout[ 7 : 4 ]+1; end else
//高位不为 5 ,则加 l //低位不为 9 ,则加 l
qout [3 : 0]<=qout[3:0 ]+1; end
。utput [ 7 : 0] qout ;
。utput cout ; input [7 : 0] dat a ;
input l oad, cin , c l k ,reset;
reg [7 : 0] qout ; always @( p。sedge elk)
//el k 上升沿时刻计数
-6 -
王金明: 《 Verilog HDL 程 序设计教程》
endcase
endm。dul e
【 19~ 5. 2】同步置数、同步清零的计数器 m。dule count(out,data,load,reset,clk );
。utput [ 7 : 0] out ;
input [7 : 0] data;
input load,cl k , r e set;
reg [7 : OJ out; always @( p。sedge elk)
。utput c , b ;
input c l k, a ;
reg c , b ;
always @( p。sedge elk)
begin
b c
=问 =
L的
e nd d
en
· 伽
。
Байду номын сангаас
U. e
【 侣。 5.11 】 模为 60 的 BCD 码加法计数器
m。dule count60(qout , cout, data , load, c i n ,rese t , clk) ;
m。dule t e st ;
reg A, B, C;
initial
begin
A = O; B = l; C = O;
#50 A = l; B = O; #50 A = O; c = l;
#50
B = l;
#50
B = O; C = O;
#50
$ fini sh
end
endmodule
【 例 5. 5 】用 be伊1-end 串行块产生信号波形 、 timescale lOns/ l ns
。utput out ; reg out; always @(a 。z b 。z sel)
begin
if (sel = = O) out=a ;
else
out =b ;
end
endmodule 【 侣。 5.9 】 非阻塞赋值
m。dule n on_ b lock(c , b , a , c l k) ;
reg c in; wire [3 : 0 ] sum;
wire cou t ;
integer i, j ;
//测试模块的名字 //测试输入信号定义为 reg 型
//测试输出信号定义为 wi r e 型
adder 4 adder (sum, cout , a , b , c i n ); always #5 cin= ~c i n ;
m。dule wave l ;
reg wave;
-- pazinamet&』 aer 咽
y e c c、4
- -
牛
nu
-l
-- ·
-
begin
-4-
王金明: 《 Verilog HDL 程序设计教程 》
wave= O;
#(cycle/2) wave=l;
#(cycle/2) wave= O;
#(cycle/2) wave=l;
// 调用 测试对象 // 设定 c i n 的取值
init ial begin a =O; b =O; c i n =O;
f。r (i= l;i < 1 6 ; i = i+l )
#10 a =i; end
// 设定 a 的取值
-1 -
程序文本
initial
h U
e
qi zn
S -E 。
= UF -- ( --
。utput out ;
input in0,inl ,in2,in3;
input [l : O] sel;
reg out; always @( inO 。z i nl 。z in2 。z in3 。z sel)
//敏感信号列表
case (sel )
2 ’ bOO: out=in O;
2 ’ bO l : out=inl; 2 ’ blO: out = i口2; 2 ’ bll: out=in3; default : out=2 ’ bx;
-3 -
程序文本 m。dule alu(out , opcode , a , b) ; 。utput [ 7 : 0 ] out ; reg [7 : 0] out ; input [2 : 0 ] opcode; input [7 : 0 ] a , b ; always @(opcode 。x a 。z b) begin case (opcode) 、 add : out = a+b; 、 m inus : out = a-b ; 、 band : out = a&b ; 、 bor : out = a l b ;
wire A, B,C,D,F; assign F= ~( (A&B) I (C&D));
endm。dul e
王金明: 《 Verilog HDL 程序设计教程 》 // 定义信号的数据类型 // 逻辑功能描述
【 19~ 5.1 】用 case 语旬描述的 4 选 1 数据选择器 m。dule mux4_l (out,in0,in l , i n2,in3,sel);
begin
if (rese t ) out<=O;
else
out <=out+l ;
end
endm。dul e
// 同步复位 // 计数
【 19~ 3 . 3 】 4 位全加器的仿真程序 、 timescale l ns/ lns
、 include ” adder4 . v ”
m。 d xu 1qe aα 1 ‘ dJea r J P., e fL3: nu ’ b.,
m。dule wave2 ;
reg wave;
parinamet+』 aez cV4C14 e=JR.,
-· 唱
-L
· -
f。rk
#(cycle)
w a ve = O; wave=l;
#(2*cycl e) wave= O; #(3*cycl e) wave=l ;
#(4*cycl e) wave=O; #(S*cycl e) wave=l;