Verilog 编程基础练习

这篇具有很好参考价值的文章主要介绍了Verilog 编程基础练习。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、3-8译码器

1、用 Logsim 绘制3-8译码器电路图

2、3-8译码器逻辑真值表

3、用 Verilog 编程(if-else)设计3-8译码器,生成RTL原理电路图并进行仿真

(1)、Verilog 实现三八译码器代码

(2)、生成RTL电路如下图

(3)、仿真

3、实验问题分析

二、全加器电路

1、1位全加器

(1)、Logsim逻辑电路图

(2)、Verilog代码及生成的RTL电路

  2、 4位全加器

(1)、Logsim逻辑电路图

(2)、Verilog代码及生成的RTL电路

3、用Verilog的行为级方式完成1位全加器和4位全加器

(1)、1位全加器

(2)、4位全加起

3、 8位全加器


一、3-8译码器

1、用 Logsim 绘制3-8译码器电路图

Verilog 编程基础练习,笔记

2、3-8译码器逻辑真值表

3-8译码器真值表
a b c Y0 Y1 Y2 Y3 Y4 Y5 Y6 Y7
0 0 0 0 0 0 0 0 0 0 1
0 0 1 0 0 0 0 0 0 1 0
0 1 0 0 0 0 0 0 1 0 0
0 1 1 0 0 0 0 1 0 0 0
1 0 0 0 0 0 1 0 0 0 0
1 0 1 0 0 1 0 0 0 0 0
1 1 0 0 1 0 0 0 0 0 0
1 1 1 1 0 0 0 0 0 0 0

3、用 Verilog 编程(if-else)设计3-8译码器,生成RTL原理电路图并进行仿真

