首页 > 编程语言 >Verilog程序模块最详细的说明-实现流水灯

Verilog程序模块最详细的说明-实现流水灯

时间:2024-07-22 16:53:59浏览次数:14  
标签:led sys 程序模块 Verilog 模块 rst input 流水

文章目录


前言

Verilog程序模块主要分为三个部分,下面我将详细介绍三个部分的主要内容,同时给出流水灯的实现代码


一、Verilog注释

1.//开头,表示以//开始到本行结束都是注释语句
2./* */多行注释(和java不一样)

二、Verilog关键字

常见的关键字,要熟悉

在这里插入图片描述

三、Verilog模块

1.Verillog的基本设计单元是**“模块”(block)**

2.一个模块是由两部分组成,一部分是描述接口,另一部分描述逻辑功能.

3.每个Verilog模块包括4个主要部分:

端口定义、IO说明 、内部信号定义、功能定义.

module block(a,b,c,d);// 端口定义

input a,b;
output c,d; //IO说明

assign c = a|b;
assign d = a&b; //功能定义

endmodule

assign是给线网数据类型进行赋值的方法
端口默认的是wire类型的变量

4.举例-流水灯

流水灯设计

module flow_led(
input sys_clk; //系统时钟
input sys_rst_in //系统复位,低电平有效
output reg[3:0] led //4个led灯
);
reg[23:0] counter; //这是内部信号,定义了一个变量
//计数器对系统时钟计数,计时0.2
always @ (posedge sys_rst or negedge sys_rst_in)
     begin
	     if(!sys_rst_in)
			counter <= 24'd0;
		else if (counter<24'd1000_0000)
			counter <= counter + 1'b1;
		else 
			counter <= 24'd0;
	end
//通过移位寄存器控制IO口的高低电平,从而改变LED的显示状态
always @ (posedge sys_clk or negedge sys_rst_in)
	begin
		if(!sys_rst_in)
			led <= 4'b0001;
		else if(counter<24'd1000_0000)
		led[3:0] <= {led[2:0],led[3]};
		else 
			led <= led;
	end
endmodule

5.功能定义部分有三种方法:

1.assign语句
描述组合逻辑
2.always语句
描述组合/时序逻辑
3.例化实例元件
如:and #2 u1(q,a,b);
上诉三种逻辑功能是并行的
需要注意的是 在always语句中,逻辑是顺序执行的,而多个always语句之间是并行的

6.模块的调用

在调用模块时,信号通过模块端口在模块之间传递
两个传递的信号之间位宽需要保持一致;
在例化子模块时.需要将子模块重新命名;

举例

module seg_led_static_top(
	input		sys_clk,
	input		sys_rst_n,
	output[5:0]	sel,
	output[7:0] seg_led
);
//parameter define
parameter TIME_SHOW = 25'd25000_000;

//wire define
wire add_flag;
/*
main code
*/
//没隔 0.5s产生一个时钟周期的脉冲信号
time_count #(
	.MAX_NUM	(TIME_SHOW) //这是参数传递
)	u_time_count(
		.clk	(sys_clk),//位宽保持一致
		.rst_n	(sys_rst_n),//输入可以是wire,也可以是reg
		
		.flag 	(add_flag) //必须是wire类型
); 		


//time_count 模块
module time_count(
	input clk,
	input rst_n,
	
	output reg flag
);
//parameter define
parameter MAX_NUM = 50000_000;

//reg define
reg [24:0] cnt;

另一种端口连接方式,不推荐
这种连接方式需要端口信号严格按照顺序排列(按照top模块的信号定义顺序)

time_count #(
	.MAX_NUM	(TIME_SHOW)
) u_time_count(
	sys_clk, 
	sys_rst_n,
	
	add_flag

);

标签:led,sys,程序模块,Verilog,模块,rst,input,流水
From: https://blog.csdn.net/2301_76707170/article/details/140593072

相关文章