Verilog快速入门的练习

第1关:Verilog描述电路模块

实验目的

熟悉用Verilog HDL描述电路模块的基本代码结构,掌握模块开始和结束的关键字,并会对模块名字进行合法命名。

实验任务

请在右侧代码窗格中补充完整模块关键字以及合法的模块名字标识符。 请在两行星号之间的空行上填写代码,切勿改动其它代码!!

 
  1. /********** Begin of blank1 *********/
  2. //please write your code here!
  3. /********** End of blank1 ***********/

相关知识

电路模块

数字逻辑电路以模块(module)的形式定义,如下图所示:

,

标识符的命名规则

1.以字母开头 2.可以包含任何字母和数字以及下划线_、美元符号$ 3.区分大小写

测试说明

请在右侧代码窗格中补充完成Verilog代码,点击右下方的评测按钮,平台会对你编写的代码进行测试:


开始你的任务吧,祝你挑战成功!

/********** Begin of blank1 *********/
  //请输入电路模块关键字以及模块名字(合法并具有一定含义的标识符,如cir_name、main等)
module main;
/********** End of blank1 *********/

  initial       //初始化
    begin       //相当于C语言的 {
      $display("hello, welcome to the colorful digital circuits world!");//相当于C语言的printf函数
      $finish;   //操作完成
    end         //相当于C语言的 }

/********** Begin of blank2 *********/
	//请输入模块结束关键字
	endmodule
/********** End of blank2 *********/

 

 第2关:Verilog电路模块的端口描述

 

实验目的

熟悉用Verilog HDL描述电路模块的基本代码结构,掌握端口的概念、输入输出关键字及信号的合法命名。

实验任务

请对照下图电路模块的逻辑符号,在右侧代码窗格中补充完整端口信号列表和输入、输出信号的定义。

,

相关知识

电路模块的端口

一个电路模块有输入和输出信号,它们统称为端口(port),如上图所示。

测试说明

请在右侧代码窗格中补充完成Verilog代码,点击右下方的评测按钮,平台会对你编写的代码进行测试! 以下是测试用例:

 
  1. VCD info: dumpfile test.vcd opened for output.
  2. time d0 d1 sel f
  3. 0 0 0 0 0
  4. 1 1 0 0 1
  5. 3 1 1 0 1
  6. 7 1 1 1 1
  7. 8 0 1 1 1
  8. 10 0 0 1 0
  9. 14 0 0 0 0
  10. 15 1 0 0 1
  11. 17 1 1 0 1
  12. 21 1 1 1 1
  13. 22 0 1 1 1
  14. 24 0 0 1 0
  15. 28 0 0 0 0
  16. 29 1 0 0 1
  17. 31 1 1 0 1
  18. 35 1 1 1 1
  19. 36 0 1 1 1
  20. 38 0 0 1 0
  21. 42 0 0 0 0
  22. 43 1 0 0 1
  23. 45 1 1 0 1
  24. 49 1 1 1 1

开始你的任务吧,祝你挑战成功!

 

 /********** Begin of blank1 *********/
 module mux2to1(d0,d1,sel,f);//请在括号中补全端口信号列表
 /********** End of blank1 *********/
 	
 /********** Begin of blank2 *********/
   //请给出端口信号的输入输出定义
	 input d0,d1,sel;
   output f;
 /********** End of blank2 *********/
 
    //以下是功能描述
    assign f = sel?d1:d0;
 
endmodule 

第3关:电路功能描述—门级原始结构

 

实验目的

熟悉用Verilog HDL描述电路模块功能的基本方法,掌握门级原始结构的使用方法。

实验任务

用门级原始结构的方式描述2选1多路选择器,在右侧代码窗格中补充完成相应的代码并完成测试。

,

相关知识

逻辑电路的结构化定义

Verilog包含了一系列与通用逻辑门电路对应的门级原始结构,一个逻辑门可以通过定义其函数名、输入和输出来表示。门级原始结构可以用于定义较大规模的电路。 门级原始结构又称门实例化 gate instantiation,语法如下:

 
  1. gate_name [inst_name](output_port,input_port{,input_port});

