1、可编程单脉冲发生器设计FPGA可编程单脉冲发生器设计一、功能描述:本设计实现一个可编程单脉冲发生器,具体功能如下:1.异步信号复位,复位后信号输出重新开始。2.复位后5个时钟周期时,产生一个脉冲,对输入的脉冲宽度参数读取。3.当有按键使能时,输出脉冲信号,重复再按使能键,无效。4.使能按键后产生的单脉冲的上升沿与时钟取得同步。5.产生的脉冲信号的最大宽度为255。二、输入输出信号描述:信号名输入/输出目标/源功能描述clkInputPin时钟频率50M占空比1:1rstInputPin低电平有效,程序重新执行,计数器清零。data7:0InputPin8位控制脉冲信号的宽度outOutputP
2、in输出信号LED6:0OutputPin接入数码管显示data输入值三、顶层划分:系统结构框图顶层模块说明:1、 counter:计数比较,确保输出信号宽度为输入data值;2、 sync:将按键产生的单脉冲的上升沿与时钟取得同步;3、 T_trigger:T触发器模块,锁按键信号,使按键只能第一次有效;4、 preset_parameter:预置脉冲参数;5、 LED:将输入data用数码管输出显示。设计说明: 设计分为计数比较、按键同步、预置脉冲参数、T触发器模块、LED显示五个模块。计数比较模块:计数延时,由输入的宽度参数data的不同而得到不同宽度的脉冲。按键同步模块:使按键产生的单
3、脉冲的上升沿与时钟取得同步。预置脉冲参数:在系统进行复位操作的5个时间单位后,将输入的脉冲参数data预置到flag_data中。T触发器模块:T触发器模块,锁按键信号,使按键只能第一次有效。LED显示模块:将脉冲宽度的预置值和计数模块的计数值转换为数码管输出显示。四、子模块描述:4.1、counter:计数判断输出模块 1、功能描述 计数延时,由输入的宽度参数data的不同而得到不同宽度的脉冲。 2、管脚描述信号名称输入 / 输出源目标功能描述clkInputPin时钟信号50MHzrstInputPin复位信号,低电平有效data_in7:0InputPin脉冲宽度参数Q_inInputP
4、in按键使能标志outOutputPin脉冲输出 3、实现说明复位后输出out为0。当Q_in按键使能标志有效时,cnt7:0从零开始计数,当cntdata_in时,输出out=1;其余输出为0。4、模块验证 1.正常运行观测其输出变化;复位观测。 2.将cnt接数码管显示,观测脉冲宽度。4.2、sync:同步按键与时钟信号模块 1、功能描述使按键产生的单脉冲的上升沿与时钟取得同步。 2、管脚描述信号名称输入 / 输出源目标功能描述clkInputPin时钟信号50MHzrstInputPin复位信号,低电平有效en_inInputPin按键使能en_outOutputPin同步后的按键使能
5、3、实现说明当按键被按下(即en_in=0)时,将Q1=1,在clk为高电平时将Q2=Q1,en_out=Q2;clr=en_in&en_out,当clr有效时Q1=0。复位信号rst有效时,Q1=0,Q2=0,en_out=0。sync结构图:4、模块验证1.复位验证。4.3、T_trigger:T触发器模块 1、功能描述T触发器模块,锁按键信号,使按键只能第一次有效。 2、管脚描述信号名称输入 / 输出源目标功能描述rstInputPin复位信号,低电平有效inInputPinT触发器输入Q_outOutputPinT触发器输出 3、实现说明当复位时,Q_out=0;其他时输出结果为Q_o
6、ut=inQ_out。4、模块验证复位验证。4.4、preset_parameter:预置脉冲参数模块1、功能描述在系统进行复位操作的5个时间单位后,将输入的脉冲参数data预置到flag_data中。 2、管脚描述信号名称输入 / 输出源目标功能描述clkInputPin时钟信号50MHzrstInputPin复位信号,低电平有效data7:0InputPin输入的脉冲宽度参数flag_data7:0OutputPin预置脉冲宽度值 3、实现说明系统复位后sum从零开始计数,当sum=5时,将flag_data=data4、模块验证复位后检测sum值和flag_data值。4.5、LED:数
7、码管显示模块 1、功能描述 将脉冲宽度的预置值和计数模块的计数值转换为数码管输出显示。 2、管脚描述信号名称输入 / 输出源目标功能描述rstInputPin复位信号,低电平有效data2:0InputPin输入数值cnt_num7:0InputPin计数模块中cnt值led16:0OutputPin接数码管显示输入的data百位Led26:0OutputPin接数码管显示输入的data十位Led36:0OutputPin接数码管显示输入的data个位Led46:0OutputPin接数码管显示计数模块中cnt的百位Led56:0OutputPin接数码管显示计数模块中cnt的十位Led66:
8、0OutputPin接数码管显示计数模块中cnt的个位 3、实现说明将data和cnt的输入值转换为数码管显示输出。对百位取余作为百位的值,对百位取余再对十位取整作为十位的值,对个位取余作为个位的值。五、验证方案:1、结果验证 将程序下载至实验板,接示波器后,先设置脉冲宽度再复位,最后按键,观测示波器显示的波形信号。2、复位验证 下载到实验板,让其运行一段时间,进行复位,观测变化。3、仿真验证六、实验截图:前仿真波形:Quartus II综合:后仿真波形:分配管脚:程序运行最高速度:七、源程序代码:顶层模块:module pulser(data,en,rst,clk,out,led1,led2
9、,led3,led4,led5,led6);input7:0data;input en,rst,clk;output out;output6:0led1,led2,led3,led4,led5,led6;wire x,m;wire7:0d,y;sync S(.clk(c),.rst(rst),.en_in(en),.en_out(m);counter C(.Q_in(x),.clk(clk),.rst(rst),.data_in(d),.out(out),.cnt(y);preset_parameter P(.clk(clk),.rst(rst),.data(data),.flag_data(
10、d);T_trigger T(.rst(rst),.in(m),.Q_out(x);LED L(.led_data(d),.cnt_num(y),.rst(rst),.led1(led1),.led2(led2),.led3(led3),.led4(led4),.led5(led5),.led6(led6);endmodule计数判断输出模块:countermodule counter(Q_in,clk,rst,data_in,out,cnt);input7:0data_in;input Q_in,clk,rst;output7:0cnt;output out;reg out;reg7:0cn
11、t;always(posedge clk or negedge rst)begin if(!rst) begin cnt=0; out=0; end else if(Q_in&cntdata_in) begin out=1; cnt=cnt+1; end else begin out=0; endendendmodule同步按键与时钟信号模块:syncmodule sync(clk,rst,en_in,en_out);input en_in,clk,rst;output en_out;reg Q1,Q2,en_out;wire clr;assign clr=en_in&en_out;alway
12、s(en_in or rst or clk)begin if(!rst) begin Q1=0; Q2=0; en_out=0; end else if(!en_in)Q1=1; else if(clr)Q1=0; else if(clk) begin Q2=Q1; en_out=Q2; endendendmoduleT触发器模块:T_triggermodule T_trigger(rst,in,Q_out);input rst,in;output Q_out;reg Q_out;always(in or rst)begin if(!rst)Q_out=0; else Q_out=inQ_ou
13、t;endendmodule预置脉冲参数模块:preset_parametermodule preset_parameter(clk,rst,data,flag_data);input clk,rst;input7:0data;output7:0flag_data;reg7:0flag_data;reg2:0sum;reg flag_sum;always(posedge clk or negedge rst)begin if(!rst) begin sum=0; flag_sum=0; flag_data=0; end else if(flag_sum=0&sum=5) begin flag_
14、data=data; flag_sum=flag_sum+1; end else if(flag_sum=0&sum5)sum=sum+1;endendmodule数码管显示模块:LEDmodule LED(led_data,cnt_num,rst,led1,led2,led3,led4,led5,led6);input7:0led_data,cnt_num;input rst;output6:0led1,led2,led3,led4,led5,led6;reg6:0led1,led2,led3,led4,led5,led6;reg6:0LED9:0;always(rst or cnt_num
15、 or led_data)beginLED0=7b1000000;LED1=7b1111001;LED2=7b0100100;LED3=7b0110000;LED4=7b0011001;LED5=7b0010010;LED6=7b0000010;LED7=7b1111000;LED8=7b0000000;LED9=7b0010000; if(!rst) begin led1=0; led2=0; led3=0; led4=0; led5=0; led6=0; end else begin led1=LEDled_data/100; led2=LEDled_data%100/10; led3=L
16、EDled_data%10; led4=LEDcnt_num/100; led5=LEDcnt_num%100/10; led6=LEDcnt_num%10; endendendmodule测试激励模块:timescale 10ns/1nsmodule test;reg clk,rst,en;reg7:0data;wire out;wire6:0led1,led2,led3,led4,led5,led6;pulser P(data,en,rst,clk,out,led1,led2,led3,led4,led5,led6);initialbegin clk=b1; forever #1 clk=clk;endinitialbegin rst=b0;en=1;data=d14;#1 rst=0; #1 rst=b1; #6 en=0;#1 en=1; #50 data=d220;#1 rst=0;#1 rst=b1;#6 en=0;#1 en=1; #500 data=d113;#1 rst=0;#1 rst=b1;#6 en=0;#1 en=1;endendmodule
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1