FPGA project :4 - 2 priority encoder

本文介绍了一个优先级编码器的设计,使用Verilog语言实现,包括上升顺序的输入映射和两种不同的数据输出方式。测试bench用于验证模块功能,展示了如何在Verilog中使用assign和always@*语句进行编码逻辑的编程。

Design source code : 

 

// 4 - 2  priority encoder

// The priorities are in descending order :

// data_ina >> data_inb >> data_inc >> data_ind

// "data_out" is coded output.

// "s" is coded input or not.

module priority_encoder (

    input   wire                data_ina ,

    input   wire                data_inb ,

    input   wire                data_inc ,

    input   wire                data_ind ,

    output  wire    [01:00]     data_out ,

    output  wire                s

);

    assign { s, data_out } = ( data_ina == 1'b1 ) ? 3'b011 : ( data_inb == 1'b1 ) ? 3'b010 : ( data_inc == 1'b1 ) ? 3'b001 : ( data_ind == 1'b1 ) ? 3'b000 : 3'b100 ;

endmodule

testbench:

`timescale 1ns/1ns

module test();

    reg                 data_ina ;

    reg                 data_inb ;

    reg                 data_inc ;

    reg                 data_ind ;

    wire     [01:00]    data_out ;

    wire                s        ;

    parameter           CYCLE = 20 ;

priority_encoder priority_encoder_insert (

    .data_ina           ( data_ina ) ,

    .data_inb           ( data_inb ) ,

    .data_inc           ( data_inc ) ,

    .data_ind           ( data_ind ) ,

    .data_out           ( data_out ) ,

    .s                  ( s        )

);

    initial begin

        data_ina = 1'b0 ;

        data_inb = 1'b0 ;

        data_inc = 1'b0 ;

        data_ind = 1'b0 ; // 初始化

        data_ind = 1'b1 ;

        #( CYCLE )      ;

        data_inc = 1'b1 ;

        #( CYCLE )      ;

        data_inb = 1'b1 ;

        #( CYCLE )      ;

        data_ina = 1'b1 ;

        #( CYCLE )      ;

        data_ina = 1'b0 ;

        #( CYCLE )      ;

        $stop;

    end

endmodule

simulation waveform

The second way:

module priority_encoder (

    input   wire                data_ina ,

    input   wire                data_inb ,

    input   wire                data_inc ,

    input   wire                data_ind ,

    output  reg     [01:00]     data_out ,

    output  reg                 s

);

    //assign { s, data_out } = ( data_ina == 1'b1 ) ? 3'b011 : ( data_inb == 1'b1 ) ? 3'b010 : ( data_inc == 1'b1 ) ? 3'b001 : ( data_ind == 1'b1 ) ? 3'b000 : 3'b100 ;

    always @(*) begin

        if( data_ina ) begin

            { s , data_out } = 3'b011 ;

        end else begin

            if( data_inb ) begin

                { s , data_out } = 3'b010 ;

            end else begin

                if( data_inc ) begin

                    { s , data_out } = 3'b001 ;

                end else begin

                    if( data_ind ) begin

                        { s , data_out } = 3'b000 ;

                    end else begin

                        { s , data_out } = 3'b100 ;

                    end

                end

            end

        end

    end

endmodule

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值