目录
VL11 4位数值比较器电路
VL12 4bit超前进位加法器电路
VL13 优先编码器电路①
VL14 用优先编码器①实现键盘编码电路
VL15 优先编码器Ⅰ
VL16 使用8线-3线优先编码器Ⅰ实现16线-4线优先编码器
VL17 用3-8译码器实现全减器
VL18 实现3-8译码器
VL19 使用3-8译码器①实现逻辑函数
VL20 数据选择器实现逻辑电路
VL21 根据状态转移表实现时序电路
VL22 根据状态转移图实现时序电路
VL23 ROM的简单实现
VL24 边沿检测
题目描述
某4位数值比较器的功能表如下。
请用Verilog语言采用门级描述方式,实现此4位数值比较器
| input | output | |||||
| A[3]B[3] | A[2]B[2] | A[1]B[1] | A[0]B[0] | Y2(A>B) | Y1(A=B) | Y0(A |
| A[3]>B[3] | x | x | x | 1 | 0 | 0 |
| A[3] | x | x | x | 0 | 0 | 1 |
| A[3]=B[3] | A[2]>B[2] | x | x | 1 | 0 | 0 |
| A[3]=B[3] | A[2] | x | x | 0 | 0 | 1 |
| A[3]=B[3] | A[2]=B[2] | A[1]>B[1] | x | 1 | 0 | 0 |
| A[3]=B[3] | A[2]=B[2] | A[1] | x | 0 | 0 | 1 |
| A[3]=B[3] | A[2]=B[2] | A[1]=B[1] | A[0]>B[0] | 1 | 0 | 0 |
| A[3]=B[3] | A[2]=B[2] | A[1]=B[1] | A[0] | 0 | 0 | 1 |
| A[3]=B[3] | A[2]=B[2] | A[1]=B[1] | A[0]=B[0] | 0 | 1 | 0 |
RTL 设计
`timescale 1ns/1nsmodule comparator_4(input [3:0] A ,input [3:0] B ,output wire Y2 , //A>Boutput wire Y1 , //A=Boutput wire Y0 //A 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 = (~Y1) & (~Y2);endmodule
testbench 设计
`timescale 1ns/1nsmodule tb_comparator_4();reg [3:0] A;
reg [3:0] B;
wire Y2;
wire Y1;
wire Y0;initial beginA <= 4'd12;B <= 4'd10;#200$finish;
endalways #10 A <= {$random} % 5'd16;
always #10 B <= {$random} % 5'd16;comparator_4 inst_comparator_4 (.A(A), .B(B), .Y2(Y2), .Y1(Y1), .Y0(Y0)
);//verdi
initial begin$fsdbDumpfile("tb_comparator_4.fsdb");$fsdbDumpvars(0);
endendmodule
仿真测试

题目描述
4bit超前进位加法器的逻辑表达式如下:

请用Verilog语言采用门级描述方式,实现此4bit超前进位加法器,接口电路如下:

输入描述
A_in [3:0]
B_in [3:0]
C_1
类型:wire
输出描述
S [3:0]
CO
类型:wire
RTL 设计
`timescale 1ns/1nsmodule 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;//第0位
assign G[0] = A_in[0] & B_in[0];
assign P[0] = A_in[0] ^ B_in[0];
assign C[0] = G[0] | (P[0] & C_1);
assign S[0] = P[0] ^ C_1;//第1位
assign G[1] = A_in[1] & B_in[1];
assign P[1] = A_in[1] ^ B_in[1];
assign C[1] = G[1] | (P[1] & C[0]);
assign S[1] = P[1] ^ C[0];//第2位
assign G[2] = A_in[2] & B_in[2];
assign P[2] = A_in[2] ^ B_in[2];
assign C[2] = G[2] | (P[2] & C[1]);
assign S[2] = P[2] ^ C[1];//第3位
assign G[3] = A_in[3] & B_in[3];
assign P[3] = A_in[3] ^ B_in[3];
assign C[3] = G[3] | (P[3] & C[2]);
assign S[3] = P[3] ^ C[2];assign CO = C[3];endmodule
testbench 设计
`timescale 1ns/1nsmodule tb_lca_4();reg [3:0] A_in;
reg [3:0] B_in;
reg C_1;
wire CO;
wire S;initial beginA_in <= 4'd12;B_in <= 4'd10;C_1 <= 1'd1;#200$finish;
endalways #10 A_in <= {$random} % 5'd16;
always #10 B_in <= {$random} % 5'd16;
always #10 C_1 <= {$random} % 2'd2;lca_4 inst_lca_4 (.A_in(A_in), .B_in(B_in), .C_1(C_1), .CO(CO), .S(S)
);//verdi
initial begin$fsdbDumpfile("tb_lca_4.fsdb");$fsdbDumpvars(0);
endendmodule
仿真测试

