首页 > 试题广场 >

优先编码器电路①

[编程题]优先编码器电路①
  • 热度指数:38726 时间限制:C/C++ 5秒,其他语言10秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
下表是某优先编码器的真值表。
①请用Verilog实现此优先编码器




输入描述:
①输入描述:
input      [8:0]         I_n


输出描述:
①输出描述:
output reg [3:0]         Y_n

`timescale 1ns/1ns

module encoder_0(
   input      [8:0]         I_n   ,
   
   output reg [3:0]         Y_n   
);
//直接用case
    //casez,casex,case都可以综合,case进行全等匹配,casez忽略?或z对应的位进行匹配,casex忽略x、?或z对应的位进行匹配。
    always@(*)begin
        casex(I_n)
        9'b1_1111_1111:Y_n=4'b1111;
        9'b0_xxxx_xxxx:Y_n=4'b0110;
        9'b1_0xxx_xxxx:Y_n=4'b0111;
        9'b1_10xx_xxxx:Y_n=4'b1000;
        9'b1_110x_xxxx:Y_n=4'b1001;
        9'b1_1110_xxxx:Y_n=4'b1010;
        9'b1_1111_0xxx:Y_n=4'b1011;
        9'b1_1111_10xx:Y_n=4'b1100;
        9'b1_1111_110x:Y_n=4'b1101;
        9'b1_1111_1110:Y_n=4'b1110;
        default:Y_n=0;
        endcase
    end
endmodule

发表于 2024-08-30 15:14:58 回复(0)
用case写了,也用if-else写了,提供一种比较软件思维的想法(不好,just for fun)
`timescale 1ns/1ns

module encoder_0(
    input [8:0] I_n,
    output reg [3:0] Y_n
);
    integer i;
    reg loop_break; //a flag to do the loop break like in C++

    always @(*) begin
        Y_n = 4'b1111;
        loop_break = 0; 

        for (i = 0; i <= 8 && !loop_break; i = i + 1) begin
            if (!I_n[8 - i]) begin
                Y_n = 4'b0110 + i;
                loop_break = 1; // set the flag to true to break the loop
            end
        end
    end

endmodule


发表于 2024-01-30 07:52:09 回复(0)
`timescale 1ns/1ns

module encoder_0(
   input      [8:0]         I_n   ,
   
   output reg [3:0]         Y_n  
);

    always @(*) begin

        if(I_n[8] == 0)
            Y_n = 4'b0110;
        else if(I_n[7] == 0)
            Y_n = 4'b0111;
        else if(I_n[6] == 0)
            Y_n = 4'b1000;
        else if(I_n[5] == 0)
            Y_n = 4'b1001;
        else if(I_n[4] == 0)
            Y_n = 4'b1010;
        else if(I_n[3] == 0)
            Y_n = 4'b1011;
        else if(I_n[2] == 0)
            Y_n = 4'b1100;
        else if(I_n[1] == 0)
            Y_n = 4'b1101;
        else if(I_n[0] == 0)
            Y_n = 4'b1110;
        else
            Y_n = 4'b1111;

    end
   
endmodule
发表于 2024-01-30 06:37:07 回复(0)
`timescale 1ns/1ns

module encoder_0(
   input      [8:0]         I_n   ,
   
   output reg [3:0]         Y_n   
);

always@(*)begin
    casex(I_n)
    9'b1111_1111_1: Y_n = 4'b1111;
    9'b0xxx_xxxx_x: Y_n = 4'b0110; 
    9'b10xx_xxxx_x: Y_n = 4'b0111;
    9'b110x_xxxx_x: Y_n = 4'b1000;
    9'b1110_xxxx_x: Y_n = 4'b1001;
    9'b1111_0xxx_x: Y_n = 4'b1010;
    9'b1111_10xx_x: Y_n = 4'b1011;
    9'b1111_110x_x: Y_n = 4'b1100;
    9'b1111_1110_x: Y_n = 4'b1101;
    9'b1111_1111_0: Y_n = 4'b1110;
    default:Y_n = 4'b0000;
    endcase
