Verilog编程基础练习

目录

一、3-8译码器的实验与仿真

1.3-8译码器的logsim电路仿真实现

2.3-8译码器的逻辑真值表

3.3-8译码器的Verilog实现

(1)代码实现

(2)RTL的电路生成

(3)QUartus的波形图实现

(4)ModelSim的波形图实现

4.问题分析

二、全加器电路的实验与仿真

1.1-bit全加器电路的仿真实现

(1)logsim电路仿真实现

(2)Verilog的仿真实现

2.4-bit全加器电路的仿真实现

(1)logsim电路仿真实现

(2)Verilog的仿真实现

3.Verilog的行为级形式实现1-bit和4-bit全加器电路

(1)1-bit全加器电路实现

(2)4-bit全加器电路实现

4.8-bit全加器电路的Verilog仿真实现

(1)代码实现

(2)RTL电路实现


一、3-8译码器的实验与仿真

1.3-8译码器的logsim电路仿真实现

2.3-8译码器的逻辑真值表

3.3-8译码器的Verilog实现

(1)代码实现

module decoder3_8
(   
    input wire in1,
	 input wire in2,
	 input wire in3,
	 output reg [7:0] out
);

always@(*)
  
  if({in1,in2,in3}==3'b000)
     out = 8'b0000_0001;
  else if({in1,in2,in3}==3'b001)
	   out =8'b0000_0010;
  else if({in1,in2,in3}==3'b010)
	   out =8'b0000_0100;
	else if({in1,in2,in3}==3'b011)
	   out =8'b0000_1000;
	else if({in1,in2,in3}==3'b100)
	   out =8'b0001_0000;
	else if({in1,in2,in3}==3'b101)
	   out =8'b0010_0000;
	else if({in1,in2,in3}==3'b110)
	   out =8'b0100_0000;
   else if({in1,in2,in3}==3'b111)
	   out =8'b1000_0000;
	else
	out =8'b0000_0001;
	endmodule

测试代码:

`timescale 1ns/1ns
module tb_decoder3_8();
 reg in1;
 reg in2;
 reg in3;
 
 wire [7:0] out;
 
 initial begin
     in1<=1'b0;
	  in2<=1'b0;
	  in3<=1'b0;
	  end
always #10 in1 <= {$random} % 2;
always #10 in2<=($random) % 2;
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 tb_decoder3_8
(
  .in1(in1),
  .in2(in2),
  .in3(in3),
  
  .out(out)
);

endmodule

(2)RTL的电路生成

(3)QUartus的波形图实现

(4)ModelSim的波形图实现

4.问题分析

(1)Verilog 综合生成的3-8译码器电路原理图与原始设计电路存在什么差异? 仿真测试生成的结果是否与真值表一致?

所用到的电路元器件不同,并且Verilog生成的电路原理图对输出端口进行了封装,使线路更加简洁。

(2) Verilog代码设计的3-8译码器模块的输出信号 为何要定义为 reg类型而不用默认wire(导线)类型?改成wire型是否可以? (即是否可以把 output reg [7:0] out 改为 output [7:0] out) 修改后会出现什么错误?为什么会出错?

reg表示寄存器类型,用于always模块中被赋值的信号。wire类型表示导线类型,用于always模块中未被赋值的信号。而3-8译码器的输出信号是在always模块中被赋值的信号。撒野必须定义为reg类型。

不可以改成wire类型,如果把 output reg [7:0] out 改为 output [7:0] out),会出现报错。

二、全加器电路的实验与仿真

1.1-bit全加器电路的仿真实现

(1)logsim电路仿真实现

(2)Verilog的仿真实现

代码实现:

module Adder_structural(A,B,Cin,Sum,Cout);
       input A,B,Cin;
		 output Sum,Cout;
		 wire t1,t2,t3,t4;
		 and U1(t1,A,B);
		 and U2(t2,A,Cin);
		 and U3(t3,B,Cin);
		 or U4(Cout,t1,t2,t3);
		 xor U5(t4,A,B);
		 xor U6(Sum,t4,Cin);
		 endmodule

RTL电路实现

2.4-bit全加器电路的仿真实现

(1)logsim电路仿真实现

(2)Verilog的仿真实现

代码实现:

module four (
    num1,
    num2,
    cin,
    cout,
    sum
);

input   [3:0]   num1;
input   [3:0]   num2;
input           cin;
output          cout;
output  [3:0]   sum;


reg             cout;
reg     [3:0]   sum;
reg             add;
reg     [1:0]   cnt;
always @(num1 or num2 or cin)
begin

    sum[0] = (num1[0] ^ num2[0]) ^ cin;
    cout = (num1[0] & num2[0]) | (num2[0] & cin) | (num1[0] & cin);
    add = cout;

    sum[1] = (num1[1] ^ num2[1]) ^ add;
    cout = (num1[1] & num2[1]) | (num2[1] & add) | (num1[1] & add);
    add = cout;
   
    sum[2] = (num1[2] ^ num2[2]) ^ add;
    cout = (num1[2] & num2[2]) | (num2[2] & add) | (num1[2] & add);
    add = cout;

    sum[3] = (num1[3] ^ num2[3]) ^ add;
    cout = (num1[3] & num2[3]) | (num2[3] & add) | (num1[3] & add);
    add = cout;
end
endmodule

RTL电路实现

3.Verilog的行为级形式实现1-bit和4-bit全加器电路

(1)1-bit全加器电路实现

代码实现:

module Adder_dataflow(
input A,B,Cin,
output Sum,Cout
);
assign{Cout,Sum}=A+B+Cin;
endmodule

RTL电路实现:

(2)4-bit全加器电路实现

代码实现:

首先进行

1-bit全加器实现:

module add_1(a,b,ci,co,s);
	input a,b,ci;
	output co,s;
	assign{co,s}=a+b+ci;
endmodule

4-bit就是将4个1-bit全加器关联起来运用:

module fuadder4(a,b,ci,co,s);
	input [3:0] a,b;
	input ci;
	output co;
	output [3:0] s;
	wire [2:0] count;
	
	add_1 U1(a[0],b[0],ci,count[0],s[0]);
	add_1 U2(a[1],b[1],count[0],count[1],s[1]);
	add_1 U3(a[2],b[2],count[1],count[2],s[2]);
	add_1 U4(a[3],b[3],count[2],co,s[3]);
endmodule

RTL电路实现:

4.8-bit全加器电路的Verilog仿真实现

(1)代码实现

1-bit全加器:

module fulladder(Sum,Co,A,B,Ci);
	input A,B,Ci;
	output Sum,Co;
	wire 	S1,S2,S3;
		xor (Sum,A,B,Ci);//构建sum
		and (S1,A,B);
		xor (S2,A,B);
		and	(S3,Ci,S2);
		or  (Co,S1,S3);//构建co
	endmodule

8-bit全加器Verilog实现:将8个1-bit全加器关联起来

module bitfulladder(Sum,Co,A,B,Ci);
	input [7:0] A,B;
	input Ci;
	output [7:0]Sum,Co;
		fulladder	UO(Sum[0],Co[0],A[0],B[0],Ci);
		fulladder	U1(Sum[1],Co[1],A[1],B[1],Co[0]);
		fulladder 	U2(Sum[2],Co[2],A[2],B[2],Co[1]);
		fulladder	U3(Sum[3],Co[3],A[3],B[3],Co[2]);
		fulladder	U4(Sum[4],Co[4],A[4],B[4],Co[3]);
		fulladder	U5(Sum[5],Co[5],A[5],B[5],Co[4]);
		fulladder	U6(Sum[6],Co[6],A[6],B[6],Co[5]);
		fulladder	U7(Sum[7],Co[7],A[7],B[7],Co[6]);
endmodule

(2)RTL电路实现

  • 17
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值