题目描述
下表是某优先编码器的真值表。
①请用Verilog实现此优先编码器

RTL 设计
`timescale 1ns/1nsmodule encoder_0(input [8:0] I_n,output reg [3:0] Y_n
);always @(*) begincasez(I_n)9'b111111111: beginY_n <= 4'b1111;end9'b0????????: beginY_n <= 4'b0110;end9'b10???????: beginY_n <= 4'b0111;end9'b110??????: beginY_n <= 4'b1000;end9'b1110?????: beginY_n <= 4'b1001;end9'b11110????: beginY_n <= 4'b1010;end9'b111110???: beginY_n <= 4'b1011;end9'b1111110??: beginY_n <= 4'b1100;end9'b11111110?: beginY_n <= 4'b1101;end9'b111111110: beginY_n <= 4'b1110;enddefault: beginY_n <= 4'bz;endendcase
endendmodule
testbench设计
`timescale 1ns/1nsmodule tb_encoder_0();reg [8:0] I_n;
wire [3:0] Y_n;initial beginI_n <= 9'd0;#200$finsih;
endalways #10 I_n <= {$random} % 10'd512;encoder_0 inst_encoder_0 (.I_n(I_n), .Y_n(Y_n)
);//verdi
initial begin$fsdbDumpfile("tb_encoder_0.fsdb");$fsdbDumpvars(0);
endendmodule
仿真测试

题目描述
请使用优先编码器①实现键盘编码电路,可添加并例化题目中已给出的优先编码器代码。
10个按键分别对应十进制数0-9,按键9的优先级别最高;按键悬空时,按键输出高电平,按键按下时,按键输出低电平;键盘编码电路的输出是8421BCD码。
要求:键盘编码电路要有工作状态标志,以区分没有按键按下和按键0按下两种情况。
优先编码器真值表如下图:

优先编码器代码如下:
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
endendmodule
RTL设计
`timescale 1ns/1nsmodule encoder_0(input [8:0] I_n, output reg [3:0] Y_n
);always @(*)begincasex(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 endmodulemodule key_encoder(input [9:0] S_n, output wire [3:0] L,output wire GS
);wire [3:0] L_reg;encoder_0 inst_encoder_0 (.I_n(S_n[9:1]), .Y_n(L_reg)
);assign L = ~L_reg;
assign GS = ~(&S_n);endmodule
testbench 设计
`timescale 1ns/1nsmodule tb_encoder_0();reg [9:0] S_n;
wire [3:0] L;
wire GS;initial beginS_n <= 10'b0000_0000_00;#20S_n <= 10'b1111_1111_11;#20S_n <= 10'b1111_1111_10;#20S_n <= 10'b1111_1111_01;#20S_n <= 10'b1111_1110_11;#20S_n <= 10'b1111_1101_11;#20S_n <= 10'b1111_1011_11;#20S_n <= 10'b1111_0111_11;#20S_n <= 10'b1110_1111_11;#20S_n <= 10'b1101_1111_11;#20S_n <= 10'b1011_1111_11;#20S_n <= 10'b0111_1111_11;#20S_n <= 10'b0111_1111_11;#50$finish;
endkey_encoder inst_key_encoder(.S_n (S_n),.L (L),.GS (GS));initial begin$fsdbDumpfile("tb_encoder_0.fsdb");$fsdbDumpvars(0);
endendmodule
仿真测试

