Verilog基础练习

设计3-8译码器

生成RTL电路图

对3-8译码器进行仿真

设计3-8编码器
用logisim先设计一个3-8编码器
在这里插入图片描述

下图为3-8译码器的真值表
在这里插入图片描述
生成RTL电路图
在quartus中创建新项目,用Verilog生成RTL电路图

module decoder3_8
(
	input wire in1 , //输入信号 in1
	input wire in2 , //输入信号 in2
	input wire in3 , //输入信号 in3
 
	output reg [7:0] out //输出信号 out
 );
 
 //out:根据输入的 3bit in 信号选择输出对应的 8bit out 信号
always@(*)
	case({in1, in2, in3})
		3'b000 : out = 8'b0000_0001; //输入与输出的 8 种译码对应关系
		3'b001 : out = 8'b0000_0010;
		3'b010 : out = 8'b0000_0100;
		3'b011 : out = 8'b0000_1000;
		3'b100 : out = 8'b0001_0000;
		3'b101 : out = 8'b0010_0000;
		3'b110 : out = 8'b0100_0000;
		3'b111 : out = 8'b1000_0000;

		default: out = 8'b0000_0001;
	endcase
 
 endmodule

在这里插入图片描述
下面是其测试文件

`timescale 1ns/1ns

 module tb_decoder3_8();

 //reg define

 reg        in1;

 reg        in2;

 reg        in3;

 //wire     define

 wire   [7:0]   out;

 //初始化输入信号

 initial    begin

    in1 <= 1'b0;

    in2 <= 1'b0;

    in3 <= 1'b0;

 end

 //in1:产生输入随机数,模拟输入端 1 的输入情况

 always #10 in1 <= {$random} % 2;

 //in2:产生输入随机数,模拟输入端 2 的输入情况

 always #10 in2 <= {$random} % 2;

 //in3:产生输入随机数,模拟输入端 3 的输入情况

 always #10 in3 <= {$random} % 2;

 //------------------------------------------------------------

 initial begin

    $timeformat(-9, 0, "ns", 6);

    $monitor("@time %t:in1=%b in2=%b in3=%b out=%b",$time,in1,in2,in3,out);

 end

 //------------------------------------------------------------

 //-------------decoder3_8_inst----------------

 decoder3_8 decoder3_8_ins

 (

    .in1(in1), //input in1

    .in2(in2), //input in2

    .in3(in3), //input in3

    .out(out) //output [7:0] out

 );

 endmodule

** 对3-8译码器进行仿真**
下图是modelsim中生成的波形图和Transcript结果
在这里插入图片描述
Verilog代码设计的3-8译码器模块的输出信号为何要定义为reg类型而不用默认wire(导线)类型?改成wire型是否可以?(即是否可以把outputreg[7:0]out改为output[7:0]out)修改后会出现什么错误?为什么会出错?

分析:在Verilog中,reg类型表示寄存器类型,用于always模块内被赋值的信号。而wire类型表示导线类型,用于always模块内未被赋值的信号。因为3-8译码器模块的输出信号out是在always块中被赋值的,所以必须定义为reg类型。如果将output reg [7:0] out改为output [7:0] out,会出现“Multiple drivers”错误,因为wire类型的信号可以有多个驱动器,而reg类型的信号只能有一个驱动器。因此,如果将out定义为wire类型,会出现多个驱动器的情况,从而导致错误。

一位全加器和四位全加器

verilog代码

module FullAdder_gate_level (

  input A, B, Cin,

  output Sum, Cout

);

  

  wire X1, X2, X3, X4;

  // XOR gates

  assign X1 = A ^ B;

  assign X2 = X1 ^ Cin;

  // AND gates

  assign X3 = A & B;

  assign X4 = X1 & Cin;

  // OR gates

  assign Sum = X2;

  assign Cout = X3 | X4;

  

endmodule

一位全加器的RTL电路图
在这里插入图片描述
下面是logisim中设计的一位全加器
在这里插入图片描述

四位全加器
verilog代码

module FourBitAdder_gate_level (

  input [3:0] A, B, Cin,

  output [3:0] Sum, Cout

);

  

  wire C1, C2, C3;

  wire S1, S2, S3;

  FullAdder_gate_level f1 (.A(A[0]), .B(B[0]), .Cin(Cin), .Sum(S1), .Cout(C1));

  FullAdder_gate_level f2 (.A(A[1]), .B(B[1]), .Cin(C1), .Sum(S2), .Cout(C2));

  FullAdder_gate_level f3 (.A(A[2]), .B(B[2]), .Cin(C2), .Sum(S3), .Cout(C3));

  FullAdder_gate_level f4 (.A(A[3]), .B(B[3]), .Cin(C3), .Sum(Sum[3]), .Cout(Cout));

  

endmodule

  

module FullAdder_gate_level (

  input A, B, Cin,

  output Sum, Cout

);

  

  wire X1, X2, X3, X4;

  // XOR gates

  assign X1 = A ^ B;

  assign X2 = X1 ^ Cin;

  // AND gates

  assign X3 = A & B;

  assign X4 = X1 & Cin;

  // OR gates

  assign Sum = X2;

  assign Cout = X3 | X4;

  

endmodule

四位全加器的RTL电路
在这里插入图片描述
下图是在logisim中设计的四位全加器
在这里插入图片描述

8位全加器的设计

Verilog代码

module eight_bit_adder(
    input [7:0] a,
    input [7:0] b,
    input cin,
    output [7:0] sum,
    output cout
);

wire [7:0] c;

full_adder fa0(a[0], b[0], cin, sum[0], c[0]);
full_adder fa1(a[1], b[1], c[0], sum[1], c[1]);
full_adder fa2(a[2], b[2], c[1], sum[2], c[2]);
full_adder fa3(a[3], b[3], c[2], sum[3], c[3]);
full_adder fa4(a[4], b[4], c[3], sum[4], c[4]);
full_adder fa5(a[5], b[5], c[4], sum[5], c[5]);
full_adder fa6(a[6], b[6], c[5], sum[6], c[6]);
full_adder fa7(a[7], b[7], c[6], sum[7], cout);

endmodule

module full_adder(
    input a,
    input b,
    input cin,
    output sum,
    output cout
);

assign sum = a ^ b ^ cin;
assign cout = (a & b) | (a & cin) | (b & cin);

endmodule

8位全加器的RTL电路
在这里插入图片描述

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值