end
endmodule

完全没有取反
发表于 2023-07-28 16:03:00 回复(0)

我的想法是x状态在真值表上代表的并不是不定态,而是无关项。另外,我的解法受到上一题的影响,所以选择用复杂的门级描述完成。

另外,输入、输出都是低电平有效的,所以我是把输出真值表的高电平部分作为编写表达式的起点的,所以不需要再对表达式取反。

`timescale 1ns/1ns

module encoder_0(
   input      [8:0]         I_n   ,

   output     [3:0]         Y_n   
);

assign Y_n[0] = ( I_n[0]&I_n[1]&I_n[2]&I_n[3]&I_n[4]&I_n[5]&I_n[6]&I_n[7]&I_n[8] |
                    ~I_n[7]&I_n[8] |
                    ~I_n[5]&I_n[6]&I_n[7]&I_n[8] |
                    ~I_n[3]&I_n[4]&I_n[5]&I_n[6]&I_n[7]&I_n[8] |
                    ~I_n[1]&I_n[2]&I_n[3]&I_n[4]&I_n[5]&I_n[6]&I_n[7]&I_n[8]);

assign Y_n[1] = ( I_n[0]&I_n[1]&I_n[2]&I_n[3]&I_n[4]&I_n[5]&I_n[6]&I_n[7]&I_n[8] |
                    ~I_n[8] |
                    ~I_n[7]&I_n[8] |
                    ~I_n[4]&I_n[5]&I_n[6]&I_n[7]&I_n[8] |
                    ~I_n[3]&I_n[4]&I_n[5]&I_n[6]&I_n[7]&I_n[8] |
                    ~I_n[0]&I_n[1]&I_n[2]&I_n[3]&I_n[4]&I_n[5]&I_n[6]&I_n[7]&I_n[8]);

assign Y_n[2] = ( I_n[0]&I_n[1]&I_n[2]&I_n[3]&I_n[4]&I_n[5]&I_n[6]&I_n[7]&I_n[8] |
                    ~I_n[8] |
                    ~I_n[7]&I_n[8] |
                    ~I_n[2]&I_n[3]&I_n[4]&I_n[5]&I_n[6]&I_n[7]&I_n[8] |
                    ~I_n[1]&I_n[2]&I_n[3]&I_n[4]&I_n[5]&I_n[6]&I_n[7]&I_n[8] |
                    ~I_n[0]&I_n[1]&I_n[2]&I_n[3]&I_n[4]&I_n[5]&I_n[6]&I_n[7]&I_n[8]
                    );

assign Y_n[3] = ( I_n[0]&I_n[1]&I_n[2]&I_n[3]&I_n[4]&I_n[5]&I_n[6]&I_n[7]&I_n[8] |
                    ~I_n[6]&I_n[7]&I_n[8] |
                    ~I_n[5]&I_n[6]&I_n[7]&I_n[8] |
                    ~I_n[4]&I_n[5]&I_n[6]&I_n[7]&I_n[8] |
                    ~I_n[3]&I_n[4]&I_n[5]&I_n[6]&I_n[7]&I_n[8] |
                    ~I_n[2]&I_n[3]&I_n[4]&I_n[5]&I_n[6]&I_n[7]&I_n[8] |
                    ~I_n[1]&I_n[2]&I_n[3]&I_n[4]&I_n[5]&I_n[6]&I_n[7]&I_n[8] |
                    ~I_n[0]&I_n[1]&I_n[2]&I_n[3]&I_n[4]&I_n[5]&I_n[6]&I_n[7]&I_n[8]);

endmodule

希望能够对你有所帮助。

发表于 2023-05-07 22:52:11 回复(0)
module encoder_0(
   input  wire [8:0]         I_n,
   
   output reg  [3:0]         Y_n   
);
	always@(*)begin
		if(I_n[8]==1'b0) Y_n=4'b0110;
		else if(I_n[7]==1'b0) Y_n=4'b0111;
		else if(I_n[6]==1'b0) Y_n=4'b1000;
		else if(I_n[5]==1'b0) Y_n=4'b1001;
		else if(I_n[4]==1'b0) Y_n=4'b1010;
		else if(I_n[3]==1'b0) Y_n=4'b1011;
		else if(I_n[2]==1'b0) Y_n=4'b1100;
		else if(I_n[1]==1'b0) Y_n=4'b1101;
		else if(I_n[0]==1'b0) Y_n=4'b1110;
		else Y_n=4'b1111;
	end
endmodule

发表于 2023-05-06 17:09:00 回复(0)
输出信号reg型有意义嘛
发表于 2023-03-14 20:56:21 回复(0)
module encoder_0(
   input [8:0] I_n,
   
   output reg[3:0] Y_n  
);
    always@(*)begin
        casex(I_n)
            9'b1_1111_1111: Y_n = 4'b1111;
            9'b0_????_????: Y_n = 4'b0110;
            9'b1_0???_????: Y_n = 4'b0111;
            9'b1_10??_????: Y_n = 4'b1000;
         9'b1_110?_????: Y_n = 4'b1001;
         9'b1_1110_????: Y_n = 4'b1010;
         9'b1_1111_0???: Y_n = 4'b1011;
         9'b1_1111_10??: Y_n = 4'b1100;
         9'b1_1111_110?: Y_n = 4'b1101;
         9'b1_1111_1110: Y_n = 4'b1110;
         default: Y_n = 4'b0000;
        endcase
    end
endmodule

发表于 2023-01-14 16:28:34 回复(0)
`timescale 1ns/1ns