题目描述
下表是8线-3线优先编码器Ⅰ的功能表。
①请根据该功能表,用Verilog实现该优先编码器Ⅰ。
| EI | I[7] | I[6] | I[5] | I[4] | I[3] | I[2] | I[1] | I[0] | Y[2] | Y[1] | Y[0] | GS | EO |
| 0 | x | x | x | x | x | x | x | x | 0 | 0 | 0 | 0 | 0 |
| 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
| 1 | 1 | x | x | x | x | x | x | x | 1 | 1 | 1 | 1 | 0 |
| 1 | 0 | 1 | x | x | x | x | x | x | 1 | 1 | 0 | 1 | 0 |
| 1 | 0 | 0 | 1 | x | x | x | x | x | 1 | 0 | 1 | 1 | 0 |
| 1 | 0 | 0 | 0 | 1 | x | x | x | x | 1 | 0 | 0 | 1 | 0 |
| 1 | 0 | 0 | 0 | 0 | 1 | x | x | x | 0 | 1 | 1 | 1 | 0 |
| 1 | 0 | 0 | 0 | 0 | 0 | 1 | x | x | 0 | 1 | 0 | 1 | 0 |
| 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | x | 0 | 0 | 1 | 1 | 0 |
| 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 0 |
RTL设计
module encoder_83(input [7:0] I ,input EI ,output wire [2:0] Y ,output wire GS ,output wire EO
);reg [2:0] Y_reg;always @(I or EI) beginif (!EI) beginY_reg = 3'b000;endelse begincasez(I)8'b00000000: beginY_reg <= 3'b000;end8'b1???????: beginY_reg <= 3'b111;end8'b01??????: beginY_reg <= 3'b110;end8'b001?????: beginY_reg <= 3'b101;end8'b0001????: beginY_reg <= 3'b100;end8'b00001???: beginY_reg <= 3'b011;end8'b000001??: beginY_reg <= 3'b010;end8'b0000001?: beginY_reg <= 3'b001;end8'b00000001: beginY_reg <= 3'b000;enddefault: beginY_reg <= 3'b000;endendcaseend
endassign Y = Y_reg;
assign GS = (EI==1'b0) ? 1'b0 : (((|I) == 1'b0) ? 1'b0 : 1'b1);
assign EO = (EI==1'b0) ? 1'b0 : (~GS);endmodule
testbench设计
`timescale 1ns/1nsmodule tb_encoder_83();reg [7:0] I;reg EI;wire [2:0] Y;wire GS;wire EO; initial beginI <= 8'd0;EI <= 1'b0;#200$finish;
end always #10 I <= {$random} % 9'd256;
always #10 EI <= {$random} % 2'd2;encoder_83 inst_encoder_83 (.I (I), .EI (EI), .Y (Y), .GS (GS), .EO (EO)
);//fsdb
initial begin$fsdbDumpfile("tb_encoder_83.fsdb");$fsdbDumpvars(0);
endendmodule
仿真测试

题目描述
②请使用2片该优先编码器Ⅰ及必要的逻辑电路实现16线-4线优先编码器。优先编码器Ⅰ的真值表和代码已给出。
可将优先编码器Ⅰ的代码添加到本题答案中,并例化。
RTL 设计
`timescale 1ns/1nsmodule 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);endmodulemodule encoder_164(input [15:0] A ,input EI ,output wire [3:0] L ,output wire GS ,output wire EO
);wire [2:0] Y0;
wire [2:0] Y1;
wire GS0;
wire GS1;
wire E0_0;
wire E0_1;encoder_83 inst_encoder_83_0 (.I(A[7:0]), .EI(EI), .Y(Y0), .GS(GS0), .EO(EO_0)
);encoder_83 inst_encoder_83_1 (.I(A[15:8]), .EI(EI), .Y(Y1), .GS(GS1), .EO(EO_1)
);assign L[3] = GS1;
assign L[2] = (L[3]==0) ? Y0[2] : Y1[2];
assign L[1] = (L[3]==0) ? Y0[1] : Y1[1];
assign L[0] = (L[3]==0) ? Y0[0] : Y1[0];assign GS = GS0 | GS1;assign EO = EO_0 & EO_1;endmodule
testbench 设计
`timescale 1ns/1nsmodule tb_encoder_164();
reg [15:0] A ;
reg EI;
wire [3:0] L ;
wire GS;
wire EO;initial beginA <= 16'd0;EI <= 1'b0;#200$finish;
endalways #10 A <= {$random} % 17'd65536;
always #10 EI <= {$random} % 2'd2;encoder_164 encoder_164_inst(.A (A ),.EI(EI),.L (L ),.GS(GS),.EO(EO));//fsdb
initial begin$fsdbDumpfile("tb_encoder_164.fsdb");$fsdbDumpvars(0);
endendmodule
仿真测试
题目描述
请使用3-8译码器和必要的逻辑门实现全减器,全减器接口图如下,A是被减数,B是减数,Ci是来自低位的借位,D是差,Co是向高位的借位。

3-8译码器代码如下,可将参考代码添加并例化到本题答案中。
RTL 设计
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 @(*)beginif(!E)beginY0n = 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 begincase({A2,A1,A0})3'b000 : beginY0n = 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 : beginY0n = 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 : beginY0n = 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 : beginY0n = 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 : beginY0n = 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 : beginY0n = 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 : beginY0n = 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 : beginY0n = 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: beginY0n = 1'b1; Y1n = 1'b1; Y2n = 1'b1; Y3n = 1'b1; Y4n = 1'b1; Y5n = 1'b1; Y6n = 1'b1; Y7n = 1'b1;endendcase end
end endmodulemodule decoder1(input A ,input B ,input Ci ,output wire D ,output wire Co
);wire Y0,Y1,Y2,Y3,Y4,Y5,Y6,Y7;decoder_38 inst(1'b1,Ci,B,A,Y0,Y1,Y2,Y3,Y4,Y5,Y6,Y7);assign D = ~(Y1 & Y2 & Y4 & Y7);
assign Co = ~(Y1 & Y2 & Y3 & Y7);endmodule
testbench 设计
`timescale 1ns/1nsmodule tb_decoder_38();reg A;reg B;reg Ci;wire D;wire Co;initial beginA <= 1'd0;B <= 1'd0;Ci <= 1'd0;#200$finish;
endalways #10 A <= {$random} % 2'd2;
always #10 B <= {$random} % 2'd2;
always #10 Ci <= {$random} % 2'd2;decoder_38 decoder_38_inst(.A(A),.B(B),.Ci(Ci),.D(D),.Co(Co));//fsdb
initial begin$fsdbDumpfile("tb_decoder_38.fsdb");$fsdbDumpvars(0);
endendmodule
仿真测试

题目描述
下表是74HC138译码器的功能表。
| E3 | E2_n | E1_n | A2 | A1 | A0 | Y0_n | Y1_n | Y2_n | Y3_n | Y4_n | Y5_n | Y6_n | Y7_n |
| x | 1 | x | x | x | x | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
| x | x | 1 | x | x | x | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
| 0 | x | x | x | x | x | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
| 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
| 1 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 |
| 1 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 1 |
| 1 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 1 |
| 1 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 1 |
| 1 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 1 |
| 1 | 0 | 0 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 |
| 1 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 |
①请用基础门电路实现该译码器电路,用Verilog将电路描述出来。基础门电路包括:非门、多输入与门、多输入或门。
RTL 设计
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 | A2 | A1 | A0)));
assign Y1_n = ~(E3 & A0 & (~(E2_n | E1_n | A2 | A1)));
assign Y2_n = ~(E3 & A1 & (~(E2_n | E1_n | A2 | A0)));
assign Y3_n = ~(E3 & A1 & A0 & (~(E2_n | E1_n | A2)));
assign Y4_n = ~(E3 & A2 & (~(E2_n | E1_n | A1 | A0)));
assign Y5_n = ~(E3 & A2 & A0 & (~(E2_n | E1_n | A1)));
assign Y6_n = ~(E3 & A2 & A1 & (~(E2_n | E1_n | A0)));
assign Y7_n = ~(E3 & A2 & A1 & A0 & (~(E2_n | E1_n)));endmodule
testbench 设计
`timescale 1ns/1nsmodule tb_decoder_38();reg E1_n;
reg E2_n;
reg E3;
reg A0;
reg A1;
reg A2;
wire Y0_n;
wire Y1_n;
wire Y2_n;
wire Y3_n;
wire Y4_n;
wire Y5_n;
wire Y6_n;
wire Y7_n;initial beginE1_n <= 1'b0; E2_n <= 1'b0;E3 <= 1'b0;A0 <= 1'b0;A1 <= 1'b0;A2 <= 1'b0;#200$finish;
endalways #10 E1_n <= {$random} % 2'd2;
always #10 E2_n <= {$random} % 2'd2;
always #10 E3 <= {$random} % 2'd2;
always #10 A0 <= {$random} % 2'd2;
always #10 A1 <= {$random} % 2'd2;
always #10 A2 <= {$random} % 2'd2;decoder_38 inst_decoder_38 (.E1_n (E1_n),.E2_n (E2_n),.E3 (E3),.A0 (A0),.A1 (A1),.A2 (A2),.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)
);//fsdb
initial begin$fsdbDumpfile("tb_decoder_38.fsdb");$fsdbDumpvars(0);
endendmodule
仿真测试

题目描述
下表是74HC138译码器的功能表.
| E3 | E2_n | E1_n | A2 | A1 | A0 | Y0_n | Y1_n | Y2_n | Y3_n | Y4_n | Y5_n | Y6_n | Y7_n |
| x | 1 | x | x | x | x | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
| x | x | 1 | x | x | x | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
| 0 | x | x | x | x | x | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
| 1 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
| 1 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 |
| 1 | 0 | 0 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 1 |
| 1 | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 1 | 1 |
| 1 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 1 | 1 | 1 |
| 1 | 0 | 0 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 | 1 |
| 1 | 0 | 0 | 1 | 1 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 0 | 1 |
| 1 | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 1 | 0 |
②请使用3-8译码器①和必要的逻辑门实现函数L=(~A)·C+A·B
RTL 设计
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);endmodulemodule 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 inst_decoder_38(.E1_n (0),.E2_n (0),.E3 (1),.A0 (A),.A1 (B),.A2 (C),.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 | ~Y4_n | ~Y6_n | ~Y7_n;endmodule
testbench 设计
`timescale 1ns/1nsmodule tb_decoder0();reg A;
reg B;
reg C;
wire L;initial beginA <= 1'b1;B <= 1'b1;C <= 1'b1;#200$finish;
endalways #10 A <= {$random} % 2'd2;
always #10 B <= {$random} % 2'd2;
always #10 C <= {$random} % 2'd2;decoder0 decoder0_inst(.A (A),.B (B),.C (C),.L (L));//fsdb
initial begin$fsdbDumpfile("tb_decoder0.fsdb");$fsdbDumpvars(0);
endendmodule
仿真测试

