【Verilog学习日常】—牛客网刷题—Verilog快速入门—VL11
4位数值比较器电路
描述
某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<B) |
A[3]>B[3] | x | x | x | 1 | 0 | 0 |
A[3]<B[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]<B[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]<B[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]<B[0] | 0 | 0 | 1 |
A[3]=B[3] | A[2]=B[2] | A[1]=B[1] | A[0]=B[0] | 0 | 1 | 0 |
输入描述:
input [3:0] A ,
input [3:0] B
输出描述:
output wire Y2 , //A>B
output wire Y1 , //A=B
output wire Y0 //A<B
解题思路:
方法一:使用always控制语句加上逻辑判断(if条件分支语句)
使用文本语言描述上述功能表:
如果输入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],则输出Y2Y1Y0 = 100
如果输入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],则输出Y2Y1Y0 =001
如果输入A[3]=B[3]且A[2]=B[2]且A[1]=B[1]且A[0]=B[0],则输出Y2Y1Y0 =010
`timescale 1ns/1ns
module comparator_4(
input [3:0] A ,
input [3:0] B ,
output wireY2 , //A>B
output wire Y1 , //A=B
output wire Y0 //A<B
);
reg Y0_r, Y1_r, Y2_r;
always @(A or B) begin
Y0_r = 1'b0; //该处代码必添加
Y1_r = 1'b0;
Y2_r = 1'b0;
if ((A[3]>B[3]) || (A[3]==B[3] && A[2]>B[2]) ||
(A[3:2]==B[3:2] && A[1]>B[1]) || (A[3:1]==B[3:1] && A[0]>B[0]))
//if(A > B)
Y2_r = 1'b1;
else if ((A[3]<B[3]) || (A[3]==B[3] && A[2]<B[2]) ||
(A[3:2]==B[3:2] && A[1]<B[1]) || (A[3:1]==B[3:1] && A[0]<B[0]))
//else if (A < B)
Y0_r = 1'b1;
else
Y1_r = 1'b1;
end
assign Y2 = Y2_r;
assign Y1 = Y1_r;
assign Y0 = Y0_r;
endmodule
方法二:使用门级建模的方式
门级语言的设计需要用到卡诺图,与用编程语言相比更为复杂。但在某些实际问题中(条件的判断关系不明确),不方便用常用的流程控制语句书写代码,这个时候门级设计的优势便得以体现。
①根据上述功能表,分别写出Y2,Y1,Y0的逻辑函数式;
例:当A[3]>B[3]时,如果逻辑函数表示为A[3]·(~B[3]),即只有A[3] = 1, B[3] = 0一种情况;
当A[2] = B[2]时,使用逻辑函数表示为(~A[2])·(~B[2])+A2B2,即表示两种情况:A[2],B[2]同时为0或A[2],B[2]同时为1; 可使用同或门 ——xnor
代码如下:
`timescale 1ns/1ns
module comparator_4(
input [3:0] A ,
input [3:0] B ,
output wireY2 , //A>B
output wire Y1 , //A=B
output wire Y0 //A<B
);
//代码二 使用门级建模
wire w1, w2, w3, w4, w5,w6,w7,w8,w9,w10;
wire x1, x2, x3, x4, x5,x6,x7,x8;
anda1 (w1, A[3], ~B[3]); //判定A[3]>B[3], Y2的第1项
anda2 (w2, A[2], ~B[2]);
anda3 (w3, A[1], ~B[1]);
anda4 (w4, A[0], ~B[0]);
xnor xn1 (w5, A[3], B[3]); //A[3]=B[3]
and a5 (w6, w5, w2); //Y2的第2项
xnor xn2 (w7, A[2], B[2]);
and a6 (w8, w5,w7,w3); //Y2的第3项
xnor xn3 (w9, A[1], B[1]);
and a7 (w10, w5, w7, w9, w4); //Y2的第4项
or o1 (Y2, w1,w6,w8,w10); //Y2
//
andaa1 (x1, ~A[3], B[3]);
andaa2 (x2, ~A[2], B[2]);
andaa3 (x3, ~A[1], B[1]);
andaa4 (x4, ~A[0], B[0]);
and aa5 (x5, w5, x2); //Y0的第2项
and aa6 (x6, w5, w7, x3); //Y0的第3项
and aa7 (x7, w5, w7, w9, x4); //Y0的第4项
or o2 (Y0, x1, x5, x6, x7); //Y0
//
xnor xn4 (x8, A[0], B[0]);
and aa8 (Y1, w5, w7, w9, x8);
endmodule
原文地址:https://blog.csdn.net/qq_44629558/article/details/142150886
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!