当前位置: 代码迷 >> 综合 >> 【Verilog】程序模块
  详细解决方案

【Verilog】程序模块

热度:96   发布时间:2023-12-04 12:33:09.0

Verilog程序模块

模块的结构

? ?Verilog基本设计单元**“模块”(block)**

? ?模块由两部分组成,一部分描述接口,一部分描述逻辑功能

? ?每个Verilog程序主要包括4个部分:

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

module block(a,b,c,d);// 模块名(端口定义)//端口描述intput a,b;output c,d;//功能定义assign c = a | b;assign d = a & b;endmodule

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

? ?1、assign语句 描述组合逻辑

? ?2、always语句 描述组合/时序逻辑

? ?3、例化实例元件 and #2 u1(q,a,b);

?上述三种逻辑功能并行执行。

always快中,逻辑是顺序执行的,多个always块之间是并行的。

module flow_led(intput			sys_clk;input			sys_rst_n;output	reg	[3:0]	led;
);//内部信号声明
//reg define
reg	[23:0]	counter;//计数器对系统时钟计数,计时0.2秒
always @(posedge sys_clk or negegde sys_res_n)	beginif(!sys_rst_n)// <= 为非阻塞执行赋值counter <= 24'd0;else if (Counter < 24'd1000_0000)counter <= counter + 1'b1;elsecounter <= 24'd0;
end//通过移位寄存器控制IO口的高低电平,从而改变LED显示状态
always @(posedge sys_clk or negedge sys_rst_n)	beginif(!sys_rst_n)led <= 4'b0001;else if(counter == 24d'1000_0000)//LED状态流水led[3:0] <= {led[2:0],led[3]};elseled <= led;
endendmodule;

模块的调用

? ?在模块调用时,信号通过模块端口在模块之间传递。

module time_count(input			clk,input			rst_n,output	reg		flag
);
parameter	MAX_NUM = 50000_000;
reg [24:0]	cnt;    
//top顶层模块
module seg_led_static_top(intput			sys_clk;intput			sys_rst_n;output		[5:0]	sel;output		[7:0]	seg_led;
);parameter TIME_SHOW = 25d'25000_000;wire add_flag;
//每隔0.5s产生一个时钟周期的脉冲信号
//端口连接方式
time_count #(.MAX_NUM (TIME_SHOW) //参数传递
) u_time_count(//例化模块名.clk 	(sys_clk	),.rst_n	(sys_rst_n	),.flag	(add_flag	)
);/*
//另一种端口连接方式
time_count #(.MAX_NUM	(TIME_SHOW)	
) u_time_count(sys_clk,sys_rst_n,add_flag
);
*///每当脉冲信号到达时,使数码管显示的数值加1
seg_led_static u_seg_led_static(.clk		(sys_clk	),.rst_n		(sys_rst_n	),.add_flag	(add_flag	),.sel		(sel		),.sel_led	(seg_led	)
);endmodule