编码器的使用
数电时候学过优先编码器的功能表
全体代码如下:
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 2024/04/11 22:38:57
// Design Name:
// Module Name: Encoder83a
// Project Name:
// Target Devices:
// Tool Versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module Encoder83a(
input En,
input [7:0] I,
output [2:0] Y,
output reg GS
);
reg [2:0] out_coding;//中间信号,中间用reg值进行计算,再复制给Y输出
assign Y = out_coding;
//进行8-3译码器编译环节
always@(I or En) begin
if(En == 0) begin
out_coding <= 3'b000;
GS <= 1'b0;//表明译码器不工作
end
else begin
GS <= 1;
casez(I)
8'b1??????? : out_coding = 3'd7;
8'b01?????? : out_coding = 3'd6;
8'b001????? : out_coding = 3'd5;
8'b0001???? : out_coding = 3'd4;
8'b00001??? : out_coding = 3'd3;
8'b000001?? : out_coding = 3'd2;
8'b0000001? : out_coding = 3'd1;
8'b00000001 : out_coding = 3'd0;
8'b00000000 : begin out_coding = 3'd0;GS<=0 ;end
endcase
end
end
endmodule
这里涉及到一个知识点:case函数的使用,以及case函数的变形。casex以及casez将z位当成无关项,也可以用?表示。casex则标是所有z和x都是无关项。
测试激励文件的代码如下:
`timescale 1ns / 1ps
/////////////////////////////////////////////////////////////////////////
module test_Encoder83(
);
reg [7:0] I;
reg En;
wire GS;
wire [2:0] Y;
Encoder83a myencoer1(
.En(En),
.I(I),
.GS(GS),
.Y(Y)
);
initial begin
#100 En = 0;I = 8'b11111111;
#100 En = 1;I = 8'b11111111;
#100 En = 1;I = 8'b10000000;
#100 En = 1;I = 8'b00010000;
#100 En = 1;I = 8'b00001000;
#100 En = 1;I = 8'b00001100;
#100 En = 1;I = 8'b00000001;
end
endmodule