基于FPGA设计的贪吃蛇小游戏实验课程设计报告+quartus9.1工程源码,可以做为你的学习设计参考。 摘 要 本次电子技术基础课程设计了贪吃蛇游戏,实现了用FPGA来驱动VGA显示贪吃蛇游戏。贪吃蛇的游戏规则是玩家使用PS2键盘操控一条蛇上下左右移动不断吞下苹果,吃下一个苹果蛇身增长一节,当蛇头撞到蛇身或障壁时游戏结束。本课程设计采用Verilog HDL语言编写,涉及到VGA显示,PS2键盘操控,状态机等相关知识。 关键词:FPGA;VGA;PS2;贪吃蛇;Verilog HDL 2.1 游戏设计内容及要求 基本要求: ① 利用FPGA开发板、VGA显示器、PS2键盘实现贪吃蛇游戏。 ② 一条蛇可以看成由许多正方形的“小格子”拼凑成,称作节。节是蛇身上最小的单位。蛇的初始长度确定。 ③ 蛇的初始位置及方向由FPGA开发板随机生成,每次游戏预送100分。 ④ 用户使用开发板键盘及PS2键盘可控制蛇头的方向及速度。蛇在屏幕中运动每安全度过1秒加1分,静止状态每过1秒减1分,当游戏达到200分时自动进入游戏下一关,当游戏分值自动减为0时游戏失败终止。 ⑤ 当贪吃蛇触壁则失败。 ⑥ 实现游戏蛇身变换及游戏积分的自动动态显示。 2.2 系统分析 贪吃蛇是经典小游戏,本设计采用VGA显示的方式将游戏展现出来。游戏中玩家通过四个按键控制蛇的身体上下左右移动来吃屏幕中出现的苹果,苹果是随机出现的。当蛇吃的一个苹果时,蛇身体变长一个单位同时会有另一个苹果出现。如果蛇头撞墙或者撞到自己身体,则游戏失败。 所要设计的贪吃蛇游戏基于Cyclone III系列EP3C5E114C8N的FPGA芯片为硬件,采用Verilog HDL语言编写程序。在本设计中,有个8按键,分别是上、下、左、右、复位和游戏开始,暂停与继续按键。它们都是输入信号,输出是VGA,在电脑屏幕实现VGA显示字符,游戏画面 第3章 贪吃蛇游戏设计 3.1 VGA显示模块设计 显示器扫描方式分为逐行扫描和隔行扫描:逐行扫描是扫描从屏幕左上角一点开始,从左像右逐点扫描,每扫描完一行,电子束回到屏幕的左边下一行的起始位置,在这期间,CRT对电子束进行消隐,每行结束时,用行同步信号进行同步;当扫描完所有的行,形成一帧,用场同步信号进行场同步,并使扫描回到屏幕左上方,同时进行场消隐,开始下一帧。   完成一行扫描的时间称为水平扫描时间,其倒数称为行频率;完成一帧(整屏)扫描的时间称为垂直扫描时间,其倒数称为场频率,即刷新一屏的频率,常见的有60Hz,75Hz等等。标准的VGA显示的场频60Hz,行频31.5KHz。 行场消隐信号:是针对老式显像管的成像扫描电路而
Verilog电子课程设计-洗衣机控制器fpga设计实现文档+quartus9.1工程源码文件,可以做为你的学习设计参考。 一、课程设计名称 智能洗衣机控制器的设计 二、设计内容与要求 ① 设计一个智能洗衣机控制器,能够实现洗衣,漂洗和脱水的功能。 ②要求能够使用按键模拟对洗衣机的控制,能够设置工作模式,为了便于观察,将洗衣机设定的工作模式(1~5)和整个过程所剩的工作时间用数码管显示出来(时间分辨率为1分钟),能够将洗衣机当前所处的状态(注水,洗衣,排水,甩干)用发光管或者数码管显示出来。 【模式1】 :洗衣模式--强力洗( 洗衣30分钟) 【模式2】 :洗衣模式--普通洗(洗衣20分钟) 【模式3】 :洗衣模式--轻柔洗(洗衣10分钟) 【模式4】 :漂洗模式 【模式5】 :甩干模式 注:在以上5个模式中,每次注水1分钟,漂洗5分钟,排水1分钟,甩干1分钟,模式1~3的洗衣时间如上所示,具体的洗衣步骤如下: 【模式1~3】:注水->洗衣->排水->甩干->注水->漂洗->排水->甩干 ->注水->漂洗->排水->甩干。 【模式4】:注水->漂洗->排水->甩干->注水->漂洗->排水->甩干。 【模式5】:甩干。 【要求】:实现逻辑控制过程,可以选择性的加入注水口无水报警等人性化的状态提示,操作完毕使用蜂鸣器鸣叫两秒提示。 ③ 画出洗衣机控制器的状态机,写出状态编码方案。 ④ 用Verilog语言对设计进行描述,设计一个测试方案,并能够下载到实验板上调试成功。 3.输入输出设计(按键,数码管,LCD,键盘,蜂鸣器) (1)输出显示部分: A.LCD显示屏(拓展):用于显示洗衣机出于何种工作模式,采用的型号为1602显示屏,4位数据输入,接5V供电电源。 模块: lcd lcd(R, clk, LCD_E, LCD_RW, LCD_RS, SF_D); lcd_pre lcd_pre(clk, state_dis, R); 显示内容: 7'b1100000: R <= " Strong "; 强力洗 7'b1000000: R <= " Middle "; 普通洗 7'b0100000: R <= " Soft "; 轻柔洗 7'b0010000: R <= " Add "; 注水 7'b0001000: R <= " Potch "; 漂洗 7'b0000100: R <= " Drain "; 排水 7'b0000010: R <= " Dry "; 甩干 7'b0000001: R <= " Finish "; 完成 default R <= " Welcome "; 初始状态 B.数码管:用于显示剩余时间,使用开发板自带的4个数码管。将四位时间分别写入四个数码管中。 (2)输入控制部分: 拨码开关(8个键):5个键控制5种模式,复位键(reset1)个,时间速度控制键1个,无水警报键1个; 模块: Module act(clk1,clk2,clk_sel,clr,sel,warn,state_dis,dis_ts1,dis_ts2,dis_tm1,dis_tm2,LEDW); 4.核心运算模块 (1)时序控制: 通过设置tm1,tm2,ts1,ts2四个变量,对每个状态进行计时,达到时序控制的作用。 B.状态转换:
电子设计课设报告-基于CYCLONE FPGA设计的出租车计价器+Quartus9.1工程源码, 1.引言: 随着EDA技术的高速发展,电子系统的设计技术发生了深刻的变化,大规模可编程逻辑器件CPLD/FPGA的出现,给设计人员带来了诸多方便。利用它进行产品开发,不仅成本低、周期短、可靠性高,而且具有完全的知识产权。本文介绍了一个以Altera公司可编程逻辑芯片cyclone2系列的EP2C5T144C8的fpga芯片为控制核心、附加一定外围电路组成的出租车计费器系统。随着社会的不断进步,人们生活水平的不断提高,出租车逐渐成为人们日常生活不可缺少的交通工具。而计价器作为出租车的一个重要组成部分,关系着出租车司机和乘客双方利益,起着重要的作用,因而出租车计价器的发展非常迅猛。 2.系统规范: 2.1 出租车计价器的要求: 该计价器的计费系统:行程 3公里(不含3公里)内,且等待累计时间2分钟内(不含2分钟),起步费为10元;3公里外以每公里1.6元计费,等待累计时间2分钟外以每分钟以1.5元计费。 并能显示行驶公里数、等待累计时间、总费用。 主要技术指标 计价范围:0~999.9元 计价分辨率: 0.1元 计程范围:0~99公里 计程分辨率: 1公里 计时范围:0~59分 计时分辨率: 分 2.2 ,系统组成框图: 出租车的一般计费过程为:出租车载客后,启动计费器,整个系统开始运行,里程计数器和时间计数器从0开始计数,费用计数器从6开始计算。再根据行驶里程或停止等待的时间按以上的标准计费。若在行驶状态,则计程器开始加计数,当路程超过二公里后,计费器以每公里1.6元累加。若出租车停止等待状态,则计时器开始加计数,当时间超过三分钟后,计费器以每分钟1.2元累加。出租车到达目的地停止后,停止计费器,显示总费用。 根据出租车计费器的工作过程,本系统采用分层次、分模块的方式设计,其本系统组成框图如下所示。其中行驶路程计数模块、等待时间计数模块和计费模块,用来统计路程、等待时间 和总费用,控制模块是用来控制计费模块,数码管显示模块用来显示行驶的公里数、等待累计时间和总费用等信息。系统框图如下所示: .各模块设计: 本系统采用层次化、模块化的设计方法,设计顺序为自下向上。首先实现系统框图中的各子模块,然后由顶层模块调用各子模块来完成整个系统。为了便于显示,这里的路程、时间和费用计数器均用十六进制表示。 (1)顶层模块 /*顶层模块变量定义 reset 0为复位,1为启动 stop 0为运行,1为停止 start 0为暂停,1为行驶 clk_count 为轮胎传感器发出的表示转一圈的脉冲信号,实验时用为1024hz时钟信号 clk_1khz 系统工作的主要时钟信号,实验用1024hz时钟信号 clk 时间模块的时钟信号,实验用8hz时钟信号 timeh,timel 分钟的十位和个位 distanceh,distancel 公里的十位和个位 bai,shi,ge,xiao 费用的十位和个位 */ module taxi(reset,start,stop,clk0,seg1,seg2,seg3,seg4,change,); input reset,start,stop,change,clk0; output [6:0] seg1,seg2,seg3,seg4; wire time_enable,distance_enable,select_clk,km,clk_count,clk,clk_1khz; reg [3:0]view1,view2,view3,view4; wire [3:0] timeh,timel,bai,ge,shi,xiao,distanceh,distancel; time_count u8(clk,reset,start,stop,timel,timeh,time_enable); km_count u1(.clk_count(clk_count),.reset(reset),.start(start),.km(km)); distance u2(.clk_1khz(clk_1khz),.start(start),.reset(reset),.stop(stop),.distancel(distancel),.distanceh(distanceh),.km(km),.distance_enable(distance_enable)); select_clk u3(.clk_1khz(clk_1khz),.reset(reset),.start(start),.stop(stop),.time_enable(time_enable),.km(km),.select
基于cyclone3 FPGA设计的智能洗衣机控制器课设报告文档+quartus9.1工程源码文件,可以做为你的学习设计参考。 1.课程设计名称及开发环境 题 目:智能洗衣机控制器的设计; 开发环境:本课设是基于DE0的板子,使用Verilog HDL开发的。 2.参考设计内容与要求 ① 设计一个智能洗衣机控制器,能够实现洗衣,漂洗和脱水的功能。 ②要求能够使用按键模拟对洗衣机的控制,能够设置工作模式,为了便于观察,将洗衣机设定的工作模式(1~5)和整个过程所剩的工作时间用数码管显示出来(时间分辨率为1分钟),能够将洗衣机当前所处的状态(注水,洗衣,排水,甩干)用发光管或者数码管显示出来。 【模式1】: 洗衣模式--强力洗( 洗衣30分钟) 【模式2】 :洗衣模式--普通洗 (洗衣20分钟) 【模式3】 :洗衣模式--轻柔洗(洗衣10分钟) 【模式4】 :漂洗模式 【模式5】 :甩干模式 注:在以上5个模式中,每次注水1分钟,漂洗5分钟,排水1分钟,甩干1分钟,模式1~3的洗衣时间如上所示,具体的洗衣步骤如下: 【模式1~3】:注水->洗衣->排水->甩干->注水->漂洗->排水->甩干 ->注水->漂洗->排水->甩干。 【模式4】:注水->漂洗->排水->甩干->注水->漂洗->排水->甩干。 【模式5】:甩干。 【要求】:实现逻辑控制过程,可以选择性的加入注水口无水报警等人性化的状态提示,操作完毕使用蜂鸣器鸣叫两秒提示。 ③ 画出洗衣机控制器的状态机,写出状态编码方案。 ④ 用Verilog语言对设计进行描述,设计一个测试方案,并能够下载到实验板上调试成功。 // 顶层模块 module init(cp_50,cp_502,BUTTON,key_0,key_1,key_2,key_3,key_4,key_5,key_6,LEDG,led0,led1,led2,led3,VGA_HS,VGA_VS,VGA_R,VGA_G,VGA_B); input cp_50,cp_502; input [2:0] BUTTON; input key_0,key_1,key_2,key_3,key_4,key_5,key_6; output [9:0] LEDG; output [7:0] led0, led1,led2,led3; output VGA_HS; // VGA H_SYNC output VGA_VS; // VGA V_SYNC output [3:0] VGA_R; // VGA Red[3:0] output [3:0] VGA_G; // VGA Green[3:0] output [3:0] VGA_B; // VGA Blue[3:0] reg [7:0]TIME; reg [9:0]LEDG; wire [3:0]flag; wire out0; always @(posedge cp_50) begin case (flag) 4'b0001: LEDG[9:0]<=10'b0000000001; 4'b0010: LEDG[9:0]<=10'b0000000011; 4'b0011: LEDG[9:0]<=10'b0000000111; 4'b0100: LEDG[9:0]<=10'b0000001111; 4'b0101: LEDG[9:0]<=10'b0000011111; 4'b0110: LEDG[9:0]<=10'b0000111111; 4'b0111: LEDG[9:0]<=10'b0001111111; 4'b1000: LEDG[9:0]<=10'b0011111111; 4'b1001: LEDG[9:0]<=10'b0111111111; 4'b1010: LEDG[9:0]<=10'b1111111111; 4'b1011: LEDG[9:0]<=10'b0111111111; 4'b1100: LEDG[9:0]<=10'b0011111111; 4'b1101: LEDG[9:0]<=10'b0001111111; 4'b1110: LEDG[9:0]<=10'b0000111111; 4'b1111: LEDG[9:0]<=10'b0000011111; default: LEDG[9:0]<=10'b0000001111;
FPGA控制PS2键盘verilog设计Quartus9.1工程源码+设计说明文件,可以做为你的学习设计参考。 1. 这个实例通过开发板上面的PS/2接口接收键盘输入的数据,在LCD上面显示出来; 2. 工程在project文件夹里面,打开工程; 3. 源文件在rtl文件夹里面; module top(clk_in, data, lcd_e, lcd_rs, lcd_rw, led, ps2ck, ps2dk); input clk_in; output [7:0] data; output lcd_e; output lcd_rs; output lcd_rw; output [7:0] led; inout ps2ck; inout ps2dk; wire XLXN_4; wire XLXN_5; wire XLXN_6; reg clk; assign rst = 1'b1; always@(posedge clk_in) clk <= ~clk; div_256 XLXI_1 (.mclk(clk), .reset(rst), .clk(XLXN_6)); div16 XLXI_2 (.clk(clk), .rst(rst), .clk_16(XLXN_5)); lcd XLXI_3 (.clk(XLXN_5), .data_in(led[7:0]), .rst(XLXN_4), .data(data[7:0]), .lcd_e(lcd_e), .lcd_rs(lcd_rs), .lcd_rw(lcd_rw)); ps2_keyboard_interface XLXI_4 (.clk(XLXN_6), .reset(rst), .rx_read(), .tx_data(), .tx_write(), .rx_ascii(led[7:0]), .rx_data_ready(), .rx_extended(), .rx_released(XLXN_4), .rx_scan_code(), .rx_shift_key_on(), .tx_error_no_keyboard_ack(), .tx_write_ack_o(), .ps2_clk(ps2ck), .ps2_data(ps2dk)); endmodule
16位乘法器芯片verilog设计实验Quartus9.1工程源码+设计说明文件,可以做为的学习实验设计参考。 module mux16( clk,rst_n, start,ain,bin,yout,done ); input clk; //芯片的时钟信号。 input rst_n; //低电平复位、清零信号。定义为0表示芯片复位;定义为1表示复位信号无效。 input start; //芯片使能信号。定义为0表示信号无效;定义为1表示芯片读入输入管脚得乘数和被乘数,并将乘积复位清零。 input[15:0] ain; //输入a(被乘数),其数据位宽为16bit. input[15:0] bin; //输入b(乘数),其数据位宽为16bit. output[31:0] yout; //乘积输出,其数据位宽为32bit. output done; //芯片输出标志信号。定义为1表示乘法运算完成. reg[15:0] areg; //乘数a寄存器 reg[15:0] breg; //乘数b寄存器 reg[31:0] yout_r; //乘积寄存器 reg done_r; reg[4:0] i; //移位次数寄存器 always@(posedge clk) begin if(!rst_n) begin areg <= 16'h0000; breg <= 16'h0000; done_r <= 1'b0; yout_r <= 32'h00000000; i <= 5'd0; end else if(start) //启动运算 begin if(i < 5'd21) i <= i+1'b1; if(i == 5'd0) begin //锁存乘数、被乘数 areg <= ain; breg 5'd0 && i < 5'd16) begin if(areg[i-1]) yout_r = {1'b0,yout[30:15]+breg,yout_r[14:1]}; //累加并移位 else yout_r >1; //移位不累加 end else if(i == 5'd16 && areg[15]) yout_r[31:16] <= yout_r[31:16]+breg; //累加不移位 else if(i == 5'd18) done_r <= 1'b1; //乘完成标志位置位 else if(i == 5'd20) done_r <= 1'b0; //乘完成标志位清除 end else i <= 5'd0; end assign done = done_r; assign yout = yout_r;
FPGA 读写SRAM存储verilog设计实验Quartus9.1工程源码+设计说明文件,可以做为你的学习设计参考。 module sram_test( clk,rst_n,led, sram_addr,sram_wr_n,sram_data ); input clk; // 50MHz input rst_n; //低电平复位 output led; // LED1 // FPGA与SRAM外部接口 output[17:0] sram_addr; // SRAM地址总线 output sram_wr_n; // SRAM写选通 inout[15:0] sram_data; // SRAM数据总线 //------------------------------------------------------- reg[25:0] delay; //延时计数器 always @ (posedge clk or negedge rst_n) if(!rst_n) delay <= 26'd0; else delay <= delay+1; //不断计数,周期约为1.28s //------------------------------------------------------- reg[15:0] wr_data; // SRAM写入数据总线 reg[15:0] rd_data; // SRAM读出数据 reg[17:0] addr_r; // SRAM地址总线 wire sram_wr_req; // SRAM写请求信号 wire sram_rd_req; // SRAM读请求信号 reg led_r; // LED寄存器 assign sram_wr_req = (delay == 26'd9999); //产生写请求信号 assign sram_rd_req = (delay == 26'd19999); //产生读请求信号 always @ (posedge clk or negedge rst_n) if(!rst_n) wr_data <= 16'd0; else if(delay == 26'd29999) wr_data <= wr_data+1'b1; //写入数据每1.28s自增1 always @ (posedge clk or negedge rst_n) if(!rst_n) addr_r <= 18'd0; else if(delay == 26'd29999) addr_r <= addr_r+1'b1; //写入地址每1.28s自增1 always @ (posedge clk or negedge rst_n) if(!rst_n) led_r <= 1'b0; else if(delay == 26'd20099) begin //每1.28s比较一次同一地址写入和读出的数据 if(wr_data == rd_data) led_r <= 1'b1; //写入和读出数据一致,LED点亮 else led_r <= 1'b0; //写入和读出数据不同,LED熄灭 end assign led = led_r; //------------------------------------------------------- `define DELAY_80NS (cnt==3'd7) reg[2:0] cnt; //延时计数器 always @ (posedge clk or negedge rst_n) if(!rst_n) cnt <= 3'd0; else if(cstate == IDLE) cnt <= 3'd0; else cnt <= cnt+1'b1; //------------------------------------ parameter IDLE = 4'd0, WRT0 = 4'd1, WRT1 = 4'd2, REA0 = 4'd3, REA1 = 4'd4; reg[3:0] cstate,nstate; always @ (posedge clk or negedge rst_n) if(!rst_n) cstate <= IDLE; else cstate <= nstate; always @ (cstate or sram_wr_req or sram_rd_req or cnt) case (cstate) IDLE: if(sram_wr_req) nstate <= WRT0
IIC读写24C02存储verilog实验Quartus9.1工程源码,可以做为你的学习设计参考。 module iic_top( clk,rst_n, sw1,sw2, scl,sda, sm_cs1_n,sm_cs2_n,sm_db ); input clk; // 50MHz input rst_n; //复位信号,低有效 input sw1,sw2; //按键1、2,(1按下执行写入操作,2按下执行读操作) output scl; // 24C02的时钟端口 inout sda; // 24C02的数据端口 output sm_cs1_n,sm_cs2_n; //数码管片选信号,低有效 output[6:0] sm_db; //7段数码管(不包括小数点) wire[7:0] dis_data; //在数码管上显示的16进制数 iic_com iic_com( .clk(clk), .rst_n(rst_n), .sw1(sw1), .sw2(sw2), .scl(scl), .sda(sda), .dis_data(dis_data) ); led_seg7 led_seg7( .clk(clk), .rst_n(rst_n), .dis_data(dis_data), .sm_cs1_n(sm_cs1_n), .sm_cs2_n(sm_cs2_n), .sm_db(sm_db) ); endmodule module iic_com( clk,rst_n, sw1,sw2, scl,sda, dis_data ); input clk; // 50MHz input rst_n; //复位信号,低有效 input sw1,sw2; //按键1、2,(1按下执行写入操作,2按下执行读操作) output scl; // 24C02的时钟端口 inout sda; // 24C02的数据端口 output[7:0] dis_data; //数码管显示的数据 //-------------------------------------------- //按键检测 reg sw1_r,sw2_r; //键值锁存寄存器,每20ms检测一次键值 reg[19:0] cnt_20ms; //20ms计数寄存器 always @ (posedge clk or negedge rst_n) if(!rst_n) cnt_20ms <= 20'd0; else cnt_20ms <= cnt_20ms+1'b1; //不断计数 always @ (posedge clk or negedge rst_n) if(!rst_n) begin sw1_r <= 1'b1; //键值寄存器复位,没有键盘按下时键值都为1 sw2_r <= 1'b1; end else if(cnt_20ms == 20'hfffff) begin sw1_r <= sw1; //按键1值锁存 sw2_r <= sw2; //按键2值锁存 end //--------------------------------------------- //分频部分 reg[2:0] cnt; // cnt=0:scl上升沿,cnt=1:scl高电平中间,cnt=2:scl下降沿,cnt=3:scl低电平中间 reg[8:0] cnt_delay; //500循环计数,产生iic所需要的时钟 reg scl_r; //时钟脉冲寄存器 always @ (posedge clk or negedge rst_n) if(!rst_n) cnt_delay <= 9'd0; else if(cnt_delay == 9'd499) cnt_delay <= 9'd0; //计数到10us为scl的周期,即100KHz else cnt_delay <= cnt_delay+1'b1; //时钟计数 always @ (posedge clk or neged
FPGA读写DS18B20温度并通过七段数码管显示verilog设计实验Quartus9.1工程源码,可以做为你的学习设计参考。 /ds18b20_seg7.v //---------------------------------------- module ds18b20_seg7( input CLOCK_50, // 板载50MHz时钟 input Q_KEY, // 板载按键RST // inout DS18B20, // output [7:0] SEG7_SEG, // 七段数码管 段脚 output [7:0] SEG7_SEL // 七段数码管 待译位脚 ); //++++++++++++++++++++++++++++++++++++++ // 获取温度值开始 //++++++++++++++++++++++++++++++++++++++ wire [15:0] t_buf; ds18b20_drive ds18b20_u0( .clk(CLOCK_50), .rst_n(Q_KEY), // .one_wire(DS18B20), // .temperature(t_buf) ); //------------------------------------- // 获取温度值 结束 //------------------------------------- //+++++++++++++++++++++++++++++++++++++ // 显示键盘值 开始 //+++++++++++++++++++++++++++++++++++++ seg7x8_drive seg7_u0( .i_clk (CLOCK_50), .i_rst_n (Q_KEY), .i_turn_off (8'b1110_1000), // 熄灭位[2进制] .i_dp (8'b0000_0010), // 小数点位[2进制] // 欲显数据[16进制] // 正负位 空白 十位 个位 小数位 .i_data ({12'h0, t_buf[15:12], 4'h0, t_buf[11:0]}), .o_seg (SEG7_SEG), .o_sel (SEG7_SEL) ); //------------------------------------- // 显示键盘值 结束 //------------------------------------- endmodule
基于CYCLONE2 FPGA设计的频率计+串口通信实验quartus9.0工程源码+文档说明资料, /******************************************************************************* ** 文件名称:uart.v ** 功能描述:串口通信__FPGA和上位机通信(波特率:9600bps,10个bit是1位起始位,8个数据位,1个结束) *******************************************************************************/ module uart( clk, rst, rxd, txd, start, data_cnt, count1, count2, count3, count4, count5, count6, count7, count8, send_finish ); input clk; //系统50MHZ时钟 input rst; //复位 input rxd; //串行数据接收端 output txd; //串行数据发送端 input start; //开始采集信号 input[3:0] data_cnt; //数据位标志 output send_finish; //发送完成标志 input [7:0] count1; input [7:0] count2; input [7:0] count3; input [7:0] count4; input [7:0] count5; input [7:0] count6; input [7:0] count7; input [7:0] count8; reg[15:0] div_reg; //分频计数器,分频值由波特率决定。分频后得到频率8倍波特率的时钟 reg[2:0] div8_tras_reg; //该寄存器的计数值对应发送时当前位于的时隙数 reg[3:0] state_tras; //发送状态寄存器 reg clkbaud_tras; //以波特率为频率的发送使能信号 reg clkbaud8x; //以8倍波特率为频率的时钟,它的作用是将发送或接受一个bit的时钟周期分为8个时隙 reg trasstart; //开始发送标志 reg send_finish; reg txd_reg; //发送寄存器 reg[7:0] rxd_buf; //接受数据缓存 reg[7:0] txd_buf; //发送数据缓存 reg[3:0] send_state; //发送状态寄存器 parameter div_par=16'h145; //分频参数,其值由对应的波特率计算而得,按此参数分频的时钟频率是波倍特率的8 //倍,此处值对应9600的波特率,即分频出的时钟频率是9600*8 (CLK50M) assign txd = txd_reg; // assign send_state=data_cnt; /*******分频得到8倍波特率的时钟*********/ always@(posedge clk ) begin if(!rst) div_reg<=0; else begin if(div_reg==div_par-1'b1) div_reg<=0; else div_reg<=div_reg+1'b1; end end always@(posedge clk) begin if(!rst) clkbaud8x<=0; else if(div_reg==div_par-1'b1) clkbaud8x<=~clkbaud8x;//分频得到8倍波特率的时钟:clkbaud8x end // *******************************/ always@(posedge clkbaud8x or negedge rst)//clkbaud8x