差别

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

到此差别页面的链接

两侧同时换到之前的修订记录 前一修订版
后一修订版
前一修订版
脉冲发生器 [2016/06/14 09:47]
anran [硬件连接]
脉冲发生器 [2021/09/13 10:56]
gongyu 移除
行 24: 行 24:
 脉冲发生一般通过对一个高频的脉冲信号进行分频来生成。 脉冲发生一般通过对一个高频的脉冲信号进行分频来生成。
  
-分频比:指方波的周期和高频信号手气之间发的比例关系,通过控制分频比来生成不同频率的方波。例如,开发系统上的时钟频率是25MHz,如果要生成5MHz的方波,则分频比为5。+分频比:指方波的周期和高频信号周期之间发的比例关系,通过控制分频比来生成不同频率的方波。例如,开发系统上的时钟频率是25MHz,如果要生成5MHz的方波,则分频比为5。
  
  
行 43: 行 43:
 {{ :​led电路连接.jpg |LED电路连接}} {{ :​led电路连接.jpg |LED电路连接}}
  
-{{:​图9.按键模块电路连接.png|按键模块电路连接}}+{{ :​图9.按键模块电路连接.png |按键模块电路连接}}
 ====代码设计==== ====代码设计====
 ---- ----
 ===设计文件=== ===设计文件===
  
-{{ :序列检测状态转移图.jpg |序列检测状态转移图}}+{{ :脉冲发生程设计.jpg |脉冲发生程设计}}
  
-为了得到1Hz的信号,我们设计25位的计数cnt进行0.5s周期的循环数,同时clk_1hz信号进行翻转,这样就得到了序列检测时钟信号然后再以序列检测的时钟信号为触发条件进行状态机控制最终实现序列检测。+我们在硬件连接中也提到脉冲发生需要硬件资源作为接口外设整个设计接口定义如下:
  
-首先是计数器的设计,计数器的计数范围为0~CNT_NUM-1,设计文件代码中我们定义参数CNT_NUM为12500000但是在仿真文件调用设计文件时,为了方便仿真,我们会将参数CNT_NUM重新赋值为5.+<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>​ 
 + 
 +设计中我们用到三个按键作为输入,需要对按键输入做消抖处理消抖模块原理及设请参考[[按键消抖]]设计,这里我们增加了按键输入信号的位宽对三路按键输入做消抖处理  ​如下:
  
 <code verilog> <code verilog>
