首页 > 试题广场 >

优先编码器电路①

[编程题]优先编码器电路①
  • 热度指数:38612 时间限制: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   
);

    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

发表于 2022-03-24 10:54:51 回复(0)
  always @(*) begin
      casex(~I_n)
         9'b1111_1111_1:begin
            Y_n = 4'b0000;
         end
         9'b0xxx_xxxx_x:begin
            Y_n = 1001;
         end
         9'b10xx_xxxx_x:begin
            Y_n = 1000;
         end
         9'b110x_xxxx_x:begin
            Y_n = 0111;
         end
         9'b1110_xxxx_x:begin
            Y_n = 0110;
         end
         9'b1111_0xxx_x:begin
            Y_n = 0101;
         end
         9'b1111_10xx_x:begin
            Y_n = 0100;
         end
         9'b1111_110x_x:begin
            Y_n = 0011;
         end
         9'b1111_1110_x:begin
            Y_n = 0010;
         end
         9'b1111_1111_0:begin
            Y_n = 0001;
         end
      endcase
   end 
为什么I_n不取反?Y_n也是
发表于 2022-03-07 20:56:12 回复(4)
注意了!!!输入的I_n和输出的Y_n实际上在真值表里叫做I_n非和Y_n非,不然所有结果都是错的,完全反了。
发表于 2022-09-19 20:17:32 回复(1)
`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)
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)

我的想法是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)
`timescale 1ns/1ns

module testbench();
    reg[8:0] I_n;
    wire[3:0] Y_n;
    encoder_0 ecod(
        .I_n(I_n),
        .Y_n(Y_n)
    );
initial begin
    I_n=9'b0000_0000_0;
    #1 I_n=9'b1000_0000_0;
    #1 I_n=9'b1100_0000_0;
    #1 I_n=9'b1110_0000_0;
    #1 I_n=9'b1111_0000_0;
    #1 I_n=9'b1111_1000_0;
    #1 I_n=9'b1111_1100_0;
    #1 I_n=9'b1111_1110_0;
    #1 I_n=9'b1111_1111_0;
    #1 I_n=9'b1111_1111_1;
end
//end    
  initial begin
    $dumpfile("out.vcd");
    $dumpvars(0, testbench);
end  

endmodule
发表于 2022-10-12 10:14:02 回复(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 @(*)
if(~I_n[8])
Y_n = ~4'd9;
else if(~I_n[7])
Y_n = ~4'd8;
else if(~I_n[6])
Y_n = ~4'd7;
else if(~I_n[5])
Y_n = ~4'd6;
else if(~I_n[4])
Y_n = ~4'd5;
else if(~I_n[3])
Y_n = ~4'd4;
else if(~I_n[2])
Y_n = ~4'd3;
else if(~I_n[1])
Y_n = ~4'd2;
else if(~I_n[0])
Y_n = ~4'd1;
else
Y_n = ~4'd0;
endmodule
发表于 2025-03-07 15:40:20 回复(0)
`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)
`timescale 1ns/1ns

module encoder_0(
   input      [8:0]         I_n   ,
   
   output reg [3:0]         Y_n  
);
always @(*)
    Y_n = (I_n[8] == 0)?4'b0110 :
          (I_n[7] == 0)?4'b0111 :
          (I_n[6] == 0)?4'b1000 :
          (I_n[5] == 0)?4'b1001 :
          (I_n[4] == 0)?4'b1010 :
          (I_n[3] == 0)?4'b1011 :
          (I_n[2] == 0)?4'b1100 :
          (I_n[1] == 0)?4'b1101 :
          (I_n[0] == 0)?4'b1110 :
                        4'b1111;
endmodule
发表于 2024-08-06 10:38:35 回复(0)

1.题目解析:

    本体的关键在于明白case、casez和casex语句的用法
case:最普通的选择语句,不会接受高阻态和未知态,若输入存在高阻态以及未知态则无法匹配任何一个csze项
casez:在普通的case语句进了一步,可以接受高阻态(Z、?)
casex:继续进了一步,可以接收高阻态以及未知态(Z、X、?)
另外?:可以表示高阻态和未知态

2.代码

`timescale 1ns/1ns

module encoder_0(
   input      [8:0]         I_n   ,
   
   output reg [3:0]         Y_n  
);
    always@(*)
    begin
        casez(I_n)
            9'b111111111:Y_n = 4'b1111;
            9'b0????????:Y_n = 4'b0110;
            9'b10???????:Y_n = 4'b0111;
            9'b110??????:Y_n = 4'b1000;
            9'b1110?????:Y_n = 4'b1001;
            9'b11110????:Y_n = 4'b1010;
            9'b111110???:Y_n = 4'b1011;
            9'b1111110??:Y_n = 4'b1100;
            9'b11111110?:Y_n = 4'b1101;
            9'b111111110:Y_n = 4'b1110;
        endcase
    end

endmodule
`timescale 1ns/1ns

module encoder_0(
   input      [8:0]         I_n   ,
   
   output reg [3:0]         Y_n   
);
    always@(*)
    begin
        casez(I_n)
            9'b111111111:Y_n = 4'b1111;
            9'b0????????:Y_n = 4'b0110;
            9'b10???????:Y_n = 4'b0111;
            9'b110??????:Y_n = 4'b1000;
            9'b1110?????:Y_n = 4'b1001;
            9'b11110????:Y_n = 4'b1010;
            9'b111110???:Y_n = 4'b1011;
            9'b1111110??:Y_n = 4'b1100;
            9'b11111110?:Y_n = 4'b1101;
            9'b111111110:Y_n = 4'b1110;
        endcase
    end

endmodule




发表于 2024-06-04 09:31:02 回复(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

发表于 2024-03-03 17:29:12 回复(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)
    always @ (*) begin
        casez(I_n)
            9'b111_111_111: Y_n = 4'b1111;
            9'b0??_???_???: Y_n = 4'b0110;
            9'b10?_???_???: Y_n = 4'b0111;
            9'b110_???_???: Y_n = 4'b1000;
            9'b111_0??_???: Y_n = 4'b1001;
            9'b111_10?_???: Y_n = 4'b1010;
            9'b111_110_???: Y_n = 4'b1011;
            9'b111_111_0??: Y_n = 4'b1100;
            9'b111_111_10?: Y_n = 4'b1101;
            9'b111_111_110: Y_n = 4'b1110;
            default: Y_n = 4'd0;
        endcase
    end

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

module encoder_0(
   input      [8:0]         I_n   ,
   
   output     [3:0]         Y_n   
);
    // 6->15
    assign Y_n = 
      ~ I_n[8] ? 4'b0110 :
      ~ I_n[7] ? 4'b0111 :
      ~ I_n[6] ? 4'b1000 :
      ~ I_n[5] ? 4'b1001 :
      ~ I_n[4] ? 4'b1010 :
      ~ I_n[3] ? 4'b1011 :
      ~ I_n[2] ? 4'b1100 :
      ~ I_n[1] ? 4'b1101 :
      ~ I_n[0] ? 4'b1110 : 
      4'b1111; 

endmodule

发表于 2023-12-08 14:58:35 回复(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'b0110;
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

发表于 2023-10-08 10:37:01 回复(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)
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)

问题信息

难度:
32条回答 797浏览

热门推荐

通过挑战的用户

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