二、梯形波发生器逻辑设计
所需软件
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。