题目描述
请使用此4选1数据选择器和必要的逻辑门实现下列表达式。
L=A∙B+A∙~C+B∙C
数据选择器的逻辑符号如下图:

数据选择器代码如下,可在本题答案中添加并例化此数据选择器。
RTL 设计
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);endmodulemodule sel_exp(input A ,input B ,input C ,output wire L
);data_sel luoji(.S1(A),.S0(B),.D0(1'b0),.D1(C),.D2(~C),.D3(1'b1),.Y(L));
endmodule
testbench 设计
`timescale 1ns/1nsmodule tb_sel_exp();reg A;reg B;reg C;wire L;initial beginA <= 1'b0;B <= 1'b0;C <= 1'b0;#200$finish;
endalways #10 A <= {$random} % 2'd2;
always #10 B <= {$random} % 2'd2;
always #10 C <= {$random} % 2'd2;sel_exp sel_exp_inst(.A (A),.B (B),.C (C),.L (L) );//fsdb
initial begin$fsdbDumpfile("tb_sel_exp.fsdb");$fsdbDumpvars(0);
endendmodule
题目描述
某同步时序电路转换表如下,请使用D触发器和必要的逻辑门实现此同步时序电路,用Verilog语言描述。

电路的接口如下图所示。

RTL 设计
`timescale 1ns/1nsmodule seq_circuit(input clk,input rst_n,input A,output wire Y
);reg [1:0] state;
reg [1:0] next_state;
reg Y_reg;//状态机第一段,状态跳转,时序逻辑
always @(posedge clk or negedge rst_n) beginif (!rst_n) beginstate <= 2'b00;endelse beginstate <= next_state;end
end//状态机第二段,转移条件,组合逻辑
always @(*) beginnext_state = state;case(state)2'b00: beginif (A == 1'b1) beginnext_state <= 2'b11;endelse beginnext_state <= 2'b01;endend2'b01: beginif (A == 1'b1) beginnext_state <= 2'b00;endelse beginnext_state <= 2'b10;endend2'b10: beginif (A == 1'b1) beginnext_state <= 2'b01;endelse beginnext_state <= 2'b11;endend2'b11: beginif (A == 1'b1) beginnext_state <= 2'b10;endelse beginnext_state <= 2'b00;endenddefault: beginnext_state <= 2'b00;endendcase
end//状态机第三段,结果输出,时序逻辑
always @(posedge clk or negedge rst_n) beginif (!rst_n) beginY_reg <= 1'b0;endelse if (next_state == 2'b11) beginY_reg <= 1'b1;endelse beginY_reg <= 1'b0;end
endassign Y = Y_reg;endmodule
testbench 设计
`timescale 1ns/1nsmodule tb_seq_circuit();reg clk;reg rst_n;reg A;wire y;initial beginclk = 1'b1;rst_n <= 1'b0;#20rst_n <= 1'b1;#200$finish;
end always #5 clk = ~clk;
always #10 A <= {$random} % 2'd2;seq_circuit inst_seq (.clk(clk), .rst_n(rst_n), .A(A), .Y(Y)
);//fsdb
initial begin$fsdbDumpfile("tb_seq_circuit.fsdb");$fsdbDumpvars(0);$fsdbDumpMDA();
endendmodule
仿真测试

题目描述
某同步时序电路的状态转换图如下,→上表示“C/Y”,圆圈内为现态,→指向次态。
请使用D触发器和必要的逻辑门实现此同步时序电路,用Verilog语言描述。

电路的接口如下图所示,C是单bit数据输入端。

RTL 设计
module seq_circuit(input C,input clk,input rst_n, output Y
);parameter S0 = 2'b00;
parameter S1 = 2'b01;
parameter S2 = 2'b10;
parameter S3 = 2'b11;reg [1:0] state;
reg [1:0] next_state;//状态机第一段,状态跳转,时序逻辑
always @(posedge clk or negedge rst_n) beginif (!rst_n) beginstate <= S0;endelse beginstate <= next_state;end
end//状态机第二段,条件转移,组合逻辑
always @(*) beginnext_state = state;case(state)S0: beginif (C) beginnext_state = S1;endelse beginnext_state = S0;endendS1: beginif (C) beginnext_state = S1;endelse beginnext_state = S3;endendS2: beginif (C) beginnext_state = S2;endelse beginnext_state = S0;endendS3: beginif (C) beginnext_state = S2;endelse beginnext_state = S3;endenddefault: beginnext_state = S0;endendcase
end//状态机第三段,结果输出,组合逻辑
assign Y = ((state==S2) && (C == 1'b1)) || (state == S3);endmodule
testbench 设计
`timescale 1ns/1nsmodule tb_seq_circuit();reg C;
reg clk;
reg rst_n;
wire Y;initial beginclk = 1'b1;rst_n = 1'b0;#20rst_n = 1'b1;#200$finish;
endalways #5 clk = ~clk;
always #10 C <= {$random} % 2'd2;seq_circuit inst_seq (.C (C), .clk (clk), .rst_n (rst_n), .Y (Y)
);initial begin$fsdbDumpfile("tb_seq_circuit.fsdb");$fsdbDumpvars(0);$fsdbDumpMDA ();
endendmodule
题目描述
实现一个深度为8,位宽为4bit的ROM,数据初始化为0,2,4,6,8,10,12,14。可以通过输入地址addr,输出相应的数据data。
接口信号图如下:

