直接代码
83编码器:
module Encoder8x3a(
input En,
input [7:0] I,
output [2:0] Y
// reg GS
);
reg [2:0] Out_coding;
assign Y = Out_coding+3'd1;
always @(I)
begin
//if(~En)
// begin
// Out_coding=3'd0; GS = 1'b0;
// end
//else begin
//GS=1'b1;
casez(I)
8'b1???_????:Out_coding = 3'd7;
8'b01??_????:Out_coding = 3'd6;
8'b00??_????:Out_coding = 3'd5;
8'b0001_????:Out_coding = 3'd4;
8'b0000_1???:Out_coding = 3'd3;
8'b0000_01??:Out_coding = 3'd2;
8'b0000_001?:Out_coding = 3'd1;
8'b0000_0001:Out_coding = 3'd0;
8'b0000_0000:begin Out_coding = 3'd0; end
default: begin Out_coding=3'd0; end
endcase
//end
end
endmodule
7段译码器:
module SEG7_LUT (oSEG,iDIG);
input [3:0] iDIG;
output reg [6:0] oSEG;
always @(iDIG)
begin
case(iDIG)
4'h1: oSEG=7'b111_1001;
4'h2: oSEG=7'b010_0100;
4'h3: oSEG=7'b011_0000;
4'h4: oSEG=7'b001_1001;
4'h5: oSEG=7'b001_0010;
4'h6: oSEG=7'b000_0011;
4'h7: oSEG=7'b111_1000;
4'h8: oSEG=7'b000_0000;
4'h9: oSEG=7'b001_0000;
4'ha: oSEG=7'b000_1000;
4'hb: oSEG=7'b000_0011;
4'hc: oSEG=7'b100_0110;
4'hd: oSEG=7'b010_0001;
4'he: oSEG=7'b000_0110;
4'hf: oSEG=7'b000_1110;
4'h0: oSEG=7'b100_0000;
endcase
end
Endmodule
拼接文件:
module qd(I,oSEG);
input [7:0] I;
output [6:0] oSEG;
wire [2:0] t_Y;
Encoder8x3a m1(
.En(1'b1),
.I(I),
.Y(t_Y));
SEG7_LUT m2(
.iDIG({0,t_Y}),
.oSEG(oSEG));
Endmodule
测试文件:
`timescale 1ns/1ns
module t_qd;
reg [7:0] I;
wire [6:0] oSEG;
reg clock;
initial
begin
I[7:0]=8'd0;
clock=1'b0;
end
always #5 clock = ~clock;
always@(posedge clock)
begin
I[7:0]= {$random}%256;
end
qd m1(
.I(I),
.oSEG(oSEG));
endmodule
设计过程按照分为83编码器模块和7段数码管模块进行,使用83编码器去掉使能端,形成8输入3输出,7段数码管拼接时对83输出加以为拼接为4位,然后对设计模块进行例化,之后加入对拼接模块进行加入激励,对输入信号随机处理,计入时钟,最后测试仿真。
问题:
在整个过程中特别注意子模块与父模块的数据类型规定,还有就是出现了关于Modelsim仿真时Object列表为空的问题,搜索网络得知是软件设计的问题,在测试过程中发现,83编码器输入端对于大于8的数字也会输出到数码管,代码只会识别最高位的1,就找不出最先抢答的输入或出错。