第一部分:组合逻辑电路
题目


1,Verilog源代码描述
//优先编码器电路1
//电路的优先顺序是,从9到1,高级到低级
//9个输入端:I端,4个输出端:Y端,低电平有效。
//输入端从9到1有效输入,输出端从9到1进行输出
module encoder_0(
input [8:0] I_n;
output reg [3:0] Y_n
);
always@(*) begin
casez(I_n)
//case语句的其他两种形式,即casex和casez,这用来处理比较过程中的不必考虑的情况
//casez语句用来处理不考虑高阻值z的比较过程,即状态z在case语句中不会被视为正常的z状态
//casex语句则将高阻值和不定值都视为不必关心的情况
//所谓不必关心的情况,即在表达式进行比较时,不降该位的状态考虑在内。
//这样,在case语句表达式进行比较时,就可灵活设置对信号的某些位进行比较
9'b1_1111_1111:Y_n=4'b1111;
9'b0_????_????:Y_n=4'b0110; //其中?,被视为高阻状态,casez中视为不必考虑的状态
9'b1_0???_????:Y_n=4'b0111;
9'b1_10??_????:Y_n=4'b1000;
9'b1_110?_????:Y_n=4'b1001;
9'b1_1110_????:Y_n=4'b1010;
9'b1_1111_0???:Y_n=4'b1011;
9'b1_1111_10??:Y_n=4'b1100;
9'b1_1111_110?:Y_n=4'b1101;
9'b1_1111_1110:Y_n=4'b1110;
default:Y_n=4'b0000;
endcase
end
endmodule
//备注:关于case,casez和casex的用法,简单地说,三者可以综合。
//case进行全等匹配,casez忽略?或z对应的位进行匹配,case忽略z、?或z对应的位进行匹配
2,电路原理图

第二部分:时序逻辑电路
一、为了生成时序波形图,额外再加了同步时钟和异步复位信号
1,源代码
`timescale 1ns / 1ps
//同步时序电路
//优先编码器电路1
//电路的优先顺序是,从9到1,高级到低级
//9个输入端:I端,4个输出端:Y端,低电平有效。
//输入端从9到1有效输入,输出端从9到1进行输出
module encoder_0(
input [8:0] I_n,
output reg [3:0] Y_n,
input rst,
input clk
);
always@(posedge rst or posedge clk) begin
if(rst)begin
Y_n=4'b0000;
end
else begin
casez(I_n)
//case语句的其他两种形式,即casex和casez,这用来处理比较过程中的不必考虑的情况
//casez语句用来处理不考虑高阻值z的比较过程,即状态z在case语句中不会被视为正常的z状态
//casex语句则将高阻值和不定值都视为不必关心的情况
//所谓不必关心的情况,即在表达式进行比较时,不降该位的状态考虑在内。
//这样,在case语句表达式进行比较时,就可灵活设置对信号的某些位进行比较
9'b1_1111_1111:Y_n=4'b1111;
9'b0_1111_1111:Y_n=4'b0110; //其中?,被视为高阻状态,casez中视为不必考虑的状态
//为了在测试端进行测试,将9'b1_????_????:Y_n=4'b0110;改为9'b0_1111_1111:Y_n=4'b0110;
9'b1_0???_????:Y_n=4'b0111;
9'b1_10??_????:Y_n=4'b1000;
9'b1_110?_????:Y_n=4'b1001;
9'b1_1110_????:Y_n=4'b1010;
9'b1_1111_0???:Y_n=4'b1011;
9'b1_1111_10??:Y_n=4'b1100;
9'b1_1111_110?:Y_n=4'b1101;
9'b1_1111_1110:Y_n=4'b1110;
default:Y_n=4'b0000;
endcase
end
end
endmodule
//备注:关于case,casez和casex的用法,简单地说,三者可以综合。
//case进行全等匹配,casez忽略?或z对应的位进行匹配,case忽略z、?或z对应的位进行匹配
2,测试代码
//测试文件tb
/测试文件tb
`timescale 1ns / 1ps
module tb_encoder_0;
reg [8:0] I_n;
reg rst;
reg clk;
wire [3:0] Y_n;
initial begin
clk=0;
#100
rst=1;
#25
rst=0;
#20
I_n = 9'b0_1111_1111;//这里按照优先编码器的逻辑生成一个时序信号1001,进行验证!
end
always #10 clk=~clk;
encoder_0 ut(
.I_n(I_n),
.Y_n(Y_n),
.rst(rst),
.clk(clk)
);
endmodule
3,时序波形图,这里验证了输出:Y_n=1001,即6。时间延迟145ns。功能没问题!

4,时序电路图
