VL11 4位数值比较器电路
一位比较器逻辑式(列真值表推出)
F3(A>B)=AB'
F3(A<B)=A'B
F3(A=B)=AB+A'B'
二位
F2(A>B)=A2B2'+(A2B2+A2'B2')F3(A>B)
F2(A<B)=A2'B2+(A2B2+A2'B2')F3(A<B)
F2(A=B)=(A2B2+A2'B2')F3(A=B)
三位
F1(A>B)=A1B1'+(A1B1+A1'B1')F2(A>B)
F1(A<B)=A1‘B1+(A1B1+A1'B1')F2(A<B)
F1(A=B)=(A1B1+A1'B1')F2(A=B)
代码表达式就是
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];
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];
Y1=(A[3]⊙B[3]) ·(A[2]⊙B[2]) · (A[1]⊙B[1]) · (A[0]⊙B[0])
各种门的代码:
//类型 实例名 输出 输入
and a1 (OUTX, IN1, IN2) ; //与门
nand na1 (OUTX1, IN1, IN2) ; //与非门
or or1 (OUTY, IN1, IN2) ; //或门
nor nor1 (OUTY1, IN1, IN2) ; //或非门
xor xor1 (OUTZ, IN1, IN2, IN3) ; //异或门
xnor (OUTZ1, IN1, IN2) ; //同或门
not (OUTZ3, IN3) ; //非门
然后我选择相信科技的力量,开摆!
`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>B) ? 1:0;
assign Y1 = (A==B)? 1:0;
assign Y0 = (A<B) ? 1:0;
endmodule
VL12 4bit超前进位加法器电路
我对超前进位加法器的理解是:同时进行每一位的无前置工作的加法运算,只考虑前置位的进位和当前位的加法而不考虑对下一位的进位
`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 [3:0] C;
genvar i;
generate
for(i=0;i<4;i=i+1) begin
assign G[i] = A_in[i] & B_in[i];
assign P[i] = A_in[i] ^ B_in[i];
if(i == 0) begin
assign C[i] = G[i] | (P[i] & C_1);
assign S[i] = P[i] ^ C_1;
end else begin
assign C[i] = G[i] | (P[i] & C[i-1]);
assign S[i] = P[i] ^ C[i-1];
end
end
endgenerate
assign CO = C[3];
endmodule
VL13 优先编码器电路①
Verilog语言中case、casex、casez的用法和区别
case是全等匹配,casez忽略?或z对应的位进行匹配,casez忽略x、?或z对应的位进行匹配。
`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;
default : Y_n = 4'b1111;
endcase
end
endmodule
VL14 用优先编码器①实现键盘编码电路
注意取反,区分没有按键按下和按键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] L_temp;
encoder_0 encoder (S_n[9:1], L_temp);
assign GS = ~((&(~L)) & S_n[0]);
assign L = ~L_temp;
endmodule
VL15 优先编码器Ⅰ
和13题一样
`timescale 1ns/1ns
module encoder_83(
input [7:0] I ,
input EI ,
output wire [2:0] Y ,
output wire GS ,
output wire EO
);
reg [2:0] Y_1;
reg GS_1,EO_1;
always@(*) begin
casez({EI,I})
9'b0???????? : {Y_1,GS_1,EO_1} = 5'b00000;
9'b100000000 : {Y_1,GS_1,EO_1} = 5'b00001;
9'b11??????? : {Y_1,GS_1,EO_1} = 5'b11110;
9'b101?????? : {Y_1,GS_1,EO_1} = 5'b11010;
9'b1001????? : {Y_1,GS_1,EO_1} = 5'b10110;
9'b10001???? : {Y_1,GS_1,EO_1} = 5'b10010;
9'b100001??? : {Y_1,GS_1,EO_1} = 5'b01110;
9'b1000001?? : {Y_1,GS_1,EO_1} = 5'b01010;
9'b10000001? : {Y_1,GS_1,EO_1} = 5'b00110;
9'b100000001 : {Y_1,GS_1,EO_1} = 5'b00010;
default {Y_1,GS_1,EO_1} = 5'b00000;
endcase
end
assign Y = Y_1;
assign GS = GS_1;
assign EO = EO_1;
endmodule
16-20题都是数电知识,照书连线就行,咕了。