例如,一个2输入与门,其输出为y,输入为x1和x2,则该与门可以表示为:

 
  1. and( y, x1, x2 );

一个3输入或门,可以定义为:

 
  1. or( y, x1, x2, x3 );

一个3输入异或门,可以定义为:

 
  1. xor( y, x1, x2, x3 );

表1 Verilog门

名称函数名关键字用法
与门andand(f,a,b,...)
与非门nandnand(f,a,b,...)
或门oror(f,a,b,...)
或非门nornor(f,a,b,...)
异或门xorxor(f,a,b,...)
异或非门nxornxor(f,a,b,...)
非门notnot(f,a)
缓冲器bufbuf(f,a)

测试说明

请在右侧代码窗格中补充完成Verilog代码,点击右下方的评测按钮,平台会对你编写的代码进行测试! 以下是测试用例:

 
  1. VCD info: dumpfile test.vcd opened for output.
  2. time x1 x2 s f
  3. 0 0 0 0 0
  4. 1 1 0 0 1
  5. 3 1 1 0 1
  6. 7 1 1 1 1
  7. 8 0 1 1 1
  8. 10 0 0 1 0
  9. 14 0 0 0 0
  10. 15 1 0 0 1
  11. 17 1 1 0 1
  12. 21 1 1 1 1
  13. 22 0 1 1 1
  14. 24 0 0 1 0
  15. 28 0 0 0 0
  16. 29 1 0 0 1
  17. 31 1 1 0 1
  18. 35 1 1 1 1
  19. 36 0 1 1 1
  20. 38 0 0 1 0
  21. 42 0 0 0 0
  22. 43 1 0 0 1
  23. 45 1 1 0 1
  24. 49 1 1 1 1

开始你的任务吧,祝你挑战成功!

module mux_gate_struc(x1, x2, s, f);
	input x1, x2, s;
	output f;

	not (k, s);
/**************** begin of blank1 ***********************/
   //请补充完成相应的门级原始结构描述
	not( k, s );
    and( g, x1, k);
    and( h, s, x2);
	or( f, g, h);
/**************** end of blank1 ***********************/

endmodule 

 第4关:电路功能描述—行为定义—连续赋值

 

实验目的

熟悉用Verilog HDL描述电路模块功能的基本方法,掌握连续赋值的使用方法。

实验任务

用连续赋值的方式描述2选1多路选择器,在右侧代码窗格中补充完成相应的代码并完成测试。

,

相关知识

逻辑电路的行为定义

在设计大规模电路时,使用门级原始结构会很繁琐。可行的选择是采用更为抽象的表达式和编程结构描述逻辑电路的行为。

用逻辑表达式定义电路

上图所示的选择器可用如下逻辑代数表达式表示:

f=sx1​+sx2​

在Verilog中,与、或、非运算分别用 &、|、~ 表示,使用关键词assign对f进行连续赋值,如下:

 
  1. assign f = (~s & x1)|(s & x2 );

assign语句是并行语句,语法形式如下:

 
  1. assign net_assignment{,net_assignment};

用过程语句定义电路

使用过程语句定义电路是更高层次的抽象,过程语句要放在相应的编程结构中。该知识点放在下一个关卡中进行详细讲解。

测试说明

请在右侧代码窗格中补充完成Verilog代码,点击右下方的评测按钮,平台会对你编写的代码进行测试! 以下是测试用例:

 
  1. VCD info: dumpfile test.vcd opened for output.
  2. time x1 x2 s f
  3. 0 0 0 0 0
  4. 1 1 0 0 1
  5. 3 1 1 0 1
  6. 7 1 1 1 1
  7. 8 0 1 1 1
  8. 10 0 0 1 0
  9. 14 0 0 0 0
  10. 15 1 0 0 1
  11. 17 1 1 0 1
  12. 21 1 1 1 1
  13. 22 0 1 1 1
  14. 24 0 0 1 0
  15. 28 0 0 0 0
  16. 29 1 0 0 1
  17. 31 1 1 0 1
  18. 35 1 1 1 1
  19. 36 0 1 1 1
  20. 38 0 0 1 0
  21. 42 0 0 0 0
  22. 43 1 0 0 1
  23. 45 1 1 0 1
  24. 49 1 1 1 1

