题目
![](https://img-blog.csdnimg.cn/a61b1f278d7e4c139742d1aeb11bfd56.png)
程序
design
`timescale 1ns/1ps
module vlg_design(
input i_clk,
input i_rst_n,
input[7:0] i_data,
output[2:0] o_data
);
reg[3:0] r_data;
always @(posedge i_clk)
if(!i_rst_n) r_data <= 'b0;
else if(i_data == 8'b00000001) r_data <= 3'b000;
else if(i_data == 8'b00000010) r_data <= 3'b001;
else if(i_data == 8'b00000100) r_data <= 3'b010;
else if(i_data == 8'b00001000) r_data <= 3'b011;
else if(i_data == 8'b00010000) r_data <= 3'b100;
else if(i_data == 8'b00100000) r_data <= 3'b101;
else if(i_data == 8'b01000000) r_data <= 3'b110;
else if(i_data == 8'b10000000) r_data <= 3'b111;
else ;
/*always @(posedge i_clk)
if(!i_rst_n) r_data <= 'b0;
else begin
case(i_data)
8'b00000001: r_data <= 3'b000;
8'b00000010: r_data <= 3'b001;
8'b00000100: r_data <= 3'b010;
8'b00001000: r_data <= 3'b011;
8'b00010000: r_data <= 3'b100;
8'b00100000: r_data <= 3'b101;
8'b01000000: r_data <= 3'b110;
8'b10000000: r_data <= 3'b111;
default ;
endcase
end*/
assign o_data = r_data;
endmodule
testbench
`timescale 1ns/1ps
module testbench_top();
//参数定义
`define CLK_PERIORD 10 //时钟周期设置为10ns(100MHz)
//接口申明
reg i_clk;
reg i_rst_n;
reg[7:0] i_data;
wire[2:0] o_data;
//对被测试的设计进行例化
vlg_design uut_vlg_design(
.i_clk(i_clk),
.i_rst_n(i_rst_n),
.i_data(i_data),
.o_data(o_data)
);
//复位和时钟产生
//时钟和复位初始化、复位产生
initial begin
i_clk <= 0;
i_rst_n <= 0;
#1000;
i_rst_n <= 1;
end
//时钟产生
always #(`CLK_PERIORD/2) i_clk = ~i_clk;
//测试激励产生
integer i;
initial begin
i_data <= 'b0;
@(posedge i_rst_n); //等待复位完成
@(posedge i_clk);
for(i=0;i<8;i=i+1) begin
i_data <= 'b0;
i_data[i] <= 'b1;
@(posedge i_clk);
end
@(posedge i_clk);
$stop;
end
endmodule