VL114位数值比较器电路
根据题目真值表把情况全部列出来,纯体力活。
`timescale 1ns/1ns module comparator_4( input [3:0] A , input [3:0] B , output wire Y2 , //A>B output wire Y1 , //A=B output wire Y0 //A<B ); assign Y2 = (A[3]&~B[3])||((~A[3]^B[3])&&(A[2]&~B[2]))||((~A[3]^B[3])&&(~A[2]^B[2])&&(A[1]&~B[1]))||((~A[3]^B[3])&&(~A[2]^B[2])&&(~A[1]^B[1])&&A[0]&~B[0]); assign Y1 = (~A[3]^B[3])&&(~A[2]^B[2])&&(~A[1]^B[1])&&(~A[0]^B[0]); assign Y0 = (~A[3]&B[3])||((~A[3]^B[3])&&(~A[2]&B[2]))||((~A[3]^B[3])&&(~A[2]^B[2])&&~A[1]&B[1])||((~A[3]^B[3])&&(~A[2]^B[2])&&(~A[1]^B[1])&&(~A[0]&B[0])); endmodule
VL124bit超前进位加法器电路
最直接的方法:把题目给的公式直接翻译成Verilog。
`timescale 1ns/1ns module lca_4( input [3:0] A_in , input [3:0] B_in , input C_1 , output wire CO , output wire [3:0] S ); wire [3:0]G; wire [3:0]P; wire [2:0]C; assign G = A_in & B_in; assign P = A_in ^ B_in; assign S = P ^ {C,C_1}; assign {CO,C} = G | (P&{C,C_1}); endmodule
VL13优先编码器电路①
注意I1~I9的顺序。
`timescale 1ns/1ns module encoder_0( input [8:0] I_n , output reg [3:0] Y_n ); always@(*) begin casex(I_n) 9'b111_111_111:Y_n=4'b1111; 9'b0xx_xxx_xxx:Y_n=4'b0110; 9'b10x_xxx_xxx:Y_n=4'b0111; 9'b110_xxx_xxx:Y_n=4'b1000; 9'b111_0xx_xxx:Y_n=4'b1001; 9'b111_10x_xxx:Y_n=4'b1010; 9'b111_110_xxx:Y_n=4'b1011; 9'b111_111_0xx:Y_n=4'b1100; 9'b111_111_10x:Y_n=4'b1101; 9'b111_111_110:Y_n=4'b1110; default:Y_n=0; endcase end endmodule
VL14用优先编码器①实现键盘编码电路
将9-4编码器拓展成10-4编码器。因为高位优先级更高,所以高9位直接输入优先编码器,最低位等于0且其余位全部为1时,输出为0。
`timescale 1ns/1ns module encoder_0( input [8:0] I_n , output reg [3:0] Y_n ); always @(*)begin casex(I_n) 9'b111111111 : Y_n = 4'b1111; 9'b0xxxxxxxx : Y_n = 4'b0110; 9'b10xxxxxxx : Y_n = 4'b0111; 9'b110xxxxxx : Y_n = 4'b1000; 9'b1110xxxxx : Y_n = 4'b1001; 9'b11110xxxx : Y_n = 4'b1010; 9'b111110xxx : Y_n = 4'b1011; 9'b1111110xx : Y_n = 4'b1100; 9'b11111110x : Y_n = 4'b1101; 9'b111111110 : Y_n = 4'b1110; default : Y_n = 4'b1111; endcase end endmodule module key_encoder( input [9:0] S_n , output wire[3:0] L , output wire GS ); wire [3:0]Y; encoder_0 u0( .I_n(S_n[9:1]), .Y_n(Y) ); assign GS = !(Y==4'b1111&&S_n[0]); assign L = (~S_n[0]&&Y==4'b1111)?0:~Y; endmodule
VL15优先编码器Ⅰ
也是纯体力活。。。
`timescale 1ns/1ns module encoder_83( input [7:0] I , input EI , output wire [2:0] Y , output wire GS , output wire EO ); assign Y[2] = EI & (I[7] | I[6] | I[5] | I[4]); assign Y[1] = EI & (I[7] | I[6] | (~I[7]&~I[6]&~I[5]&~I[4]&I[3])|(~I[7]&~I[6]&~I[5]&~I[4]&~I[3]&I[2])); assign Y[0] = EI & (I[7] |(~I[7]&~I[6]&I[5])|(~I[7]&~I[6]&~I[5]&~I[4]&I[3])|(~I[7]&~I[6]&~I[5]&~I[4]&~I[3]&~I[2]&I[1])); assign GS = ~((~EI)|(I==0)); assign EO = (I==0); endmodule
VL16使用8线-3线优先编码器Ⅰ实现16线-4线优先编码器
这题有点意思,数电里其实学过,但是有点不太记得了。
分析可知:高位优先级更高,所以当高位有效时,低位肯定是全0,所以此时需要关断低位使能,也就是把高位编码器的EO接到低位编码器的EI。
不难看出GS代表编码器正常工作,所以可以把两个编码器的GS相或输出。
高位正常工作时,最高位为1,与此编码器输出一致,所以可以把高位编码器的GS作为最高位。
低位时两个编码器输出相或,因为两个都是8位编码器,高八位有效时也只是最高位为1,其他位行为与低位一致。
`timescale 1ns/1ns module encoder_83( input [7:0] I , input EI , output wire [2:0] Y , output wire GS , output wire EO ); assign Y[2] = EI & (I[7] | I[6] | I[5] | I[4]); assign Y[1] = EI & (I[7] | I[6] | ~I[5]&~I[4]&I[3] | ~I[5]&~I[4]&I[2]); assign Y[0] = EI & (I[7] | ~I[6]&I[5] | ~I[6]&~I[4]&I[3] | ~I[6]&~I[4]&~I[2]&I[1]); assign EO = EI&~I[7]&~I[6]&~I[5]&~I[4]&~I[3]&~I[2]&~I[1]&~I[0]; assign GS = EI&(I[7] | I[6] | I[5] | I[4] | I[3] | I[2] | I[1] | I[0]); //assign GS = EI&(| I); endmodule module encoder_164( input [15:0] A , input EI , output wire [3:0] L , output wire GS , output wire EO ); wire E; wire GS0,GS1; wire [2:0]Y0,Y1; encoder_83 u0( .I(A[15:8]), .EI(EI), .Y(Y0), .GS(GS0), .EO(E) ); encoder_83 u1( .I(A[7:0]), .EI(E), .Y(Y1), .GS(GS1), .EO(EO) ); assign L={GS0,Y0|Y1}; assign GS=GS1|GS0; endmodule
VL17用3-8译码器实现全减器
这题不难,只需要通过3-8译码器便可以实现任何三输入的组合逻辑。
`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 Y0n,Y1n,Y2n,Y3n,Y4n,Y5n,Y6n,Y7n; decoder_38 u0( .E(1), .A0(Ci), .A1(B), .A2(A), .Y0n(Y0n), .Y1n(Y1n), .Y2n(Y2n), .Y3n(Y3n), .Y4n(Y4n), .Y5n(Y5n), .Y6n(Y6n), .Y7n(Y7n) ); assign D = ~Y4n||~Y7n||~Y1n||~Y2n; assign Co = ~Y1n||~Y2n||~Y3n||~Y7n; endmodule
VL18实现3-8译码器①
`timescale 1ns/1ns module decoder_38( input E1_n , input E2_n , input E3 , input A0 , input A1 , input A2 , output wire Y0_n , output wire Y1_n , output wire Y2_n , output wire Y3_n , output wire Y4_n , output wire Y5_n , output wire Y6_n , output wire Y7_n ); assign Y0_n = (~E3||E2_n||E1_n)?1:~(~A2&&~A1&&~A0); assign Y1_n = (~E3||E2_n||E1_n)?1:~(~A2&&~A1&&A0); assign Y2_n = (~E3||E2_n||E1_n)?1:~(~A2&&A1&&~A0); assign Y3_n = (~E3||E2_n||E1_n)?1:~(~A2&&A1&&A0); assign Y4_n = (~E3||E2_n||E1_n)?1:~(A2&&~A1&&~A0); assign Y5_n = (~E3||E2_n||E1_n)?1:~(A2&&~A1&&A0); assign Y6_n = (~E3||E2_n||E1_n)?1:~(A2&&A1&&~A0); assign Y7_n = (~E3||E2_n||E1_n)?1:~(A2&&A1&&A0); endmodule
VL19使用3-8译码器①实现逻辑函数
和VL17类似。注意高低位。
`timescale 1ns/1ns module decoder_38( input E1_n , input E2_n , input E3 , input A0 , input A1 , input A2 , output wire Y0_n , output wire Y1_n , output wire Y2_n , output wire Y3_n , output wire Y4_n , output wire Y5_n , output wire Y6_n , output wire Y7_n ); wire E ; assign E = E3 & ~E2_n & ~E1_n; assign Y0_n = ~(E & ~A2 & ~A1 & ~A0); assign Y1_n = ~(E & ~A2 & ~A1 & A0); assign Y2_n = ~(E & ~A2 & A1 & ~A0); assign Y3_n = ~(E & ~A2 & A1 & A0); assign Y4_n = ~(E & A2 & ~A1 & ~A0); assign Y5_n = ~(E & A2 & ~A1 & A0); assign Y6_n = ~(E & A2 & A1 & ~A0); assign Y7_n = ~(E & A2 & A1 & A0); endmodule module decoder0( input A , input B , input C , output wire L ); wire Y0_n,Y1_n,Y2_n,Y3_n,Y4_n,Y5_n,Y6_n,Y7_n; decoder_38 u0( .E1_n(0), .E2_n(0), .E3(1), .A0(C), .A1(B), .A2(A), .Y0_n(Y0_n), .Y1_n(Y1_n), .Y2_n(Y2_n), .Y3_n(Y3_n), .Y4_n(Y4_n), .Y5_n(Y5_n), .Y6_n(Y6_n), .Y7_n(Y7_n) ); assign L = (~Y3_n||~Y1_n)||(~Y6_n||~Y7_n); endmodule
VL20数据选择器实现逻辑电路
这题可以画一个卡诺图。
用AB做数据选择,C的各种逻辑为要选择的数据。
同样注意高低位。
`timescale 1ns/1ns module data_sel( input S0 , input S1 , input D0 , input D1 , input D2 , input D3 , output wire Y ); assign Y = ~S1 & (~S0&D0 | S0&D1) | S1&(~S0&D2 | S0&D3); endmodule module sel_exp( input A , input B , input C , output wire L ); wire S0,S1,D0,D1,D2,D3; data_sel u0( .S0(B) , .S1(A) , .D0(0) , .D1(C) , .D2(~C) , .D3(1) , .Y(L) ); endmodule