差别

这里会显示出您选择的修订版和当前版本之间的差别。

到此差别页面的链接

两侧同时换到之前的修订记录 前一修订版
后一修订版
前一修订版
脉冲发生器 [2016/06/14 13:45]
anran [代码设计]
— (当前版本)
行 1: 行 1:
-=====脉冲发生器===== 
- 
-====硬件平台==== 
------- 
-  - [[STEP-MXO2第一代]] 
-  - [[STEP-Baseboard]] 
- 
-====设计要求==== 
------- 
-  - 掌握Verilog子模块的调用 
-  - 掌握PWM和脉冲发生的原理 
-  - 基于[[STEP-Baseboard]]平台实现脉冲发生器的设计,周期可调,占空比可调 
- 
-====工作原理==== 
------- 
-脉冲发生器是信号发生器的一种,是周期和占空比均可调的矩形脉冲的发生器。 ​ 
- 
-周期:在数字信号的领域中是信号变化的过程中,某段波形重复出现,其某一次开始至结束的这段时间就称为“周期"​。 
- 
-占空比:是在一串理想的脉冲系列中,正脉冲的持续时间与脉冲周期的比值。例如在下图中t为正脉冲的持续时间,T为脉冲周期,占空比为t/​T。 
- 
-{{ :​占空比.jpg |占空比}} 
- 
-脉冲发生一般通过对一个高频的脉冲信号进行分频来生成。 
- 
-分频比:指方波的周期和高频信号手气之间发的比例关系,通过控制分频比来生成不同频率的方波。例如,开发系统上的时钟频率是25MHz,如果要生成5MHz的方波,则分频比为5。 
- 
- 
- 
- 
-====硬件连接==== 
------- 
-为了方便在硬件平台上演示,我们使用25MHz的系统时钟作为高频信号做分频处理,产生脉冲信号,通过调节脉冲信号的周期和正脉冲的宽度,最终生成我们需要的脉冲信号。 
- 
-三路按键输入:​ 
-  * key_menu:使用按键K5作为输入,按动K5按键控制周期和脉宽调节模式的切换。 
-  * key_up:使用按键K1作为输入,按动K1按键根据所处的模式控制周期或脉宽参数的增加。 
-  * key_down:使用按键K3作为输入,按动K3按键根据所处的模式控制周期或脉宽参数的减小。 
-两路LED输出: 
-  * menu_state:使用小脚丫核心板上的LD1作为输出,当LED点亮或熄灭时分别表示脉宽调节模式或周期调节模式。 
-  * pulse_out:使用小脚丫核心板上的LD2作为输出,可以根据LED的亮度表示周期和脉宽的变化(注意:当输出低电平时LED点亮)。 
- 
-{{ :​led电路连接.jpg |LED电路连接}} 
- 
-{{ :​图9.按键模块电路连接.png |按键模块电路连接}} 
-====代码设计==== 
----- 
-===设计文件=== 
- 
-{{ :​脉冲发生程序设计.jpg |脉冲发生程序设计}} 
- 
-我们在硬件连接中也提到了脉冲发生器设计需要的硬件资源作为接口外设,整个设计的接口定义如下: 
- 
-<code verilog> 
-input clk_in,​ 
-input rst_n_in,​ 
-input key_menu,​ 
-input key_up,​ 
-input key_down,​ 
-output menu_state,​ 
-output reg pulse_out 
-</​code>​ 
- 
-本设计中我们用到三个按键作为输入,需要对按键输入做消抖处理,消抖模块的原理及设计请参考[[按键消抖]]设计,这里我们以key_menu的消抖为例调用按键消抖模块,如下: 
- 
-<code verilog> 
-//Debounce for key_menu 
-Debounce Debounce_menu(.clk(clk_in),​.rst_n(rst_n_in),​.key_n(key_menu),​.key_state(menu_state)); ​ 
-</​code>​ 
- 
-对三路按键做消抖后的信号可以实现周期和脉宽的控制,本设计中我们的分频比范围为2~16分级可调,0%<​脉宽<​100%分级可调,控制脉宽参数duty要始终小于周期参数cycle,实现方法如下: 
- 
-<code verilog> 
-//Control cycle and duty cycle 
-always @(posedge clk_in or negedge rst_n_in) begin  
- if(!rst_n_in) begin  
- cycle<​=4'​d8;​ 
- duty<​=4'​d4;​ 
- end else begin 
- if(menu_state) begin 
- if(up_pulse && (cycle<​4'​d15)) cycle <= cycle + 4'd1; 
- else if(down_pulse && (cycle>​(duty+4'​d1))) cycle <= cycle - 4'd1; 
- else cycle <= cycle; 
- end else begin 
- if(up_pulse && (cycle>​(duty+4'​d1))) duty <= duty + 4'd1; 
- else if(down_pulse && (duty>​4'​d0)) duty <= duty - 4'd1; 
- else duty <= duty; 
- end 
- end  
-end 
-</​code>​ 
- 
-最后根据周期参数cycle控制计数器的计数范围,根据脉宽参数duty控制正电压脉冲的宽度,产生脉冲信号。 
- 
-<code verilog> 
-reg [3:​0] cnt;​ 
-//counter for cycle 
-always @(posedge clk_in or negedge rst_n_in) begin  
- if(!rst_n_in) begin  
- cnt<​=4'​d0;​ 
- end else begin 
- if(cnt>​=cycle) cnt<​=4'​d0;​ 
- else cnt <= cnt + 4'd1; 
- end  
-end  
- 
-//pulse generate with duty 
-always @(posedge clk_in or negedge rst_n_in) begin  
- if(!rst_n_in) begin  
- pulse_out<​=1'​b1;​ 
- end else begin 
- if(cnt<​=duty) pulse_out<​=1'​b1;​ 
- else pulse_out<​=1'​b0;​ 
- end  
-end  
-</​code>​ 
- 
-引脚分配如下: 
- 
-^ 管脚名称 | clk_in| rst_n_in| key_menu|key_up|key_down|menu_state|pulse_out| 
-^ FPGA管脚 | C1    | A2      | A12     ​|B8 ​   |A10     ​|A3 ​       |A7       | 
-====仿真结果==== 
- 
-{{:​序列检测仿真.jpg|序列检测仿真}} 
-====资源报告==== 
- 
-^ 资源 | 数量 ​ | 比例 ​ | 说明 ​ | 
-^ LUTs | 39   | 3%   ​| ​  |  
-^ 寄存器 | 28    | 2% |   | 
-^ 存储器 | 0  | 0%   ​| ​   | 
-^ IO管脚 ​  | 5 |   ​| ​   | 
-^ 时钟频率 | 25MHz |   ​| ​   | 
- 
-====知识点==== 
- 
-  * 分频设计 
-  * 时序控制 
-  * 简单状态机 
- 
- 
-====参考文档==== 
-  * {{:​machxo2familydatasheet.pdf|Lattice MachXO2数据手册}} 
-  
- 
-====相关文档==== 
- 
-^ **文件名称** ​ | **功能** | 
-^ **[[Serial_Detect.v]]** | **流水灯** | 
-^ **[[Serial_Detect_test.v]]** | **测试文件** |