第一部分:组合逻辑电路

题目

在这里插入图片描述
在这里插入图片描述

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,时序电路图

在这里插入图片描述