开始你的任务吧,祝你挑战成功

 module mux_assign_behav(x1, x2, s, f);
	input x1, x2, s;
	output f;

/**************** begin of blank1 ***********************/
   //请用连续赋值方式描述2选1多路选择器
	assign f = (~s & x1)|(s & x2);

/**************** end of blank1 ***********************/

endmodule 

第5关:电路功能描述—行为定义—过程语句 

 

实验目的

熟悉用Verilog HDL描述电路模块功能的基本方法,掌握always编程结构和过程语句if - else 的使用方法。

实验任务

always结构和if - else语句描述2选1多路选择器,在右侧代码窗格中补充完成相应的代码并完成测试。

,

相关知识

逻辑电路的行为定义

在设计大规模电路时,使用门级原始结构会很繁琐。可行的选择是采用更为抽象的表达式和编程结构描述逻辑电路的行为。

用逻辑表达式定义电路

见上一关。

用过程语句定义电路

使用过程语句定义电路是更高层次的抽象,过程语句要放在相应的编程结构中。 上图所示的选择器电路可以表述成:如果s=0,则f=x1;如果s=1,则f=x2。在Verilog中,这种功能可以用if-else语句定义,如下:

 
  1. if(s)
  2. f=x2;
  3. else
  4. f=x1;

Verilog要求过程语句必须包含在always块结构中,语法如下:

 
  1. always @(sensitivity_list)
  2. [begin]
  3. [procedural assignment statements] //过程赋值语句
  4. [if-else statements] //if-else语句
  5. [case statements] //case语句
  6. [while, repeat, and for loops] //循环语句
  7. [task and function calls] //任务和函数调用
  8. [end]

几点说明: 1.敏感信号列表中的信号用逗号,或者or分隔; 2.always块中的输出信号必须定义成寄存器型reg; 3.always块中的语句顺序执行; 4.一个Verilog模块中可以包含多个always块; 5.一整个always块可以看成是一个并行语句。 特别说明: 门级原始结构、连续赋值、过程语句与编程结构这三种功能描述风格不是孤立,可以在一个module中同时出现。

测试说明

请在右侧代码窗格中补充完成Verilog代码,点击右下方的评测按钮,平台会对你编写的代码进行测试! 以下是测试用例:

 
  1. VCD info: dumpfile test.vcd opened for output.
  2. time x1 x2 s f
  3. 0 0 0 0 0
  4. 1 1 0 0 1
  5. 3 1 1 0 1
  6. 7 1 1 1 1
  7. 8 0 1 1 1
  8. 10 0 0 1 0
  9. 14 0 0 0 0
  10. 15 1 0 0 1
  11. 17 1 1 0 1
  12. 21 1 1 1 1
  13. 22 0 1 1 1
  14. 24 0 0 1 0
  15. 28 0 0 0 0
  16. 29 1 0 0 1
  17. 31 1 1 0 1
  18. 35 1 1 1 1
  19. 36 0 1 1 1
  20. 38 0 0 1 0
  21. 42 0 0 0 0
  22. 43 1 0 0 1
  23. 45 1 1 0 1
  24. 49 1 1 1 1

开始你的任务吧,祝你挑战成功!

  module mux_proc_behav(x1, x2, s, f);
	input x1, x2, s;
	output f;
/**************** begin of blank1 ***********************/
   //请将输出信号定义为寄存器型
	
/**************** end of blank1 ***********************/

/**************** begin of blank2 ***********************/
  
/**************** end of blank2 ***********************/
/**************** begin of blank3 ***********************/
  	 	//请用过程语句if-else描述2选1多路选择器
	
    	assign f = (~s&x1)|(s&x2);
    
    
    
/**************** end of blank3 ***********************/

endmodule 

 

 

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值