verilog实战实例

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实战实例 玩转LED 玩转
Verilog程序 程序
always @ (posedge led_clk, negedge Q_KEY) if (!Q_KEY) // 复位后右移 led_r <= 8'h01; else // 根据 ,左右移位,注意 根据dir,左右移位,注意LED实际以为方向与 实际以为方向与led_r移位方向相反 实际以为方向与 移位方向相反 // 因为开发板上 因为开发板上LED[1]在左,LED[8]在右 在左, 在左 在右 if(!dir) led_r <= led_r << 1; // LED右移 右移 else led_r <= led_r >> 1; // LED左移 左移 // 为什么要取反? 因为开发板上的 为什么要取反? 因为开发板上的LED是送 亮,送1灭 是送0亮 是送 灭 assign LED = ~led_r; // 寄存器输出 endmodule
跑马灯
实战实例 玩转LED 玩转
Verilog程序 程序
reg [8:1] led_r; reg dir; // 定义输出寄存器 // 循环方向控制
流水灯
always @ (posedge led_clk, negedge Q_KEY) if (!Q_KEY) // 复位后右移 dir <= 0; else // 到达左右端点否?到达则换向 到达左右端点否? if(led_r == 8'h7F && dir == 0) dir <= 1; else if(led_r == 8'h01 && dir == 1) dir <= 0;
不消抖效果
实战实例 按键消抖试验
消抖原理
?如何消抖
理想波形
人在按键时, 人在按键时, 存在触点抖 动现象
实际波形 按下抖动 释放抖动
实战实例 按键消抖试验
Verilog程序 程序
module key_debounce( input i_clk, input i_rst_n, input [4:1] i_key, // 按下为 ,松开为 按下为0,松开为1 output reg [4:1] o_key_val // 键值 ); //++++++++++++++++++++++++++++++++++++++ reg [4:1] key_samp1, key_samp1_locked; // 将i_key采集至 采集至key_samp1 采集至 always @ (posedge i_clk, negedge i_rst_n) if(!i_rst_n) key_samp1 <= 4'hF; else key_samp1 <= i_key;
?如何消抖
实战实例 按键消抖试验
Verilog程序 程序 //++++++++++++++++++++++++++++++++++++++ // 每次按键稳定后,输出键值 每次按键稳定后, // 按下为 ,松开为 按下为0,松开为1 always @ (posedge i_clk, negedge i_rst_n) if(!i_rst_n) o_key_val <= 4'hF; else o_key_val <= ~key_changed2; //-------------------------------------endmodule
流水灯
实战实例 按键消抖试验
Verilog程序 程序 module key_led( input CLOCK_50, input Q_KEY, input [4:1] KEY, output reg [4:1] LED ); wire [4:1] key_val; assign key_val = KEY;
?如何消抖
实战实例 按键消抖试验
Verilog程序 程序
?如何消抖
module key_led( input CLOCK_50, input Q_KEY, input [4:1] KEY, output reg [4:1] LED );
实战实例 按键消抖试验
Verilog程序 程序
//++++++++++++++++++++++++++++++++++++++ // 获取键值 开始 //++++++++++++++++++++++++++++++++++++++ wire [4:1] key_val; // 键值 key_debounce u0( .i_clk(CLOCK_50), .i_rst_n(Q_KEY), .i_key(KEY), .o_key_val(key_val) ); //-------------------------------------// 获取键值 结束 //--------------------------------------
实战实例 玩转LED 玩转
Verilog程序 程序
`timescale 1 ns/10 ps module rider_led( input CLOCK_50, input Q_KEY, output [8:1] LED );
跑马灯
// 板载时钟50MHz // 板载按键RST // LED[1] ~ LED[8]
不消抖效果
// 0亮1灭 亮 灭
// 键值 // KEY按下为 ,松开为 按下为0,松开为1 按下为
实战实例 按键消抖试验
Verilog程序 程序
always @ (posedge CLOCK_50, negedge Q_KEY) if (!Q_KEY) LED <= 4'hF; // 0灭1亮 灭 亮 else case (1'b0) key_val[1] : LED[1] <= ~LED[1]; key_val[2] : LED[2] <= ~LED[2]; key_val[3] : LED[3] <= ~LED[3]; key_val[4] : LED[4] <= ~LED[4]; default : LED <= LED ; // 缺省亮灭情况不变 endcase endmodule
?如何消抖
实战实例 按键消抖试验
Verilog程序 程序
?如何消抖
// 将key_samp2锁存至key_samp2_locked key_samp2锁存至 锁存至key_samp2_locked always @ (posedge i_clk, negedge i_rst_n) if(!i_rst_n) key_samp2_locked <= 4'hF; else key_samp2_locked <= key_samp2; //--------------------------------------
?如何消抖
实战实例 按键消抖试验
Verilog程序 程序
//++++++++++++++++++++++++++++++++++++++ reg [19:0] cnt; // 一旦有按键按下,cnt立即被清零 一旦有按键按下, 立即被清零 always @ (posedge i_clk, negedge i_rst_n) if(!i_rst_n) cnt <= 20'h0; else if(key_changed1) cnt <= 20'h0; else cnt <= cnt + 1'b1; //--------------------------------------
实战实例 玩转LED 玩转
Verilog程序 程序
//++++++++++++++++++++++++++++++++++++++ // 分频部分 开始 //++++++++++++++++++++++++++++++++++++++ reg [23:0] cnt; // 计数子 // 溢出后自动重新计数 always @ (posedge CLOCK_50, negedge Q_KEY) if (!Q_KEY) cnt <= 0; else cnt <= cnt + 1'b1; wire led_clk = cnt[23]; // 每(2^24/50M = 0.3355)sec取一次 取一次 //-------------------------------------// 分频部分 结束 //--------------------------------------
实战实例 按键消抖试验
Verilog程序 程序 //++++++++++++++++++++++++++++++++++++++ wire [4:1] key_changed2; // 当key_samp2由1变为 时 变为0时 由 变为 // key_changed2由0变为 ,只维持一个时钟周期 变为1, 由 变为 assign key_changed2 = key_samp2_locked & (~key_samp2); //--------------------------------------
实战实例 玩转LED 玩转
Verilog程序 程序
always @ (posedge led_clk, negedge Q_KEY) if (!Q_KEY) // 复位后右移 led_r <= 8'h01; else // 根据 ,左右移位,注意:LED实际移位方向与 根据dir,左右移位,注意: 实际移位方向与led_r移位方向相反 实际移位方向与 移位方向相反 // 因为开发板上 因为开发板上LED[1]在左,LED[8]在右 在左, 在左 在右 if(!dir) led_r <= (led_r << 1) + 1'b1; // LED右移;加法比移位的运算优先级高 右移; 右移 else led_r <= (led_r >> 1); // LED左移 左移 // 为什么要取反?因为开发板上的 为什么要取反?因为开发板上的LED是送 亮,送1灭 是送0亮 是送 灭 assign LED = ~led_r; // 寄存器输出 endmodule
跑马灯
实战实例 玩转LED 玩转
Verilog程序 程序
reg [8:1] led_r; reg dir; // 定义输出寄存器 // 循环方向控制;上电缺省值为 循环方向控制;上电缺省值为0
跑马灯
always @ (posedge led_clk, negedge Q_KEY) if (!Q_KEY) // 复位后右移 dir <= 0; else // 到达左右端点否?到达则换向 到达左右端点否? if(l百度文库d_r[7]) // led_r == 8'h40 dir <= 1; else if(led_r[2]) // led_r == 8'b02 dir <= 0;
?如何消抖
实战实例 按键消抖试验
Verilog程序 程序 //++++++++++++++++++++++++++++++++++++++ reg [4:1] key_samp2, key_samp2_locked; // 只有当按键不变化(不抖动),且维持 只有当按键不变化(不抖动),且维持20ms以上时 ),且维持 以上时 // 才将 才将i_key采集至 采集至key_samp2 采集至 always @ (posedge i_clk, negedge i_rst_n) if(!i_rst_n) key_samp2 <= 4'hF; else if(cnt == 20'hF_FFFF) // 0xFFFFF/50M =20.9715ms key_samp2 <= i_key;
?如何消抖
实战实例 按键消抖试验
Verilog程序 程序
// 将key_samp1锁存至 锁存至key_samp1_locked 锁存至 always @ (posedge i_clk, negedge i_rst_n) if(!i_rst_n) key_samp1_locked <= 4'hF; else key_samp1_locked <= key_samp1; //-------------------------------------//++++++++++++++++++++++++++++++++++++++ wire [4:1] key_changed1; // 当key_samp1由1变为 时 变为0时 由 变为 // key_changed1由0变为 ,只维持一个时钟周期 变为1, 由 变为 assign key_changed1 = key_samp1_locked & (~key_samp1); //-------------------------------------//++++++++++++++++++++++++++++++++++++++
相关文档
最新文档