`timescale 1ns/1ns module decoder_38( input E , input A0 , input A1 , input A2 , output reg Y0n , output reg Y1n , output reg Y2n , output reg Y3n , output reg Y4n , output reg Y5n , output reg Y6n , output reg Y7n ); always @(*)begin if(!E)begin Y0n = 1'b1; Y1n = 1'b1; Y2n = 1'b1; Y3n = 1'b1; Y4n = 1'b1; Y5n = 1'b1; Y6n = 1'b1; Y7n = 1'b1; end else begin case({A2,A1,A0}) 3'b000 : begin Y0n = 1'b0; Y1n = 1'b1; Y2n = 1'b1; Y3n = 1'b1; Y4n = 1'b1; Y5n = 1'b1; Y6n = 1'b1; Y7n = 1'b1; end 3'b001 : begin Y0n = 1'b1; Y1n = 1'b0; Y2n = 1'b1; Y3n = 1'b1; Y4n = 1'b1; Y5n = 1'b1; Y6n = 1'b1; Y7n = 1'b1; end 3'b010 : begin Y0n = 1'b1; Y1n = 1'b1; Y2n = 1'b0; Y3n = 1'b1; Y4n = 1'b1; Y5n = 1'b1; Y6n = 1'b1; Y7n = 1'b1; end 3'b011 : begin Y0n = 1'b1; Y1n = 1'b1; Y2n = 1'b1; Y3n = 1'b0; Y4n = 1'b1; Y5n = 1'b1; Y6n = 1'b1; Y7n = 1'b1; end 3'b100 : begin Y0n = 1'b1; Y1n = 1'b1; Y2n = 1'b1; Y3n = 1'b1; Y4n = 1'b0; Y5n = 1'b1; Y6n = 1'b1; Y7n = 1'b1; end 3'b101 : begin Y0n = 1'b1; Y1n = 1'b1; Y2n = 1'b1; Y3n = 1'b1; Y4n = 1'b1; Y5n = 1'b0; Y6n = 1'b1; Y7n = 1'b1; end 3'b110 : begin Y0n = 1'b1; Y1n = 1'b1; Y2n = 1'b1; Y3n = 1'b1; Y4n = 1'b1; Y5n = 1'b1; Y6n = 1'b0; Y7n = 1'b1; end 3'b111 : begin Y0n = 1'b1; Y1n = 1'b1; Y2n = 1'b1; Y3n = 1'b1; Y4n = 1'b1; Y5n = 1'b1; Y6n = 1'b1; Y7n = 1'b0; end default: begin Y0n = 1'b1; Y1n = 1'b1; Y2n = 1'b1; Y3n = 1'b1; Y4n = 1'b1; Y5n = 1'b1; Y6n = 1'b1; Y7n = 1'b1; end endcase end end endmodule module decoder1( input A , input B , input Ci , output wire D , output wire Co ); wire [7:0] Y ; decoder_38 u_d38( .E (1), .A0 (Ci), .A1 (B), .A2 (A), .Y0n(Y[0]), .Y1n(Y[1]), .Y2n(Y[2]), .Y3n(Y[3]), .Y4n(Y[4]), .Y5n(Y[5]), .Y6n(Y[6]), .Y7n(Y[7]) ); assign D = ~Y[1] | ~Y[2] | ~Y[4] | ~Y[7] ; assign Co = ~Y[1] | ~Y[2] | ~Y[3] | ~Y[7] ; endmodule
这道题 , 主要是需要明确输入和输出的真值表 !!!!!!!!!
仔细看,这正好仨输入俩输出 。 那这个38译码器就可以输出Y[7:0]表示哪一组输入出现了 (这时候根部不需要careABC是什么值了)。 然后构造对应的逻辑表达式。
找到 D = 1 的组合编号 , 这时候编码为 001 010 100 111(也就是输入) ,再看 ,这时候的Y的值是什么 ? ..当然这时候Y=1的值很多 , 所以这时候我选择一个最少的 然后对它取反 ~
大概思路就是这样 ,需要找规律~