verilog串并转换并串转换
-
1.
设计名称:
38
译码器带使能端的
主要功能:
p>
实现
38
译码功能,并且在使能段处于低电
平是输出为
00000000
设计框图:
设计代码:
module
decoder3_8(a,b,ena);
input [2:0] a;
input
ena;
output [7:0] b;
reg
[7:0] b;
always @ (ena,a)
if(!ena)
begin
b=8'b00000000;
end
else
begin
case(a)
3'b000:
b=8'b00000001;
3'b001:
b=8'b00000010;
3'b010:
b=8'b00000100;
3'b011:
b=8'b00001000;
3'b100:
b=8'b00010000;
3'b101:
b=8'b00100000;
3'b110:
b=8'b01000000;
3'b111:
b=8'b10000000;
default: b=8'b00000000;
endcase
end
endmodule
仿真代码:
`timescale 1ns/1ns
module
tb;
reg [2:0] a;
reg ena;
wire [7:0] b;
initial begin
a
= 3'b000;
ena
= 1'b0;
#50;
ena = 1'b1;
#50;
a=3'b001;
#50;
a=3'b010;
#50;
a=3'b011;
#50;
a=3'b100;
#50;
a=3'b101;
#50;
a=3'b110;
#50;
a=3'b111;
#50;
$$ stop;
end
decoder3_8
udecoder3_8(
.a(a),
.ena(ena),
.b(b)
);
endmodule
仿真结果:
辅助说明:
当
ena
为低电平时,无论
a
为何值,
总是输出
00000000
,当
ena
为高电平时,输出即随
a
的数值变化而
变化,
当
a
为
001
时,
b
的值变为
00000010
;
当
a
p>
为
010
时,
b<
/p>
的值变为
00000100
,
这与设计时的功能是一致的。
________
__________________________________________________
_____________________
2.
设计名
称:
83
编码器带使能端的和优先级
主要功能:
实现
83
编码功能,并且在使能段处于低电平是输出为
000<
/p>
,同时最高位的优先级最高
设计框图:
设计代码:
module
undecoder8_3(a,b,ena);
input [7:0] a;
input
ena;
output [3:0] b;
reg
[3:0] b;
always @ (ena,a)
if(!ena)
begin
b=3'b000;
end
else
if(a[7])
b=3'b111;
else
if(a[6])
b=3'b110;
else
if(a[5])
b=3'b101;
else
if(a[4])
b=3'b100;
else
if(a[3])
b=3'b011;
else
if(a[2])
b=3'b010;
else
if(a[1])
b=3'b001;
else
if(a[0])
b=3'b000;
else
b=3'b000
;
endmodule
仿真代码:
module tb;
reg [7:0] a;
reg ena;
wire [2:0] b;
initial begin
a
= 8'b10000000;
ena = 1'b0;
#50;
ena = 1'b1;
#50;
a=8'b01000000;
#50;
a=8'b00100000;
#50;
a=8'b00010000;
#50;
a=8'b00001000;
#50;
a=8'b00000010;
#50;
a=8'b00000001;
#50;
a=8'b10100000;
#50;
$$stop;
end
undecoder8_3
unit1_undecoder8_3(
.a(a),
.ena(ena),
.b(b)
);
endmodule
仿真结果:
辅助说明:
当
ena
为低电平时,无论
a
为何值,
总是输出
000
,当
ena
为高电平时,输出即随
a
的数值
< br>变化而变化,当
a
为
01000
000
时,
b
为
110
,当
a
为
00100000
是,
b
为
101
以此类推,同
时最后一个波形为,当<
/p>
a
为
10100000
< br>时,
b
为
111
,体现了优先译码的功能,此结果和当
初设计的功能一致的。
< br>
___________________________________
____________________________________________
3.
设计名称:设计一个
1
:
1
的
3
分频器
主要功能:
p>
实现
3
分频,同时高低电平比为
1
:
1
设计框图:
设计代码:
这个设计可以利用模三计
数器分别在时钟的上升和下降沿设计一个高低电平为
1
:
2
的
3
分
频,然后将两个波形相或即能得到结果。
代码一:
module
Devider2_1(
//inputs
clk,
rst_n,
//outputs
opt1,
opt2,
opt);
input clk;
input rst_n;
output opt;
output opt1;
output opt2;
reg
opt1;
reg [1:0] temp1;
reg opt2;
reg
[1:0] temp2;
always@(posedge clk)
begin
if(!rst_n)
begin
temp1 <= 2'd0;
opt1
<= 1'b0;
end
else if(temp1==1)
begin
opt1
<=1'b1;
temp1 <= temp1 + 2'd1;
end
else
if(temp1==2'd2)
begin
opt1
<= 1'b0;
temp1 <= 2'd0;
end
else
begin
temp1 <= temp1+2'd1;
end
end
always@(negedge clk)
begin
if(!rst_n)
begin
temp2 <= 2'd0;
opt2
<= 1'b0;
end
else
if(temp2==1) begin
opt2
<=1'b1;
temp2 <= temp2 + 2'd1;
end
else if(temp2==2'd2)
begin
opt2
<= 1'b0;
temp2 <= 2'd0;
end
else
begin
temp2 <=
temp2+2'd1;
end
end
assign opt = opt1 || opt2;
endmodule
同时也可以用同样的方法设计一个在上升
和下降沿高低电平
2
:
1
的
3
分频器,将两个波形
相
与即可。
代码二:
module Devider2_1(
//inputs
clk,
rst_n,
//outputs
opt1,
opt2,
opt);
input clk;
input rst_n;
output opt;
output opt1;
output opt2;
reg
opt1;
reg opt2;
reg [1:0] temp1;
reg
[1:0] temp2;
always@(posedge clk)
begin
if(!rst_n)
begin
temp1 <= 2'd0;
opt1
<= 1'b0;
end
//reset
else if(temp1==2'd0)
begin
opt1<=1'b1;
temp1 <= temp1 + 2'd1;
end
else
if(temp1==2'd1)
begin
opt1
<=1'b1;
temp1 <= temp1 + 2'd1;
end
else if(temp1==2'd2)
begin
opt1
<= 1'b0;
temp1 <= 2'd0;
end
end
always@(negedge clk)
begin
if(!rst_n)
begin
temp2 <= 2'd0;
opt2
<= 1'b0;
end
//reset
else if(temp2==2'd0)
begin
opt2<=1'b1;
temp2 <= temp2 + 2'd1;
end
else if(temp2==2'd1)
begin
opt2
<=1'b1;
temp2 <= temp2 + 2'd1;
end
else if(temp2==2'd2)
begin
opt2
<= 1'b0;
temp2 <= 2'd0;
end
end
assign opt =
opt1&&opt2;
endmodule
仿真代码:
上面两个代码的仿真代码是一样的。
`timescale 1ns/1ns
module
tb;
//inputs
reg clk;
reg rst_n;
//outputs
wire opt1;
wire opt2;
wire opt;
//generate clk
always #10 clk
= ~clk;
//tb starts
Initial
begin
clk
= 1'b0;
rst_n = 1'b0;
#100;
rst_n = 1'b1;
#500;
$$stop;
end
//Instant DUT
Devider2_1 uDevider2_1(
//inputs
.clk(clk),
.rst_n(rst_n),
//outputs
.opt1(opt1),
.opt2(opt2),
.opt(opt)
);
endmodule
仿真结果:
(
a
)高低电平为
1
:
2
设计的
(
b
)高低
电平为
2
:
1
设计的
辅助说明:
(
a
)
p>
中
opt1
为上升沿触发的高低电平
1
:
2
的
3
分频,
opt2
为下降
沿触发的高低电平为
1
:
2
的
3
分频,可以看出在
r
st_n
为
0
进行清复位,之后在
p>
rst_n
为
1
是
进行分频,
最后所得
opt
结果为
p>
1
:
1
的
3
分频,符合设计要求。
(
b
)中
opt1
为上升沿触发的高低电平
2
:
1
的
3
分频,
opt2
为下降沿触发的高低电平为
2
:
1
的
3
分频
,可以看出在
rst_n
为
0
进行清复位,之后在
rst_n
为
1
是进行分频,最后所得
opt
结果为
1
:
1
的
3
分频,符合设计要求。
p>
_________________________________________
______________________________________
4.
设计名称:七人表决器
主要功能:
7
个人进行表决,人数过
4
则
LED<
/p>
灯亮,否则灯灭
设计框图:
设计代码:
module
v(vote,rst,Q);
input
[6:0]vote;
input
rst;
output Q;
reg Q;
reg
[2:0]c;
always
@(vote
or
rst)
begin
c=0;
if(rst)
c=3'b000;
else
begin
c=c+vote[0];
c=c+vote[1];
c=c+vote[2];
c=c+vote[3];
c=c+vote[4];
c=c+vote[5];
c=c+vote[6];
end
if(c>3)
Q=1;
else
Q=0;
end
endmodule
仿真代码:
`timescale
1ns/1ns
module q;
reg
rst;
reg [6:0]vote;
wire Q;
initial
begin
rst=0;
vote=7'b111111;
#50;
rst=1;
#50;
rst=0;
#50;
vote=7'b0110101;
#50;
vote=7'b0100101;
#50;
vote=7'b0111101;
#50;
vote=7'b1111001;
#50;
vote=7'b0100001;
#50;
vote=7'b0000001;
#50;
$$stop;