verilog版的1602+ps2

  • 该代码为本人课设时所写,参考网上各个信息加本人修改所作,可以直接使用

该代码为本人课设时所写,参考网上各个信息加本人修改所作,可以直接使用

// ps2scan.v
module ps2scan(clk,rst_n,ps2k_clk,ps2k_data,ps2_byte,ps2_state);input clk; //20M时钟信号input rst_n; //复位信号input ps2k_clk; //PS2接口时钟信号input ps2k_data; //PS2接口数据信号output[7:0] ps2_byte; // 1byte键值,只做简单的按键扫描output ps2_state; //键盘当前状态,ps2_state=1表示有键被按下 //------------------------------------------reg ps2k_clk_r0,ps2k_clk_r1,ps2k_clk_r2; //ps2k_clk状态寄存器//wire pos_ps2k_clk; // ps2k_clk上升沿标志位wire neg_ps2k_clk; // ps2k_clk下降沿标志位always @ (posedge clk or negedge rst_n) beginif(!rst_n)beginps2k_clk_r0 <= 1'b0;ps2k_clk_r1 <= 1'b0;ps2k_clk_r2 <= 1'b0;endelse begin //锁存状态,进行滤波ps2k_clk_r0 <= ps2k_clk;ps2k_clk_r1 <= ps2k_clk_r0;ps2k_clk_r2 <= ps2k_clk_r1;endendassign neg_ps2k_clk = ~ps2k_clk_r1 & ps2k_clk_r2; //下降沿//------------------------------------------reg[7:0] ps2_byte_r; //PC接收来自PS2的一个字节数据存储器reg[7:0] temp_data; //当前接收数据寄存器reg[3:0] num; //计数寄存器always @ (posedge clk or negedge rst_n)beginif(!rst_n)beginnum <= 4'd0;temp_data <= 8'd0;endelse if(neg_ps2k_clk) begin //检测到ps2k_clk的下降沿case(num)4'd0: num <= num+1'b1;4'd1: beginnum <= num+1'b1;temp_data[0] <= ps2k_data; //bit0end4'd2: beginnum <= num+1'b1;temp_data[1] <= ps2k_data; //bit1end4'd3: beginnum <= num+1'b1;temp_data[2] <= ps2k_data; //bit2end4'd4: beginnum <= num+1'b1;temp_data[3] <= ps2k_data; //bit3end4'd5: beginnum <= num+1'b1;temp_data[4] <= ps2k_data; //bit4end4'd6: beginnum <= num+1'b1;temp_data[5] <= ps2k_data; //bit5end4'd7: beginnum <= num+1'b1;temp_data[6] <= ps2k_data; //bit6end4'd8: beginnum <= num+1'b1;temp_data[7] <= ps2k_data; //bit7end4'd9: beginnum <= num+1'b1; //奇偶校验位,不做处理end4'd10: beginnum <= 4'd0; // num清零enddefault: ;endcaseend endreg key_f0; //松键标志位,置1表示接收到数据8'hf0,再接收到下一个数据后清零reg ps2_state_r; //键盘当前状态,ps2_state_r=1表示有键被按下 always @ (posedge clk or negedge rst_n)begin //接收数据的相应处理,这里只对1byte的键值进行处理if(!rst_n) beginkey_f0 <= 1'b0;ps2_state_r <= 1'b0;endelse if(num==4'd10) begin //刚传送完一个字节数据if(temp_data == 8'hf0) key_f0 <= 1'b1;else beginif(!key_f0) begin //说明有键按下ps2_state_r <= 1'b1;ps2_byte_r <= temp_data; //锁存当前键值endelse beginps2_state_r <= 1'b0;key_f0 <= 1'b0;endendendendreg[7:0] ps2_asci; //接收数据的相应ASCII码always @(ps2_byte_r) begincase (ps2_byte_r) //键值转换为ASCII码,这里做的比较简单,只处理字母8'h15: ps2_asci <= "q"; //Q8'h1d: ps2_asci <= "w"; //W8'h24: ps2_asci <= "e"; //E8'h2d: ps2_asci <= "r"; //R8'h2c: ps2_asci <= "t"; //T8'h35: ps2_asci <= "y"; //Y8'h3c: ps2_asci <= "u"; //U8'h43: ps2_asci <= "i"; //I8'h44: ps2_asci <= "o"; //O8'h4d: ps2_asci <= "p"; //P 8'h1c: ps2_asci <= "a"; //A8'h1b: ps2_asci <= "s"; //S8'h23: ps2_asci <= "d"; //D8'h2b: ps2_asci <= "f"; //F8'h34: ps2_asci <= "g"; //G8'h33: ps2_asci <= "h"; //H8'h3b: ps2_asci <= "j"; //J8'h42: ps2_asci <= "k"; //K8'h4b: ps2_asci <= "l"; //L8'h1a: ps2_asci <= "z"; //Z8'h22: ps2_asci <= "x"; //X8'h21: ps2_asci <= "c"; //C8'h2a: ps2_asci <= "v"; //V8'h32: ps2_asci <= "b"; //B8'h31: ps2_asci <= "n"; //N8'h3a: ps2_asci <= "m"; //M8'h45: ps2_asci <= "0"; //08'h16: ps2_asci <= "1"; //18'h1e: ps2_asci <= "2"; //28'h26: ps2_asci <= "3"; //38'h25: ps2_asci <= "4"; //48'h2e: ps2_asci <= "5"; //58'h36: ps2_asci <= "6"; //68'h3d: ps2_asci <= "7"; //78'h3e: ps2_asci <= "8"; //88'h46: ps2_asci <= "9"; //9default: ;endcaseendassign ps2_byte = ps2_asci; assign ps2_state = ps2_state_r;endmodule
// lcd1602.v
`include "ps2scan.v"
`define LINE_1 16
`define LINE_2 32module lcd1602(clk20m,CLK,DATA,reset,LCD_DATA,LCD_RW,LCD_EN,LCD_RS);
input clk20m,CLK,DATA,reset;
output [7:0] LCD_DATA;
output LCD_RW,LCD_EN,LCD_RS;wire[7:0] ps2_byte;
wire ps2_state;
reg[7:0] ps2_data[31:0];
reg[5:0] i;
ps2scan ReadByte(.clk(clk20m),.rst_n(reset),.ps2k_clk(CLK),.ps2k_data(DATA),.ps2_byte(ps2_byte),.ps2_state(ps2_state)); always @(negedge ps2_state or negedge reset) begin  if(!reset)i<=0;else if(i<=6'd31)beginps2_data[i]<=ps2_byte;i<=i+1'b1;endelsebegini<=6'd1;;ps2_data[0]<=ps2_byte;endend reg LCD_RS;
reg [7:0] LCD_DATA;
reg LCD_CLOCK;
reg[21:0] count;
reg [9:0] state;
reg [5:0] char_count=0;
reg [7:0] data_display;parameter     IDLE=10'b00_0000_0000;
parameter    CLEAR=10'b00_0000_0001;
parameter   RETURN=10'b00_0000_0010;
parameter     MODE=10'b00_0000_0100;
parameter  DISPLAY=10'b00_0000_1000;
parameter    SHIFT=10'b00_0001_0000;
parameter FUNCTION=10'b00_0010_0000;
parameter    CGRAM=10'b00_0100_0000;
parameter    DDRAM=10'b00_1000_0000;
parameter    WRITE=10'b01_0000_0000;
parameter     STOP=10'b10_0000_0000;assign LCD_RW=1'b0;
assign LCD_EN=LCD_CLOCK;always @(posedge clk20m or negedge reset)
begin if(!reset)begincount <= 22'b0;LCD_CLOCK <= 1'b0;endelse if(count==39999)//4ms zhouqibegincount <= 22'b0;LCD_CLOCK <= ~LCD_CLOCK;endelsecount <= count + 1'b1;
endalways @(posedge LCD_CLOCK or negedge reset)
begin if(!reset)LCD_RS <= 1'b0;else if(state==WRITE)LCD_RS <= 1'b1;elseLCD_RS <= 1'b0;
endalways @(posedge LCD_CLOCK or negedge reset)
beginif(!reset)beginstate <= IDLE;LCD_DATA <= 8'bzzzz_zzzz;char_count<=6'd0;endelse begincase(state)IDLE:beginstate <= CLEAR;LCD_DATA <= 8'bzzzz_zzzz;endCLEAR:beginstate <= RETURN;LCD_DATA <= 8'b0000_0001;end RETURN:beginstate <= MODE;LCD_DATA <= 8'b0000_0010;end    MODE:beginstate <= DISPLAY;LCD_DATA <= 8'b0000_0110;end    DISPLAY:beginstate <= SHIFT;LCD_DATA <= 8'b0000_1100;end    SHIFT:beginstate <= FUNCTION;LCD_DATA <= 8'b0001_0100;end    FUNCTION:beginstate <= DDRAM;LCD_DATA <= 8'b0011_1000;end    DDRAM:beginif(i==0)beginstate <= DDRAM;LCD_DATA <= 8'b1000_0000;end else if((char_count==`LINE_1)&&(char_count!=i))beginstate <= WRITE;LCD_DATA <= 8'b1100_0000;                 endelsebeginstate <= WRITE;LCD_DATA <= 8'b1000_0000;char_count <=0;end    end    WRITE:beginif((char_count+1'b1==`LINE_1)||(char_count+1'b1==`LINE_2)||(char_count+1'b1==i))state <= DDRAM;else                state <= WRITE;char_count <= char_count +1'b1;LCD_DATA <= ps2_data[char_count];end //STOP: state <=STOP;default:state <= IDLE;     endcase   end
end
endmodule

verilog版的1602+ps2相关推荐

  1. verilog存小数_FPGA定点小数计算(Verilog版)第二篇——乘法运算

    发布一下这两天的成果,用Verilog实现的FPGA定点小数计算,一共有N篇,包括加法.乘法.除法.平方根.平方等--目前加法.乘法已完成调试,除法.平方根和平方等尚未完成--时间仓促,此次博文直接贴 ...

  2. 基于Quartus II+ModelSim SE的后仿真(Verilog版)

    基于Quartus II+ModelSim SE的后仿真(Verilog版) 一.Quartus 中的相关设置 在Quartus中建立名为counter的工程,设置仿真工具为ModelSim(Veri ...

  3. FPGA自学笔记--串口通信发送多字节数据(verilog版)

    1.需求分析 关于uart协议实现这部分大家可以参考我上一篇的博客.<FPGA自学笔记--串口通信实现(vivado&verilog版)>.在上一篇博客中,主要实现了将单字节的数据 ...

  4. QA:xilinx系列verilog版出版事宜

    Q: 杜勇老师,您好!请问您第二版xilinx系列的书可以用Verilog语言写吗? A: 近期没有打算出Xilinx的Verilog版.Altera/Verilog版已经出版过了.目前滤波器的Alt ...

  5. ps2模拟器安卓版_安卓PS2模拟器游戏推荐:奥特曼格斗进化3

    好久不见了,最近有网友后台私信我,说自己下载了安卓版的PS2模拟器,有什么游戏好玩,能不能推荐一下,怎么说,其实PS2有很多好玩的游戏,现在说一个我比较喜欢玩的奥特曼游戏吧,这个游戏名字叫做<奥 ...

  6. 【连载】【FPGA黑金开发板】Verilog HDL那些事儿--PS2解码(九)

    声明:本文转载于http://www.cnblogs.com/kingst,版权归akuei2及黑金动力社区(http://www.heijin.org)共同所有. 3.2 实验八:PS2解码 PS2 ...

  7. FPGA定点小数计算(Verilog版)第七篇——平方根倒数运算(使用John Carmack方法)

    更多精彩内容,请微信搜索"FPGAer俱乐部"关注我们. 有一段时间没有写博客了,突然想起前一段时间挖的坑,所以决定今天来填一下--其实,这一篇原本打算写的是采用牛顿迭代法的平方根 ...

  8. lms算法的verilog实现_数字通信同步技术的MATLAB与FPGA实现

    <数字通信同步技术的MATLAB与FPGA实现>包含2个版本:Xilinx/VHDL版的设计平台为ISE14.7/VHDL,配套开发板为CXD301:Altera/Verilog版(第2版 ...

  9. 新书预告:Xilix FPGA数字信号处理设计——基础版

    掌握FPGA数字信号处理设计需满足三个条件:熟悉FPGA设计方法.理解数字信号处理理论.掌握理论的工程实现方法.对初学者来讲,每个条件看似都难以逾越.杜勇老师完美融合课程教学与工程设计的需求特点,以独 ...

最新文章

  1. pandas 排序_懂Excel就能轻松入门Python数据分析包pandas(六):排序
  2. impacket安装 python_Impacket网络协议工具包介绍
  3. Rabbitmq - 配置
  4. 爬虫(十二):scrapy中spiders的用法
  5. 设计模式再学习之单例模式
  6. Java Script 第09章 Ajax应用
  7. python解析.he4文件
  8. PCL编程笔记——Assertion `px != 0' failed.
  9. 创建模块化程序(三)
  10. 学习数据库必须掌握的54条SQL查询语句
  11. 64qam带宽计算_64QAM有效传输速率计算
  12. Tomcat8配置SSL证书
  13. 【Unreal】关于实时编码(live coding)退出UE编辑器C++ Class消失的问题
  14. java io和nio的区别_IO与NIO的区别
  15. 使用uniapp微信公众号和小程序踩坑全过程
  16. OSChina 周二乱弹 —— 代码中的坑是怎么出现的?
  17. 期货什么是涨跌(期货是看涨还是看跌)
  18. 计算机启动后没有桌面,电脑开机后桌面上什么都没有是为什么,怎么办
  19. 信道估计中的导频结构
  20. 多多自走棋改动_《多多自走棋》 更新,几大改动来袭,一个改动让玩家无奈!...

热门文章

  1. 例题(8.3) 求一元二次方程的根 (1051)
  2. html文件太大,怎样压缩文件(文件太大怎么办)
  3. 如何挖到人生当中第一本CNVD
  4. c语言如何让字符串变成空字符,C语言初始化字符串 c语言 如何将已赋值的字符串初始化为空?...
  5. 2017 ACM ICPC Asia Regional - Daejeon
  6. CO-PA: 获利能力分析之特征值派生 - KEDR / KEDB
  7. 个人网站真能转成商业网站,你能么?
  8. 用JavaScript写的一个摇号程序(随机数)
  9. 基于unity3D的趣味桌球游戏开发
  10. Nanopore测序技术