module encoder_0(
   input      [8:0]         I_n   ,
   
   output    reg [3:0]      Y_n   
);
    
    always @ (*) begin
        case(1'b0)
            I_n[8] : Y_n  = 4'b0110;
            I_n[7] : Y_n  = 4'b0111;
            I_n[6] : Y_n  = 4'b1000;
            I_n[5] : Y_n  = 4'b1001;
            I_n[4] : Y_n  = 4'b1010;
            I_n[3] : Y_n  = 4'b1011;
            I_n[2] : Y_n  = 4'b1100;
            I_n[1] : Y_n  = 4'b1101;
            I_n[0] : Y_n  = 4'b1110;
            default : Y_n = 4'b1111;
        endcase
    end
    
endmodule

发表于 2022-09-06 07:22:00 回复(0)
`timescale 1ns/1ns

module encoder_0(
   input      [8:0]         I_n   ,
   
   output reg [3:0]         Y_n   
);
    
    always @(I_n)
        begin
            Y_n[3] = I_n[8] && I_n[7];
            Y_n[2] = I_n[6] && I_n[5] && I_n[4] && I_n[3];
            Y_n[1] = I_n[6] && I_n[5] && I_n[2] && I_n[1];
            Y_n[0] = I_n[8] && I_n[6] && I_n[4] && I_n[2] && I_n[0];
        end

endmodule
发表于 2022-09-05 10:55:26 回复(0)
`timescale 1ns/1ns

module encoder_0(
   input      [8:0]         I_n   ,
   
   output reg [3:0]         Y_n   
);
    always@(*) begin
        if (!I_n[8]) Y_n = 4'b0110;
        else if (!I_n[7]) Y_n = 4'b0111;
        else if (!I_n[6]) Y_n = 4'b1000;
        else if (!I_n[5]) Y_n = 4'b1001;
        else if (!I_n[4]) Y_n = 4'b1010;
        else if (!I_n[3]) Y_n = 4'b1011;
        else if (!I_n[2]) Y_n = 4'b1100;
        else if (!I_n[1]) Y_n = 4'b1101;
        else if (!I_n[0]) Y_n = 4'b1110;
        else Y_n = 4'b1111;
    end
endmodule
发表于 2022-08-14 17:15:54 回复(0)
`timescale 1ns/1ns

module encoder_0(
   input      [8:0]         I_n   ,
   
   output reg [3:0]         Y_n   
);
    always @(*)begin
        casez(I_n)
            9'b0: Y_n = 4'b0;
            9'b1???_????? : Y_n = 4'b1001;
            9'b01??_????? : Y_n = 4'b1000;
            9'b001?_????? : Y_n = 4'b0111;
            9'b0001_????? : Y_n = 4'b0110;
            9'b0000_1???? : Y_n = 4'b0101;
            9'b0000_01??? : Y_n = 4'b0100;
            9'b0000_001?? : Y_n = 4'b0011;
            9'b0000_0001? : Y_n = 4'b0010;
            9'b0000_00001 : Y_n = 4'b0001;
            default:        Y_n = 4'b0;
        endcase
    end

endmodule
发表于 2022-07-28 11:45:09 回复(0)

`timescale 1ns/1ns

module encoder_0(
   input      [8:0]         I_n   ,
   
   output reg [3:0]         Y_n   
);
always@(*)begin
    Y_n[3]=~((~I_n[8])|(~I_n[7]));
    Y_n[2]=~((~I_n[6])|(~I_n[5])|(~I_n[4])|(~I_n[3]));
    Y_n[1]=~((~I_n[6])|(~I_n[5])|(~I_n[2])|(~I_n[1]));
    Y_n[0]=~((~I_n[8])|(~I_n[6])|(~I_n[4])|(~I_n[2])|(~I_n[0]));
end
endmodule
发表于 2022-07-18 18:47:16 回复(0)
casex,casez使用频率低,其实还可以用case来实现:
1、将输入I_n倒叙,且取反,使得revert[8]=~I_n[0],......,revert[0]=~I_n[8]
    for(i=0; i<9; i=i+1) begin
        assign revert[i] = I_n[8 -i];  
    end
2、寻找revert[8:0]最左边的1,即I_n中最高位的0,生成position
    assign left_one[0] = revert[0];
    for(i=1; i<9; i=i+1) begin
        assign left_one[i] = revert[i] & ~(|revert[i-1:0]);
    end
3、根据left_one的position索引对应的值
always @* begin
    case(left_one)
        9'b0_0000_0001 :  Y_n = 4'd6; 
        9'b0_0000_0010 :  Y_n = 4'd7; 
        9'b0_0000_0100 :  Y_n = 4'd8; 
        9'b0_0000_1000 :  Y_n = 4'd9; 
        9'b0_0001_0000 :  Y_n = 4'd10; 
        9'b0_0010_0000 :  Y_n = 4'd11; 
        9'b0_0100_0000 :  Y_n = 4'd12; 
        9'b0_1000_0000 :  Y_n = 4'd13; 
        9'b1_0000_0000 :  Y_n = 4'd14; 
        9'b0_0000_0000 :  Y_n = 4'd15;  
        default        :  Y_n = 4'd6;
    endcase
end
发表于 2022-05-30 22:55:13 回复(0)
`timescale 1ns/1ns

module encoder_0(
   input      [8:0]         I_n   ,

   output reg [3:0]         Y_n   
);
    always @ (*) begin
        if (~I_n[8])
            Y_n = 4'b0110;
        else if (~I_n[7])
            Y_n = 4'b0111;
        else if (~I_n[6])
            Y_n = 4'b1000;
        else if (~I_n[5])
            Y_n = 4'b1001;
        else if (~I_n[4])
            Y_n = 4'b1010;
        else if (~I_n[3])
            Y_n = 4'b1011;
        else if (~I_n[2])
            Y_n = 4'b1100;
        else if (~I_n[1])
            Y_n = 4'b1101;
        else if (~I_n[0])
            Y_n = 4'b1110;
        else
            Y_n = 4'b1111;
    end

endmodule
发表于 2022-05-27 13:59:59 回复(0)

问题信息

难度:
22条回答 803浏览

热门推荐

通过挑战的用户

查看代码
优先编码器电路①