数字电路基础知识——组合逻辑电路(译码器的设计、BCD译码器、3-8译码器)

数字电路基础知识——组合逻辑电路
数字电路中有很多基本常用的组合逻辑电路,如编码器、译码器、数据选择器、加法器、比较器。
本次主要介绍译码器、数据选择器。加法器参考:数字电路基础知识(四) 加法器-半加器、全加器与超前进位加法器

并用Verilog语言设计简单的组合逻辑电路,如2-4译码器、BCD译码器。
使用Verilog语言设计一个简单的组合逻辑电路(2-4译码器)
设计BCD译码器,输入0~9。采用Verilog描述并画出门级电路图。(4线-10线译码器)

一、译码器

译码器:将输入的二进制码译成对应的输出高、低电平信号
比较常见的译码器有二进制译码器、二——十进制译码器、显示译码器等

  1. 二进制译码器(3线-8线译码器)
    数字电路基础知识——组合逻辑电路(译码器的设计、BCD译码器、3-8译码器)_第1张图片

  2. 74HC138译码器
    上面是3-8译码器的逻辑框图和真值表。3-8译码器用的最多的芯片是74HC138芯片。
    数字电路基础知识——组合逻辑电路(译码器的设计、BCD译码器、3-8译码器)_第2张图片
    其有三个控制端S1-3,当 S1=1,S2+S3=0 时,Gs的输出为高电平,译码器处于工作状态。

  3. 使用Verilog语言设计一个简单的组合逻辑电路(2-4译码器)
    1)使用case语句状态机设计:

module decode_2_4(
input [1:0] data_i,
input en_i,
output [3:0] data_o
    );

reg [3:0] decode_o    
always @(*)
begin
        if (en_i == 1'b1)begin
            decode_o = 4'b1111;
        end
        else begin
            case(data_i)
                2'b00:
                        decode_o = 4'b1110;
                2'b01:
                        decode_o = 4'b1101;
                2'b10:
                        decode_o = 4'b1011;
                2'b11:
                        decode_o = 4'b0111;
                default:
                        decode_o = 4'b1111;
            endcase
        end
end
assign data_o = decode_o;
endmodule

RTL电路图:
数字电路基础知识——组合逻辑电路(译码器的设计、BCD译码器、3-8译码器)_第3张图片
2)使用assign语句设计

module decode_2_4(
input [1:0] data_i,
input en_i,
output [3:0] decode_o
    );
//assign description

assign decode_o[0] = ~(~data_i[0] & ~data_i[1] & ~en_i);
assign decode_o[1] = ~(~data_i[0] & data_i[1] & ~en_i);
assign decode_o[2] = ~(data_i[0] & ~data_i[1] & ~en_i);
assign decode_o[3] = ~(data_i[0] & data_i[1] & ~en_i);

endmodule

RTL电路图(左图):
数字电路基础知识——组合逻辑电路(译码器的设计、BCD译码器、3-8译码器)_第4张图片
需要注意的是,在使用Verilog语句设计组合逻辑电路时(coding style的问题),尽量选择使用assign语句来代替always语句块。尤其是对于if-else语句来说使用 assign = ? : 条件选择语句设计出来的电路会更优,因为if-else语句可能会向下一级传播不定态。 造成逻辑电路错误。

  1. 设计BCD译码器,输入0~9。采用Verilog描述并画出门级电路图。(4线-10线译码器)
module Decode_4_10(
    input   [3:0]   indata,
    //output reg [9:0]   outdata
    output   [9:0]   outdata
    );
/*
always @(*)begin
    case(indata)
    4'b0000: outdata = 10'b1111_1111_10;
    4'b0001: outdata = 10'b1111_1111_01;
    4'b0010: outdata = 10'b1111_1110_11;
    4'b0011: outdata = 10'b1111_1101_11;
    4'b0100: outdata = 10'b1111_1011_11;
    4'b0101: outdata = 10'b1111_0111_11;
    4'b0110: outdata = 10'b1110_1111_11;
    4'b0111: outdata = 10'b1101_1111_11;
    4'b1000: outdata = 10'b1011_1111_11;
    4'b1001: outdata = 10'b0111_1111_11;
    default: outdata = 10'b1111_1111_11;
    endcase
end

*/
//assign description
assign outdata[0] = ~(~indata[3] & ~indata[2] & ~indata[1] & ~indata[0]);
assign outdata[1] = ~(~indata[3] & ~indata[2] & ~indata[1] & indata[0]);
assign outdata[2] = ~(~indata[3] & ~indata[2] & indata[1]  & ~indata[0]);
assign outdata[3] = ~(~indata[3] & ~indata[2] & indata[1]  & indata[0]);
assign outdata[4] = ~(~indata[3] & indata[2]  & ~indata[1] & ~indata[0]);
assign outdata[5] = ~(~indata[3] & indata[2]  & ~indata[1] & indata[0]);
assign outdata[6] = ~(~indata[3] & indata[2]  & indata[1]  & ~indata[0]);
assign outdata[7] = ~(~indata[3] & indata[2]  & indata[1]  & indata[0]);
assign outdata[8] = ~(indata[3]  & ~indata[2] & ~indata[1] & ~indata[0]);
assign outdata[9] = ~(indata[3]  & ~indata[2] & ~indata[1] & indata[0]);

endmodule

你可能感兴趣的:(数字电路基础,数字IC设计-FPGA,Verilog语言)