-reg [24:0] cnt = 25'd0+//Debounce for key 
-always@(posedge ​clk or negedge ​rst_n) ​begin +wire [2:0] key_state,​key_pulse
- if(!rst_nbegin +Debounce1 Debounce_uut 
- cnt <= 25'd0; +( 
- clk_1hz <= 1'​b0;​ +.clk(clk_in), 
- end else if(cnt>=(CNT_NUM-1)) begin +.rst_n(rst_n_in), 
- cnt <25'd0+.key_n({key_menu,​key_up,​key_down}), 
- clk_1hz <~clk_1hz+.key_state(key_state),​ 
- end else begin +.key_pulse(key_pulse) 
- cnt <cnt + 25'd1; +);  
- end + 
-end+wire menu_state ​key_state[0]
 +wire up_pulse ​key_pulse[1]
 +wire down_pulse ​key_pulse[2];
 </​code>​ </​code>​
  
-然后照状态机状态转移图实现状态机的设计+对三路键做消抖后信号可以实现周期和脉宽控制,本设计中我们的分频比范围为2~16分级可调,0%<​脉宽<​100%分级可调,控制脉宽参数duty要始终小于周期参数cycle, 
 +{{ ::​脉冲发生器原理.jpg |脉冲发生器原理}} 
 +实现方法如下:
  
 <code verilog> <code verilog>
-reg[1:​0]state;​ +//Control cycle and duty cycle 
-always @(posedge ​clk_1hz ​or negedge ​rst_n) begin  +always @(posedge ​clk_in ​or negedge ​rst_n_in) begin  
- if(!rst_n) begin  + if(!rst_n_in) begin  
- state<=s0+ cycle<=4'd8
- vout<=0;  + duty<=4'd4
- end else case(state) + end else begin 
- s0: begin + if(menu_state) begin 
- if(vin==0) begin state<​=s0;​vout<​=0;​ end  + if(up_pulse && (cycle<4'​d15)) cycle <= cycle + 4'd1
- else begin state<=s1;vout<=0end  + else if(down_pulse && (cycle>​(duty+4'​d1))) cycle <= cycle - 4'd1
- end   + else cycle <= cycle
- s1:​ begin + end else begin 
- if(vin==0begin state<=s2;vout<=0; end  + if(up_pulse && (cycle>​(duty+4'​d1))) duty <= duty + 4'd1; 
- else begin state<=s1;vout<=0; end  + else if(down_pulse && (duty>​4'​d0)) duty <= duty - 4'd1
- end   + else duty <= duty; 
- s2: begin + end 
- if(vin==0begin state<=s0;vout<=0end  + end 
- else begin state<=s1;​vout<​=1; end  +
- end   +
- default:​state<​=s0;​ +
- endcase ​+
 end end
 </​code>​ </​code>​
  
-我们在设中将序列检测时钟信号设为1Hz并且使用LED指示序列检测的时钟信号的变化,方便在板子上按键及观察输出的情况。 +最后根据周期参数cycle控制数器的计数范围根据脉宽参数duty控制正电压脉冲的宽度产生脉冲信号。
- +
-===测试文件=== +
- +
-测试文件中我们需要对设计文件中的参数CNT_NUM进行重新赋值同时对vin信号每400ns(序列检测时钟 = 系统时钟周期*分配系数*2 = 40*5*2 = 400ns)间隔取随机值+
  
 <code verilog> <code verilog>
-always ​vin # 400 $random;+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 
  
-wire clk_1hz,​vout;​ +//pulse generate with duty 
-Serial_Detect # +always @(posedge clk_in or negedge rst_n_in) begin  
-+ if(!rst_n_inbegin  
-.CNT_NUM(CNT_NUM+ pulse_out<​=1'​b1;​ 
-) + end else begin 
-Serial_Detect_uut + if(cnt<​=dutypulse_out<​=1'​b1;​ 
-( + else pulse_out<​=1'​b0;​ 
-.clk(sys_clk), + end  
-.rst_n(sys_rst_n),​ +end 
-.vin(vin), +
-.clk_1hz(clk_1hz),​ +
-.vout(vout) +
-);+
 </​code>​ </​code>​
  
 引脚分配如下: 引脚分配如下:
  
-^ 管脚名称 | clkrst_n vin  ​|clk_1hz  ​|vout +^ 管脚名称 | clk_inrst_n_inkey_menu|key_up|key_down|menu_state|pulse_out
-^ FPGA管脚 | C1 | A2 |B7  ​|A3  |A7  +^ FPGA管脚 | C1    | A2      | A12     ​|B8 ​   ​|A10     |A3        |A7       ​
-====仿真结果====+====运行结果====
  
-{{:序列检测仿真.jpg|序列检仿真}}+{{:img20160614134850.jpg?​500 |LED灯亮度}} 
 + 
 +{{:​img20160614135014.jpg?500|示波器量结果}}
 ====资源报告==== ====资源报告====
  
 ^ 资源 | 数量 ​ | 比例 ​ | 说明 ​ | ^ 资源 | 数量 ​ | 比例 ​ | 说明 ​ |
-^ LUTs | 39   | 3  ​|   |  +^ LUTs | 65   | 5   |   |  
-^ 寄存器 | 28    ​| ​2% |   |+^ 寄存器 | 42    ​| ​3% |   |
 ^ 存储器 | 0  | 0%   ​| ​   | ^ 存储器 | 0  | 0%   ​| ​   |
-^ IO管脚 ​  ​| ​|   ​| ​   |+^ IO管脚 ​  ​| ​|   ​| ​   |
 ^ 时钟频率 | 25MHz |   ​| ​   | ^ 时钟频率 | 25MHz |   ​| ​   |
  
 ====知识点==== ====知识点====
  
-  * 分频设计 +  * 按键消抖 
-  * 时序控制 +  * PWM脉宽调节 
-  * 简单状态机+  * 脉冲发生原理
  
  
 ====参考文档==== ====参考文档====
 +  * [[按键消抖]]
   * {{:​machxo2familydatasheet.pdf|Lattice MachXO2数据手册}}   * {{:​machxo2familydatasheet.pdf|Lattice MachXO2数据手册}}
 +
    
  
行 149: 行 164:
  
 ^ **文件名称** ​ | **功能** | ^ **文件名称** ​ | **功能** |
-^ **[[Serial_Detect.v]]** | **流水灯** | +^ **[[Pulse_gen.v]]** | **脉冲发生器TOP文件** | 
-^ **[[Serial_Detect_test.v]]** | **测试文件** |+^ **[[Debounce1.v]]** | **按键消抖** |