VL11 4位数值比较器电路
根据题目真值表把情况全部列出来,纯体力活。
`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
VL12 4bit超前进位加法器电路
最直接的方法:把题目给的公式直接翻译成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