使用Verilog HDL实现以上功能并编写testbench验证。
RTL 设计
module rom(input clk,input rst_n,input [7:0] addr,output [3:0] data
);reg [3:0] rom [7:0];
reg [3:0] data_reg;integer i;
initial beginfor (i=0;i<8;i=i+1) beginrom[i] = i*2;end
endalways @(*) beginif (!rst_n) begindata_reg <= 4'd0;endelse begindata_reg <= rom[addr];end
endassign data = data_reg;endmodule
testbench 设计
`timescale 1ns/1nsmodule tb_rom();reg clk;
reg rst_n;
reg [7:0] addr;
wire [3:0] data; initial beginclk = 1'b1;rst_n <= 1'b0;#20rst_n <= 1'b1;#200$finish;
endalways #5 clk = ~clk;
always #10 addr <= {$random} % 4'd8;rom inst_rom (.clk (clk), .rst_n (rst_n), .addr (addr), .data (data)
);//fsdb
initial begin$fsdbDumpfile("tb_rom.fsdb");$fsdbDumpvars(0);$fsdbDumpMDA();
endendmodule
题目描述
有一个缓慢变化的1bit信号a,编写一个程序检测a信号的上升沿给出指示信号rise,当a信号出现下降沿时给出指示信号down。
注:rise,down应为单脉冲信号,在相应边沿出现时的下一个时钟为高,之后恢复到0,一直到再一次出现相应的边沿。

使用Verilog HDL实现以上功能并编写testbench验证。
RTL 设计
module edge_detect(input clk,input rst_n,input a,output reg rise,output reg down
);reg a_reg;
wire pulse;always @(posedge clk or negedge rst_n) beginif (!rst_n) begina_reg <= 1'b0;endelse begina_reg <= a;end
endassign pulse = a ^ a_reg;always @(posedge clk or negedge rst_n) beginif (!rst_n) beginrise <= 1'b0;down <= 1'b0;endelse if (pulse && a) beginrise <= 1'b1;endelse if (pulse && ~a) begindown <= 1'b1;endelse beginrise <= 1'b0;down <= 1'b0; end
endendmodule
testbench 设计
`timescale 1ns/1nsmodule tb_edge_detect();
reg clk ;
reg rst_n;
reg a ;
wire rise ;
wire down ;initial beginclk = 1'b1;rst_n <= 1'b0;a <= 1'b0;#20rst_n <= 1'b1;#20a <= 1'b1;#20a <= 1'b0;#30a <= 1'b1;#40a <= 1'b0;#20a <= 1'b1;#20a <= 1'b0; #20$finish;
endalways #5 clk = ~clk;edge_detect inst_edge_detect (.clk (clk), .rst_n (rst_n), .a (a), .rise (rise), .down (down)
);//fsdb
initial begin$fsdbDumpfile("tb_edge_detect.fsdb");$fsdbDumpvars(0);$fsdbDumpMDA();
endendmodule