【Verilog零基础入门-边看边练】学习笔记——第七讲 时序逻辑代码设计和仿真(三角波发生器)(二)

二、梯形波发生器逻辑设计

所需软件

Verilog编程软件:Lattice Diamond(3.11.0.396.4_Diamond_x64)

Verilog仿真软件:ModelSim SE-64 10.2c(modelsim-win64-10.2c-se)

方法:用always语句块、组合逻辑实现梯形波发生器逻辑设计

符号图(参考三角波发生器): 

Verilog代码:

Part1:Test15_tra_gen.v文件(Verilog工程文件)

//2020-06-06,liugy
//梯形波发生器:梯形(trapezoidal)
module Test15_tra_gen(
						clk,
						res,
						d_out	
						);
	
input					clk;
input					res;
output[8:0]				d_out;	//输出结果(299需要占用9bit)
	
reg[1:0]				state;	//定义状态机寄存器,因有3个状态,所以需占用2bit
reg[8:0]				d_out;	//299需要占用9bit

reg[7:0]				con;	//计数器,记录平顶的时间(系统时钟的周期个数)
	
always@(posedge clk or negedge res)
	if(~res) begin				//如果复位为低
		state<=0;d_out<=0; 	//状态机进入零状态,d_out也为0
		con<=0;
	end
	else begin
		case(state)				//状态机
			0:	begin d_out<=d_out+1;		//上升
					if(d_out==299)	begin	//跳转条件(计数器+1,加到299,跳转到1状态)
					state<=1;				//跳转到1状态
					end
				end
				
			1:	begin			//顶边(上到300,横一会儿,再下来)
					if(con==199)	begin	//跳转条件(计数器+1,加到199,跳转到2状态)
					state<=2;				//跳转到2状态
					con<=0;
					end
					else begin
						con<=con+1;
					end
				end
				
			2:	begin d_out<=d_out-1;		//下降
					if(d_out==1)	begin	//跳转条件(计数器-1,减到1,跳转到0状态)
					state<=0;				//跳转到0状态
					end
				end
				
			default:	begin				//用于对2bit的state未定义的情况进行默认(2bit可产生4种state)
					state<=0;con<=0;d_out<=0;
					end
		endcase
	end
endmodule

Part2:Test15_tra_gen_tb.v文件(Verilog仿真文件)

//2022-06-06
//梯形波发生器-testbench of Test15_tra_gen
`timescale 1ns/10ps
module	Test14_tri_gen_tb;
reg								clk_in,res_in;
wire[8:0]						d_out;

Test14_tri_gen U1(
								.clk(clk_in),		//异名例化
								.res(res_in),
								.d_out()	
								);
								
initial	begin
								clk_in<=0;res_in<=0;
		#17						res_in<=1;
		#20000					$stop;				//系统时钟周期为10ns,实现1-300、300-1计数+200个时钟周期的平顶时间,遍历运行一遍需要8000ns
		end

always	#5						clk_in<=~clk_in;	//设置系统时钟周期为10ns

				
endmodule

仿真波形:

【Verilog零基础入门-边看边练】学习笔记——第七讲 时序逻辑代码设计和仿真(三角波发生器)(二)_第1张图片

注意事项

1、因本状态机有3个状态,所以需占用2bit,故需将状态变量state设置为reg[1:0]型;

2、对未定义的state,可用default进行状态默认,比如Test15_tra_gen.v中将未定义的情况默认为state<=0(2bit可产生4种state);若4种state状态均有定义,则不需default语句。

3、设置梯形波的顶边时,要考虑顶边的保持时间,比如Test15_tra_gen.v文件中:reg[7:0]                con;    //计数器,记录顶边的时间最大为255(系统时钟的周期个数);

4、因设定了系统时钟周期为10ns,故实现1-300、300-1计数+保持200个时钟周期的顶边时间需要8000ns。

原教学视频链接如下

Verilog零基础入门_哔哩哔哩_bilibili

你可能感兴趣的:(Lattice,学习,fpga开发,硬件工程)