(1)、Verilog 实现三八译码器代码
module decoder3_8
(
input wire in1 , //输入信号 in1
input wire in2 , //输入信号 in2
input wire in3 , //输入信号 in3
output reg [7:0] out //输出信号 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 decoder3_8_ins
(
.in1(in1), //input in1
.in2(in2), //input in2
.in3(in3), //input in3
.out(out) //output [7:0] out
);
endmodule
(2)、生成RTL电路如下图

Verilog 编程基础练习,笔记

(3)、仿真

仿真测试文件:

timescale 1ns/1ns
module three_to_eight_tb();
reg  a;
reg  b;
reg  c;
wire   [7:0]   out;
initial    begin
    a <= 1'b1;
    b <= 1'b0;
    c <= 1'b1;
end
always #10 a <= {$random} % 2;
always #10 b <= {$random} % 2;
always #10 c <= {$random} % 2;
initial begin
 $timeformat(-9, 0, "ns", 6);
    $monitor("@time %t:a=%b b=%b c=%b out=%b",$time,a,b,c,out);
end
three_to_eight three_to_eight_ins
(

    .a(a), 
    .b(b),
    .c(c),
    .out(out)

 );
endmodule
 

仿真结果:

Verilog 编程基础练习,笔记

3、实验问题分析

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

       Verilog综合生成的3-8译码器电路原理图与原始设计电路在结构和连接上有所不同,原始设计电路时基于门电路的物理链接,而Verilog综合生成的电路是基于编程逻辑单元的配置,这种差异体现在实现的方式上,但两种方式在功能上是相同的。

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

        reg类型用于定义寄存器,即具有存储功能的元件,而wire类型用于定义导线,及用于连接模块间的信号传输,3-8译码器模块中,输出信号需要根据输入信号的变化而变化,因此需要被定义为reg类型。   

        如果将3-8译码器模块的输出信号由reg类型改为wire类型,那么这个信号将不再有存储功能,也就是说,模块内部不能再对这个信号进行赋值、计算或驱动,浙江导致模块无法正常工作,因为输出信号需要根据输入信号的变化而变化。

        如果将output reg [7:0] out 改为output [7:0] out,那么在模块内部的赋值操作将无法执行,例如,例如 out = 3'b101;这样的语句将无法编译通过,因为 wire类型的信号不能在模块内部被赋值。

二、全加器电路

1、1位全加器

(1)、Logsim逻辑电路图

Verilog 编程基础练习,笔记

(2)、Verilog代码及生成的RTL电路

代码:

module full_adder(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 编程基础练习,笔记

  2、 4位全加器

(1)、Logsim逻辑电路图

Verilog 编程基础练习,笔记

(2)、Verilog代码及生成的RTL电路

代码:

module eight(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

module ad4
(
	input [3:0]A,B,
	input cin,
	output [3:0]sum,
	output cout
);
	wire[4:0]c;
	assign c[0] = cin;
	ad1 ad10(A[0],B[0],c[0],sum[0],c[1]);
	ad1 ad11(A[1],B[1],c[1],sum[1],c[2]);
	ad1 ad12(A[2],B[2],c[2],sum[2],c[3]);
	ad1 ad13(A[3],B[3],c[3],sum[3],c[4]);
	assign cout = c[4];
endmodule

RTL电路:

Verilog 编程基础练习,笔记

3、用Verilog的行为级方式完成1位全加器和4位全加器

(1)、1位全加器

代码:

module fulladder(
    input a,  
    input b,  
    input cin, 
    output sum,  
    output cout  
);
assign sum = a ^ b ^ cin;  
assign cout = (a & b) | (b & cin) | (a & cin); 
endmodule

RTL电路

Verilog 编程基础练习,笔记

(2)、4位全加起

代码:

module addr4
(
	input	wire	[3:0]	ina			,
	input	wire	[3:0]	inb			,
	input	wire			cin			,
	output	wire	[3:0]	sum			,
	output	wire			cout		 
);

assign {cout,sum}=ina+inb+cin;

endmodule                                                                                                 

RTL电路:Verilog 编程基础练习,笔记

3、 8位全加器

代码:

module eight(
	input clk,
	input rst_n,
		
	input [7:0] a,
	input [7:0] b,
	input cin,
	input enable,
	
	output reg [7:0] sum,
	output reg cout
);

always@(posedge clk or negedge rst_n)begin
	if(!rst_n)begin
		sum <= 8'b0;
		cout <= 1'b0;
	end
	else if(enable)begin
		{cout,sum} <= a+b+cin;
	end
	else begin
		sum <= sum;
		cout <= cout;
	end
end
endmodule

RTL电路:

Verilog 编程基础练习,笔记
 文章来源地址https://www.toymoban.com/news/detail-801974.html

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

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

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

相关文章

  • Python基础入门编程代码练习(二)

    循环条件:i100 循环操作  实现代码如下: 运行结果:   计算 100 以内的奇数之和,并设置断点调试程序,追踪 3 个表达式的执行顺序及循环变量的变化  实现代码如下: 运行结果:   商场对顾客的年龄层次进行调查 计算各年龄层次的顾客比例  实现代码如下: 运行结果:

    2024年02月03日
    浏览(40)
  • C#基础练习题,编程题汇总

    编程实现在一行内输入若干个整数(不超过30个),输出最大的一个整数。 样例如下: 输入(在一行内输入,空格分隔): 5 6 78 -89 0 23 100 4 6 输出: 100 C#具体设计: 1.先让用户输入一些整数, 2.再装其读入到字符串用, 3.用空格符来分割字符成,存成字符数组 4.用foreach语句

    2023年04月16日
    浏览(60)
  • C++编程最基础练习题(1-10) 小白入门必刷

    C++编程练习题 (1-10) 1. 输入3个数,求最大值 2. 编程序,求方程ax2+bx+c=0的根 3. 输入一个成绩,打印相应的等级 4. 输入3个double类型的值,判断这3个值是否可以表示一个三角形的三条边 5. 输入20个数,求其最大、最小和平均值 6. 输入若干个数,设输入的第一个数为后面要输

    2023年04月19日
    浏览(96)
  • 《Python-基础》练习笔记:难点与错题分享

    1、以下关于Python缩进的描述中,错误的是: A.Python用严格的缩进表示程序的格式框架,所有代码都需要在行前至少加一个空格 B.缩进是可以嵌套的,从而形成多层缩进 C.缩进表达了所属关系和代码块的所属范围 D.判断、循环、函数等都能够通过缩进包含一批代码 2、以下代码

    2024年01月20日
    浏览(34)
  • FPGA学习笔记:verilog基础代码与modelsim仿真(三)

    1. 分频器——偶分频 方法1: verilog代码实现: modelsim仿真波形图: 方法2(推荐): 比起方法一直接使用计数器定义一个新的时钟波形,方法二使用flag_out作为分频变量从而实现分频器的功能。虽然二者都使用了计数器,但方法二显然更符合“分频”的定义,且此方法在告诉

    2024年02月06日
    浏览(50)
  • 初学Verilog语言基础笔记整理(实例点灯代码分析)持续更新~

    实例:点灯学习 刚接触 Verilog ,作为一个硬件小白,只能尝试着去理解,文章未完…持续更新。 参考博客文章: Verilog语言入门学习(1) Verilog语法 【 Verilog 】一文带你了解 Verilog 基础语法 - 子墨祭的文章 - 知乎 关于Verilog中的几种赋值语句 这里抄点,那里扣点,整理了一

    2024年02月07日
    浏览(43)
  • 【运维知识高级篇】34道Shell编程练习题及答案(从基础到实战:基础+计算+判断+循环+控制与数组+实战进阶)

    ​本篇文章几乎涵盖了绝大部分的Shell语法练习,用一个个实战练习,巩固Shell的学习,话不多说,直接开始。 练习1:按照时间生成文件\\\"2018-05-22.log\\\"将每天的磁盘使用状态写入到对应日期的文件 练习2:统计Nginx日志中每个IP的访问量有多少,日志格式如下 练习3:写一个脚本

    2024年02月14日
    浏览(59)
  • 嵌入式培训机构四个月实训课程笔记(完整版)-Linux网络编程第二天-TCP编程练习(物联技术666)

    点赞+关注,功德无量。更多配套资料,欢迎私信。 百度网盘 请输入提取码 百度网盘为您提供文件的网络备份、同步和分享服务。空间大、速度快、安全稳固,支持教育网加速,支持手机端。注册使用百度网盘即可享受免费存储空间 https://pan.baidu.com/s/1F6BR6uTANKKcNnoaCUAZYA?pwd=

    2024年02月01日
    浏览(55)
  • FPGA学习笔记:verilog基础代码与modelsim仿真(六)——vga显示模块

    VGA显示 目标:实现屏幕红、橙、黄、绿、青、蓝、紫、黑、白、灰条形显示 1. 模块框图与波形图 vga_colorbar是实现目标功能的总体模块框图,为了实现对应的输出,我们使用三个具体功能模块实现功能。 (1) clk_gen——使用pll锁相环实现时钟分频 (2)vga_ctrl——图像控制与输出模

    2024年02月04日
    浏览(39)
  • 嵌入式培训机构四个月实训课程笔记(完整版)-Linux网络编程第一天-socket编程练习(物联技术666)

    点赞+关注,功德无量。更多配套资料,欢迎私信。 网盘链接:https://pan.baidu.com/s/1NIrDmbm8EtFkB1G8s7E3Sg?pwd=qsoh 提取码:qsoh 1、建立一个服务器和一个客户端,二个之间通信 //--------------------服务器 #include stdio.h #include stdlib.h #include string.h                                    

    2024年02月01日
    浏览(51)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包