【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

仿真波形:

注意事项

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

社牛超靓的铁蛋儿

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值