[转载]3-8译码器的几种Verilog HDL代码描述方法
(2015-01-13 21:50:20)
标签:
转载 |
以低电平输出为例:
第一种:case语句
`timescale 10ns/1ns
module decode3_8 (data_out,data_in,enable) ;
input [2:0] data_in;
input enable;
output [7:0] data_out;
reg [7:0] data_out;
always @(data_in or enable)
begin
end
endmodule
第二种:if-else if语句
`timescale 10ns/1ns
module decode3_8 (data_out,data_in,enable) ;
input [2:0] data_in;
input enable;
output [7:0] data_out;
reg [7:0] data_out;
always @(data_in or enable)
begin
data_out=8'b11111110;
data_out=8'b11111101;
data_out=8'b11111011;
data_out=8'b11110111;
data_out=8'b11101111;
data_out=8'b11011111;
data_out=8'b10111111;
data_out=8'b01111111;
data_out=8'bxxxxxxxx;
end
endmodule
第三种:算法实现,但是不可综合
`timescale 10ns/1ns
module decode3_8 (data_out,data_in,enable) ;
input [2:0] data_in;
input enable;
output [7:0] data_out;
reg A=8’b0000_0001;
assign data_out=(enable)?(~(A<<data_in-1)):8'b1111_1111;
endmodule
第四种:for语句(1)
`timescale 10ns/1ns
module decode3_8 (data_out,data_in,enable) ;
input [2:0] data_in;
input enable;
output [7:0] data_out;
reg [7:0] data_out;
integer i;
always @(data_in or enable)
begin
if(enable)
begin
begin
data_out[i]=0;
data_out[i]=1;
end
end
else
data_out=8'hff;
end
endmodule
第五种:带条件的连续赋值
`timescale 10ns/1ns
module decode3_8 (data_out,data_in,enable) ;
input [2:0] data_in;
input enable;
output [7:0] data_out;
assign data_out =
({enable,data_in}==4'b1000)?8'b1111_1110:
({enable,data_in}==4'b1001)?8'b1111_1101:
({enable,data_in}==4'b1010)?8'b1111_1011:
({enable,data_in}==4'b1011)?8'b1111_0111:
({enable,data_in}==4'b1100)?8'b1110_1111:
({enable,data_in}==4'b1101)?8'b1101_1111:
({enable,data_in}==4'b1110)?8'b1011_1111:
({enable,data_in}==4'b1111)?8'b0111_1111:
8'b1111_1111;
endmodule
第六种:for语句(2)
`timescale 10ns/1ns
module decode3_8 (data_out,data_in,enable) ;
input [2:0] data_in;
input enable;
output [7:0] data_out;
reg [7:0] data_out;
integer i;
always @(data_in or enable)
begin
data_out=8'hff;
if(enable)
begin
for(i=0;i<8;i=i+1)
begin
if(data_in==i)
data_out = 255-(1<<i);
else
data_out=8'hff;
end
endmodule
Testbench写法:
以使用Cadence的Ncverilog和Simvision工具为例来说明:
`timescale 10ns/1ns
module decode3_8_tb;
reg
wire
reg
decode3_8 decode3_8(.data_in (data_in_tb),.data_out (data_out_tb ),.enable (enable_tb));
initial
begin
enable_tb=0;
data_in_tb=0;
#20 enable_tb=1;
#50 data_in_tb =0;
#50 data_in_tb=1;
#50 data_in_tb=2;
#50 data_in_tb=3;
#50 data_in_tb=4;
#50 data_in_tb=5;
#50 data_in_tb=6;
#50 data_in_tb=7;
$finish();
end
endmodule