Verilog编程基础练习

这篇具有很好参考价值的文章主要介绍了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电路仿真实现

Verilog编程基础练习,fpga开发

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

Verilog编程基础练习,fpga开发

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的电路生成

Verilog编程基础练习,fpga开发

(3)QUartus的波形图实现

Verilog编程基础练习,fpga开发

(4)ModelSim的波形图实现

Verilog编程基础练习,fpga开发

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电路仿真实现

Verilog编程基础练习,fpga开发

(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电路实现

Verilog编程基础练习,fpga开发

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

(1)logsim电路仿真实现

Verilog编程基础练习,fpga开发

(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电路实现

Verilog编程基础练习,fpga开发

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电路实现:

Verilog编程基础练习,fpga开发

(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电路实现:

Verilog编程基础练习,fpga开发

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电路实现

Verilog编程基础练习,fpga开发文章来源地址https://www.toymoban.com/news/detail-761611.html

到了这里,关于Verilog编程基础练习的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【FPGA Verilog开发实战指南】初识Verilog HDL-基础语法

    就是用代码来描述硬件结构 语言有VHDL与Verilog HDL Verilog HDL 是从C语言来的,学的快 ###例子 也叫保留字,一般是小写 module 表示模块的开始 endmodule 模块的结束 模块名 一般与.v文件的名字一致 输入信号 input 输出信号 output 既做输入也做输出 inout 需要一些变量和参数对输

    2024年02月21日
    浏览(45)
  • Verilog编程:位数值比较器 FPGA

    Verilog编程:位数值比较器 FPGA 在FPGA(现场可编程门阵列)的数字电路设计中,位数值比较器是一个重要的组件。位数值比较器用于比较两个二进制值的大小,并输出比较的结果。本文将介绍如何使用Verilog编程语言实现一个简单的位数值比较器,并演示相应的源代码。 首先,

    2024年04月14日
    浏览(37)
  • Verilog 编程实现 3-8 译码器 FPGA

    Verilog 编程实现 3-8 译码器 FPGA FPGA 是一种可重构的数字电路芯片,可用于实现各种逻辑电路。在 FPGA 中,我们可以使用 Verilog HDL(硬件描述语言)来编写数字电路设计。本篇文章将为您介绍如何使用 Verilog 实现基本的数字电路,即 3-8 译码器。 3-8 译码器是一种常用的数字电路

    2024年02月07日
    浏览(44)
  • Verilog编程:8线-3线优先编码器FPGA

    Verilog编程:8线-3线优先编码器FPGA 基于FPGA的数字电路设计是当前领域中的关键技术之一,因为这种设计具有高速、可编程、可重构等优点。在数字电路设计中,编码器是常见的模块,尤其是8线-3线优先编码器,可以实现将八个输入信号中最先出现的一个编码输出到三位二进制

    2024年02月08日
    浏览(44)
  • 【FPGA】Verilog编程实现SDRAM读写(一) ----- 初识SDRAM

    SDRAM(Synchronous Dynamic Random Access Memory),同步动态随机存储器。同步、动态、随机是其性能特点的外在说明: 同步(Synchronous )是指内存工作需要同步时钟,内部的命令的发送与数据的传输都以它为基准 动态(Dynamic )是指存储阵列 需要不断的刷新来保证数据不丢失 随机(

    2023年04月08日
    浏览(47)
  • FPGA | Verilog基础语法

    菜鸟教程连接 举例(\\\"//\\\"符号后的内容为注释文字): initial $dumpfile (“myfile.dump”); //指定VCD文件的名字为myfile.dump,仿真信息将记录到此文件 可以指定某一模块层次上的所有信号,也可以单独指定某一个信号。 典型语法为$dumpvar(level, module_name); 参数level为一个整数,用于指

    2024年02月05日
    浏览(52)
  • FPGA基础概念_Verilog

     一、文件尾缀含义等常识 sof文件时编译(分析、综合、布线、生成、时序)过程中生成的一个文件,可通过Jtag下载到FPGA的SRAM中去执行. pof文件生成过程同上,但不同之处在于不能直接下载到FPGA的SRAM中,需要通过ASP端口直接下载到FPGA的配置芯片中,配置芯片一般时串行F

    2024年02月03日
    浏览(47)
  • Verilog实现FPGA可编程电路中的RAM存储器

    Verilog实现FPGA可编程电路中的RAM存储器 在FPGA可编程电路的设计中,RAM存储器通常被广泛使用。而手写RAM存储器则可以提供更加灵活、高效的设计方案。本文将介绍如何使用Verilog语言来手写FPGA中的RAM存储器。 首先,我们需要确定RAM存储器的大小和宽度。假设我们需要实现一个

    2024年02月04日
    浏览(57)
  • FPGA设计Verilog基础之Verilog的运算符

    注意:后续技术分享,第一时间更新,以及更多更及时的技术资讯和学习技术资料 ,将在公众号 CTO Plus 发布,请关注公众号: CTO Plus FPGA设计Verilog基础之Verilog的运算符 Verilog是一种硬件描述语言,支持多种运算符,包括算术运算符、比较(关系)运算符、逻辑运算符、条件

    2024年02月03日
    浏览(50)
  • FPGA设计Verilog基础之Verilog全局变量和局部变量定义

    注意:后续技术分享,第一时间更新,以及更多更及时的技术资讯和学习技术资料 ,将在公众号 CTO Plus 发布,请关注公众号: CTO Plus   在Verilog中,变量可以分为全局变量和局部变量两种类型。全局变量在整个模块中都可以使用,而局部变量只能在某个特定的代码块中使用。

    2024年02月15日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包