




已阅读5页,还剩22页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于 Verilog HDL 语言的串口设计 串口 Verilog HDL 代码 串口 module trans clk rst en TxD data Wsec RxD TxD TxD busy rcven RxD data 时钟 50MHz input clk rst en en 时发送数据使能 input 7 0 TxD data 发送数据输入 input 2 0 Wsec 波特率调节 0 2400 1 4800 2 9600 3 14400 4 19200 5 38400 6 115200 7 128000 input RxD 接收数据输入端 output TxD TxD busy rcven 发送 发送忙 接收结束标志输出 output 7 0 RxD data 接收数据输出 wire Baud1 Baud8 reg 7 0 addwire RAM 地址连线 reg 7 0 data wire 7 0 AD t 读取 RAM 数据的地址用于发送 wire 7 0 AD r 接收的数据存储在 RAM 中的地址 wire 7 0 datawire 数据连线 发送例化 trans t tt1 clk t clk rst t rst en t en BTI t Baud1 recen recen TxD data t datawire TxD t TxD addro t AD t TxD busy t TxD busy 波特生成例化 BaudG tt2 clk b clk rst b rst BTO b Baud1 BTO R Baud8 Wsec b Wsec 接收例化 trans r tt3 clk r clk rst r rst BTI r Baud8 RxD r RxD RxD data r RxD data wren r wren r addro r AD r RxD end RxD end LPM RAM 例化 RAM0 tt4 address addwire clock clk data data wren wren r q datawire always posedge clk or negedge rst if rst addwire 8 b00000000 else if RxD end begin addwire AD r data RxD data end else addwire AD t endmodule 发送模块 module trans t clk t rst t en t BTI t TxD data t TxD t recen TxD busy t addro t recen input clk t rst t en t BTI t input 7 0 TxD data t output TxD t output TxD busy t output recen output 7 0 addro t reg TxD t reg 7 0 TxD dataReg 寄存器 reg 7 0 addro t reg 3 0 state reg recen wire TxD busy t assign BaudTick BTI t 波特输出 发送启动 wire TxD ready state 0 TxD ready 1 assign TxD busy t TxD ready 加载发送数据 always posedge clk t or negedge rst t if rst t TxD dataReg 8 b00000000 else if TxD ready 状态机发送 always posedge clk t or negedge rst t if rst t begin state 4 b0000 复位时发送 1 TxD t 1 b1 end else case state 4 b0000 if en t begin state 4 b0100 检测发送开始 end 4 b0100 if BaudTick 发送起始位 0 TxD t 1 b0 end 4 b1000 if BaudTick bit 0 if en t TxD t TxD dataReg 0 else TxD t 1 b0 end 4 b1001 if BaudTick bit 1 if en t TxD t TxD dataReg 1 else TxD t 1 b0 end 4 b1010 if BaudTick bit 2 if en t TxD t TxD dataReg 2 else TxD t 1 b0 end 4 b1011 if BaudTick bit 3 if en t TxD t TxD dataReg 3 else TxD t 1 b0 end 4 b1100 if BaudTick bit 4 if en t TxD t TxD dataReg 4 else TxD t 1 b0 end 4 b1101 if BaudTick bit 5 if en t TxD t TxD dataReg 5 else TxD t 1 b0 end 4 b1110 if BaudTick bit 6 if en t TxD t TxD dataReg 6 else TxD t 1 b0 end 4 b1111 if BaudTick bit 7 if en t TxD t TxD dataReg 7 else TxD t 1 b0 end 4 b0010 if BaudTick stop1 TxD t 1 b1 end 4 b0011 if BaudTick begin state 4 b0000 stop2 TxD t 1 b1 end default if BaudTick begin state 4 b0000 TxD t 1 b1 end endcase always posedge clk t or negedge rst t if rst t begin recen 0 end else if TxD ready recen 1 else recen 0 地址计数器 ddress always posedge clk t or negedge rst t if rst t addro t 8 b00000000 else if TxD ready endmodule 波特生成模块 module BaudG clk b rst b BTO b BTO R Wsec b input clk b rst b input 2 0 Wsec b output BTO b BTO R reg FT FT8 reg 16 0 BGA reg 16 0 BGA1 wire BTO b FT 发送波特 wire BTO R FT8 接收模块波特 发送 16 always posedge clk b or negedge rst b if rst b begin BGA 0 BGA1 1302 begin FT8 1 b1 BGA1 0 end 接收波特 2400 16 else begin FT8 1 b0 BGA1 62500 begin FT 1 b1 FT8 1 b1 BGA1 0 BGA 0 end 发送波特 2400 else begin FT 1 b0 BGA 651 begin FT8 1 b1 BGA1 0 end 接收波特 4800 16 else begin FT8 1 b0 BGA1 62500 begin FT 1 b1 FT8 1 b1 BGA1 0 BGA 0 end 发送波特 4800 else begin FT 1 b0 BGA 651 begin FT8 1 b1 BGA1 0 end 接 收波特 9600 16 else begin FT8 1 b0 BGA115625 begin FT 1 b1 FT8 1 b1 BGA1 0 BGA 0 end 发送波特 9600 else begin FT 1 b0 BGA 217 begin FT8 1 b1 BGA1 0 end 接 收波特 14400 16 else begin FT8 1 b0 BGA1 17361 begin FT 1 b1 FT8 1 b1 BGA1 0 BGA 0 end 发送波特 14400 else begin FT 1 b0 BGA 651 begin FT8 1 b1 BGA1 0 end 接 收波特 19200 16 else begin FT8 1 b0 BGA1 15625 begin FT 1 b1 FT8 1 b1 BGA1 0 BGA 0 end 发送波特 19200 else begin FT 1 b0 BGA 244 begin FT8 1 b1 BGA1 0 end 接 收波特 38400 16 else begin FT8 1 b0 BGA1 15625 begin FT 1 b1 FT8 1 b1 BGA1 0 BGA 0 end 发送波特 38400 else begin FT 1 b0 BGA 217 begin FT8 1 b1 BGA1 0 end 接 收波特 115200 16 else begin FT8 1 b0 BGA1 434 begin FT 1 b1 FT8 1 b1 BGA1 0 BGA 0 end 发送波特 115200 else begin FT 1 b0 BGA 122 begin FT8 1 b1 BGA1 0 end 接收 波特 128000 16 else begin FT8 1 b0 BGA1 3125 begin FT 1 b1 BGA 0 FT8 1 b1 BGA1 0 end 发送波特 128000 else begin FT 1 b0 BGA BGA 8 end end default begin BGA 0 FT 1 b0 end endcase endmodule 接收模块 module trans r clk r rst r BTI r RxD r RxD data r wren r addro r RxD end input clk r rst r RxD r BTI r output 7 0 RxD data r output wren r RxD end output 7 0 addro r reg 3 0 bit spacing 两 Bit 间隔 16 reg RxD end 接收数据有效标志 reg RxD delay 中间参量 reg RxD en 接收使能 reg 7 0 RxD data r 接收数据输出 reg 7 0 RxD cach 接收数据缓存 reg 3 0 state reg 7 0 addro r 地址 reg wren r assign Baud8Tick BTI r 接收波特 always posedge clk r or negedge rst r if rst r bit spacing 0 else case state 0 bit spacing 0 default if Baud8Tick bit spacing bit spacing 1 endcase wire next bit bit spacing 5 两 bit 间隔 16 波特 always posedge clk r if Baud8Tick begin RxD delay RxD r RxD en Baud8Tick 检测接收信号是否有 下降沿 end 状态机接收 always posedge clk r or negedge rst r if rst r state 4 b0000 else if Baud8Tick case state 4 b0000 if RxD en state 4 b0001 有下降沿开始接收 4 b0001 if next bit state 4 b1000 bit 0 4 b1000 if next bit state 4 b1001 bit 1 4 b1001 if next bit state 4 b1010 bit 2 4 b1010 if next bit state 4 b1011 bit 3 4 b1011 if next bit state 4 b1100 bit 4 4 b1100 if next bit state 4 b1101 bit 5 4 b1101 if next bit state 4 b1110 bit 6 4 b1110 if next bit state 4 b1111 bit 7 4 b1111 if next bit state 4 b0010 停止位 4 b0010 if next bit state 4 b0000 default state 4 b0000 endcase 移位寄存器接收 always posedge clk r or negedge rst r if rst r RxD cach 8 b00000000 else if Baud8Tick 停止位与接收结束标志位有效时将数据输出 always posedge clk r or negedge rst r if rst r RxD data r 8 b00000000 else if RxD end 产生接收结束标志位 always posedge clk r or negedge rst r if rst r begin RxD end 0 end else begin RxD end Baud8Tick end always posedge clk r or negedge rst r if rst r begin wren r 0 end else if RxD end wren r 1 else wren r 0 地址计数器 ddress always posedge clk r or negedge rst r if rst r addro r 8 b11111111 else if RxD end addro r addro r 1 endmodule 为了测试收发是否正常 写的 Test Bench timescale 1ns 1ns module trsb reg clk rst en reg 7 0 TxD data reg 2 0 Wsec wire TxD TxD busy rcven wire 7 0 RxD data trans trsb clk clk rst rst en en TxD TxD Wsec Wsec TxD busy TxD busy TxD data TxD data rcven rcven RxD data RxD data RxD TxD initial begin en 0 TxD data 0 rst 1 1 Wsec 2 54 rst 0 70 rst 1 10 TxD data 8 b11011001 10 en 1 b1 1250000 en 1 b1 end initial begin 3790000 TxD data 8 b01011010 10 en 1 b1 2750000 en 1 b0 1290000 TxD data 8 b101001010 10 en 1 b1 2750000 en 1 b0 end initial begin clk 1 while 1 10 clk clk end endmodule FPGA 实现串行接口 RS232 1 2008 12 17 11 38 串行接口 RS 232 串行接口是连接 FPGA 和 PC 机的一种简单方式 这个项目向大家展示了如果使 用 FPGA 来创建 RS 232 收发器 整个项目包括 5 个部分 1 RS232 是怎样工作的 2 如何产生需要的波特率 3 发送模块 4 接收模块 5 应用实例 RS 232RS 232 接口是怎样工作的接口是怎样工作的 作为标准设备 大多数的计算机都有 1 到 2 个 RS 232 串口 特性特性 RS 232 有下列特性 使用 9 针的 DB 9 插头 旧式计算机使用 25 针的 DB 25 插头 允许全双工的双向通讯 也就是说计算机可以在接收数据的同时发送数据 最大可支持的传输速率为 10KBytes s DB 9DB 9 插头插头 你可能已经在你的计算机背后见到过这种插头 它一共有 9 个引脚 但是最重要的 3 个引脚是 引脚 2 RxD 接收数据 引脚 3 TxD 发送数据 引脚 5 GND 地 仅使用 3 跟电缆 你就可以发送和接收数据 串行通讯串行通讯 数据以每次一位的方式传输 每条线用来传输一个方向的数据 由于计算机通 常至少需要若干位数据 因此数据在发送之前先 串行化 通常是以 8 位数 据为 1 组的 先发送最低有效位 最后发送最高有效位 异步通讯异步通讯 RS 232 使用异步通讯协议 也就是说数据的传输没有时钟信号 接收端必须有 某种方式 使之与接收数据同步 对于 RS 232 来说 是这样处理的 1 串行线缆的两端事先约定好串行传输的参数 传输速度 传输格式等 2 当没有数据传输的时候 发送端向数据线上发送 1 3 每传输一个字节之前 发送端先发送一个 0 来表示传输已经开始 这样接收端便 可以知道有数据到来了 4 开始传输后 数据以约定的速度和格式传输 所以接收端可以与之同步 5 每次传输完成一个字节之后 都在其后发送一个停止位 1 让我们来看看 0 x55 是如何传输的 0 x55 的二进制表示为 01010101 但是由于先发送的是最低有效位 所以发送序列是这样的 1 0 1 0 1 0 1 0 下面是另外一个例子 传输的数据为 0 xC4 你能看出来吗 从图中很难看出来所传输的数据 这也说明了事先知道传输的速率对于接收端 有多么重要 数据传输可以多快数据传输可以多快 数据的传输速度是用波特来描述的 亦即每秒钟传输的数据位 例如 1000 波 特表示每秒钟传输 100 比特的数据 或者说每个数据位持续 1 毫秒 波特率不是随意的 必须服从一定的标准 如果希望设计 123456 波特的 RS 232 接口 对不起 你很不幸运 这是不行的 常用的串行传输速率值包括以 下几种 1200 波特 9600 波特 38400 波特 115200 波特 通常情况下是你可以使用的最高速度 在 115200 波特传输速度下 每位数据持续 1 115200 8 7 s 如果传输 8 位数据 共持续 8 x 8 7 s 69 s 但是每个字节的传输又要求额外的 开始位 和 停止位 所以实际上需要花费 10 x 8 7 s 87 s 的时间 最大的有效数据传输率只能达到 11 5KBytes 每秒 在 115200 波特传输速度下 一些使用了不好的芯片的计算机要求一个长的停止 位 1 5 或 2 位数据的长度 这使得最大传输速度降到大约 10 5KBytes 每秒 物理层物理层 电缆上的信号使用正负电压的机制 1 用 10V 的电压表示 或者在 5V 与 15V 之间的电压 0 用 10V 的电压表示 或者在 5V 与 15V 之间的电压 所以没有数据传输的电缆上的电压应该为 10V 或 5 到 10 之间的某个电压 FPGA 实现串行接口 RS232 2 2008 12 17 11 39 波特率发生器波特率发生器 这里我们使用串行连接的最大速度 115200 波特 其他较慢的波特也很容易由 此产生 FPGA 通常运行在远高于 115200Hz 的时钟频率上 对于今天的标准的来说 RS 232 真是太慢了 这就意味着我们需要用一个较高的时钟来分频产生尽量接 近于 115200Hz 的时钟信号 从 1 8432MHz 的时钟产生 通常 RS 232 芯片使用 1 8432MHz 的时钟 以为这个时钟很容易产生标准的波 特率 所以我们假设已经拥有了一个这样的时钟源 只需要将 1 8432MHz 16 分频便可得到 115200Hz 的时钟 多方便啊 reg 3 0 BaudDivCnt always posedge clk BaudDivCnt 2000000 printf else printf acc 2000000 这段代码会精确的以平均每 17 361111111 个时钟间隔打印出一个 为了从 FPGA 得到同样的效果 考虑到串行接口可以容忍一定的波特率误差 所以即使我们使用 17 3 或者 17 4 这样的分频比也是没有关系的 FPGAFPGA 波特率发生器波特率发生器 我们希望 2000000 是 2 的整数幂 但很可惜 它不是 所以我们改变分频比 2000000 115200 约等于 1024 59 17 356 这跟我们要求的分频比很接 近 并且使得在 FPGA 上实现起来相当有效 10 位的累加器 9 0 1 位进位输出 10 reg 10 0 acc 一共 11 位 always posedge clk acc acc 9 0 59 我们使用上一次结果的低 10 位 但是保留 11 位结 果 wire BaudTick acc 10 第 11 位作为进位输出 使用 2MHz 时钟 BaudTick 为 115234 波特 跟理想的 115200 波特存在 0 03 的误差 参数化的参数化的 FPGAFPGA 波特率发生器波特率发生器 前面的设计我们使用的是 10 位的累加器 如果时钟频率提高的话 需要更多 的位数 下面是一个使用 25MHz 时钟和 16 位累加器的设计 该设计是参数化的 所 以很容易根据具体情况修改 parameter ClkFrequency 25000000 25MHz parameter Baud 115200 parameter BaudGeneratorAccWidth 16 parameter BaudGeneratorInc Baud BaudGeneratorAccWidth ClkFrequency reg BaudGeneratorAccWidth 0 BaudGeneratorAcc always posedge clk BaudGeneratorAcc BaudGeneratorAcc BaudGeneratorAccWidth 1 0 BaudGeneratorInc wire BaudTick BaudGeneratorAcc BaudGeneratorAccWidth 上面的设计中存在一个错误 BaudGeneratorInc 的计算是错误的 因为 Verilog 使用 32 位的默认结果 但实际计算过程中的某些数据超过了 32 位 所以改变一种计算方法 parameter BaudGeneratorInc Baud 5 ClkFrequency 4 这行程序也使得结果成为整数 从而避免截断 这就是整个的设计方法了 现在我们已经得到了足够精确的波特率 可以继续设计串行接收和发送模块了 FPGA 实现串行接口 RS232 3 2008 12 17 11 40 RS 232RS 232 发送模块发送模块 下面是我们所想要实现的 它应该能像这样工作 发送器接收 8 位的数据 并将其串行输出 TxD start 置位后开始传输 当有数传输的时候 使 busy 信号有效 此时 TxD start 信号被忽略 RS 232 模块的参数是固定的 8 位数据 2 个停止位 无奇偶校验 数据串行化数据串行化 假设我们已经有了一个 115200 波特的 BaudTick 信号 我们需要产生开始位 8 位数据以及停止位 用状态机来实现看起来比较合适 reg 3 0 state always posedge clk case state 4 b0000 if TxD start state 4 b0100 4 b0100 if BaudTick state 4 b1000 开始位 4 b1000 if BaudTick state 4 b1001 bit 0 4 b1001 if BaudTick state 4 b1010 bit 1 4 b1010 if BaudTick state 4 b1011 bit 2 4 b1011 if BaudTick state 4 b1100 bit 3 4 b1100 if BaudTick state 4 b1101 bit 4 4 b1101 if BaudTick state 4 b1110 bit 5 4 b1110 if BaudTick state 4 b1111 bit 6 4 b1111 if BaudTick state 4 b0001 bit 7 4 b0001 if BaudTick state 4 b0010 停止位 1 4 b0010 if BaudTick state 4 b0000 停止位 2 default if BaudTick state 4 b0000 endcase 注意看这个状态机是怎样实现当 TxD start 有效就开始 但只在 BaudTick 有 效的时候才转换状态的 现在 我们只需要产生 TxD 输出即可 reg muxbit always state 2 0 case state 2 0 0 muxbit TxD data 0 1 muxbit TxD data 1 2 muxbit TxD data 2 3 muxbit TxD data 3 4 muxbit TxD data 4 5 muxbit TxD data 5 6 muxbit TxD data 6 7 muxbit TxD data 7 endcase 将开始位 数据以及停止位结合起来 assign TxD state 4 state 3 FPGA 实现串行接口 RS232 4 2008 12 17 11 41 RS232 接收模块接收模块 下面是我们想要实现的模块 我们的设计目的是这样的 1 当 RxD 线上有数据时 接收模块负责识别 RxD 线上的数据 2 当收到一个字节的数据时 锁存接收到的数据到 data 总线 并使 data ready 有效一 个周期 注意 只有当 data ready 有效时 data 总线的数据才有效 其他的时间里不要使用 data 总线上的数据 因为新的数据可能已经改变了其中的部分数据 过采样过采样 异步接收机必须通过一定的机制与接收到的输入信号同步 接收端没有办法得 到发送断的时钟 这里采用如下办法 1 为了确定新数据的到来 即检测开始位 我们使用几倍于波特率的采 样时钟对接收到的信号进行采样 2 一旦检测到 开始位 再将采样时钟频率降为已知的发送端的波特率 典型的过采样时钟频率为接收到的信号的波特率的 16 倍 这里我们使用 8 倍 的采样时钟 当波特率为 115200 时 采样时钟为 921600Hz 假设我们已经有了一个 8 倍于波特率的时钟信号 Baud8Tick 其频率为 921600Hz 具体设计具体设计 首先 接受到的 RxD 信号与我们的时钟没有任何关系 所以采用两个 D 触发 器对其进行过采样 并且使之我我们的时钟同步 reg 1 0 RxD sync always posedge clk if Baud8Tick RxD sync RxD sync 0 RxD 首先我们对接收到的数据进行滤波 这样可以防止毛刺信号被误认为是开始信 号 reg 1 0 RxD cnt reg RxD bit always posedge clk if Baud8Tick begin if RxD sync 1 else if RxD sync 1 if RxD cnt 2 b00 RxD bit 0 else if RxD cnt 2 b11 RxD bit 1 end 一旦检测到 开始位 使用如下的状态机可以检测出接收到每一位数据 reg 3 0 state always posedge clk if Baud8Tick case state 4 b0000 if RxD bit state 4 b1000 start bit found 4 b1000 if next bit state 4 b1001 bit 0 4 b1001 if next bit state 4 b1010 bit 1 4 b1010 if next bit state 4 b1011 bit 2 4 b1011 if next bit state 4 b1100 bit 3 4 b1100 if next bit state 4 b1101 bit 4 4 b1101 if next bit state 4 b1110 bit 5 4 b1110 if next bit state 4 b1111 bit 6 4 b1111 if next bit state 4 b0001 bit 7 4 b0001 if next bit state 4 b0000 stop bit default state 4 b0000 endcase 注意 我们使用了 next bit 来遍历所有数据位 reg 2 0 bit spacing always posedge clk if state 0 bit spacing 0 else if Baud8Tick bit spacing bit spacing 1 wire next bit bit spacing 7 最后我们使用一个移位寄存器来存储接受到的数据 reg 7 0 RxD data always posedge clk if Baud8Tick FPGA 实现串行接口 RS232 5 2008 12 17 11 41 怎样使用发送和接收模块怎样使用发送和接收模块 这个设计似的我们可以通过计算机的串行口来控制 FPGA 的几个引脚 具体来说 该设计完成以下功能 1 将 FPGA 的 8 个引脚作为输出 称为 通用输出 FPGA 收到任何数 据时都会更新这 8 个 GPout 的值 2 将 FPGA 的 8 个引脚作为输入 称为 通用输入 FPGA 收到仁厚数 据后 都会将 GPin 上的数值通过串行口发送出去 通用输出可以用来通过计算机远程控制任何东西 例如 FPGA 板上的 LED 甚至 可以再添加一个继电器来控制咖啡机 module serialfun clk RxD TxD GPout GPin input clk input RxD output TxD output 7 0 GPout input 7 0 GPin wire RxD data ready wire 7 0 RxD data async receiver deserializer clk clk RxD RxD RxD data ready RxD data ready RxD data RxD data reg 7 0 GPout always posedge clk if RxD data ready GPout RxD data async transmitter serializer clk clk TxD TxD TxD start RxD data ready TxD data GPin endmodule 记得包含异步发送和接收模块的设计文件 并更新里面的时钟频率 module serial clk rst rxd txd en seg data key input lowbit input clk rst input rxd 串行数据接收端 input key input 按键输入 output 7 0 en output 7 0 seg data reg 7 0 seg data output txd 串行数据发送端 output lowbit inner reg reg 15 0 div reg 分频计数器 分频值由波特率决定 分频后得到频率 8 倍波特率的时钟 reg 2 0 div8 tras reg 该寄存器的计数值对应发送时当前位于的时隙数 reg 2 0 div8 rec reg 该寄存器的计数值对应接收时当前位于的时隙数 reg 3 0 state tras 发送状态寄存器 reg 3 0 state rec 接受状态寄存器 reg clkbaud tras 以波特率为频率的发送使能信号 reg clkbaud rec 以波特率为频率的接受使能信号 reg clkbaud8x 以 8 倍波特率为频率的时钟 它的作用是将发送或接受一个 bit 的时钟周期 分为 8 个时隙 reg recstart 开始发送标志 reg recstart tmp reg trasstart 开始接受标志 reg rxd reg1 接收寄存器 1 reg rxd reg2 接收寄存器 2 因为接收数据为异步信号 故用两级缓存 reg txd reg 发送寄存器 reg 7 0 rxd buf 接受数据缓存 reg 7 0 txd buf 发送数据缓存 reg 2 0 send state 每次按键给 PC 发送 Welcome 字符串 这是发送状态寄存器 reg 19 0 cnt delay 延时去抖计数器 reg start delaycnt 开始延时计数标志 reg key entry1 key entry2 确定有键按下标志 parameter div par 16 h104 分频参数 其值由对应的波特率计算而得 按此参数分频的时 钟频率是波倍特率的 8 倍 此处值对应 9600 的波特率 即分频出的时钟频率是 9600 8 assign txd txd reg assign lowbit 0 assign en 8 b11111110 7 段数码管使能信号赋值 always posedge clk begin if rst begin cnt delay 0 start delaycnt 0 end else if start delaycnt begin if cnt delay 20 d800000 begin cnt delay cnt delay 1 end else begin cnt delay 0 start delaycnt 0 end end else begin if key input end end always posedge clk begin if rst key entry1 0 else begin if key entry2 key entry1 0 else if cnt delay 20 d800000 begin if key input key entry1 1 end end end always posedge clk begin if rst div reg 0 else begin if div reg div par 1 div reg 0 else div reg div reg 1 end end always posedge clk 分频得到 8 倍波特率的时钟 begin if rst clkbaud8x 0 else if div reg div par 1 clkbaud8x clkbaud8x end always posedge clkbaud8x or negedge rst begin if rst div8 rec reg 0 else if recstart 接收开始标志 div8 rec reg div8 rec reg 1 接收开始后 时隙数在 8 倍波特率的时钟下加 1 循 环 end always posedge clkbaud8x or negedge rst begin if rst div8 tras reg 0 else if trasstart div8 tras reg div8 tras reg 1 发送开始后 时隙数在 8 倍波特率的时钟下加 1 循环 end always div8 rec reg begin if div8 rec reg 7 clkbaud rec 1 在第 7 个时隙 接收使能信号有效 将数据打入 else clkbaud rec 0 end always div8 tras reg begin if div8 tras reg 7 clkbaud tras 1 在第 7 个时隙 发送使能信号有效 将数据发出 else clkbaud tras 0 end always posedge clkbaud8x or negedge rst begin if rst begin txd reg 1 trasstart 0 txd buf 0 state tras 0 send state 0 key entry2 0 end else begin if key entry2 begin if key entry1 begin key entry2 1 txd buf 8 d119 w end end else begin case state tras 4 b0000 begin 发送起始位 if trasstart else if send state 7 begin if clkbaud tras begin txd reg 0 state tras state tras 1 end end else begin key entry2 0 state tras 0 end end 4 b0001 begin 发送第 1 位 if clkbaud tras begin txd reg txd buf 0 txd buf 6 0 txd buf 7 1 state tras state tras 1 end end 4 b0010 begin 发送第 2 位 if clkbaud tras begin txd reg txd buf 0 txd buf 6 0 txd buf 7 1 state tras state tras 1 end end 4 b0011 begin 发送第 3 位 if clkbaud tras begin txd reg txd buf 0 txd buf 6 0 txd buf 7 1 state tras state tras 1 end end 4 b0100 begin 发送第 4 位 if clkbaud tras begin txd reg txd buf 0 txd buf 6 0 txd buf 7 1 state tras state tras 1 end end 4 b0101 begin 发送第 5 位 if clkbaud tras begin txd reg txd buf 0 txd buf 6 0 txd buf 7 1 state tras state tras 1 end end 4 b0110 begin
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 质量控制与改进实施指导书模板
- 地球累了课件
- 地球科学课件
- 出版物学术审核合同
- 药厂转正申请书
- 护照申请书范文
- 中国农业科学院研究所招聘笔试经典考题含答案
- 2025年中国医药集团招聘笔试模拟题及答案
- 2025年技术转移中心市场经理招聘笔试模拟题及答案
- 云南省剑川县第一中学2026届化学高二第一学期期中调研试题含解析
- 库房卫生打扫管理制度
- 塑胶料品质协议书
- 智能制造虚拟仿真实训基地建设目标
- 《慢性乙肝治疗策略》课件
- 国际制药工程协会(ISPE)制药工程基本指南水和蒸汽系统
- 学校食堂奖惩管理制度
- 秋季中医养生
- 中职生的宿舍规范
- 以数独为代表的逻辑思维游戏教学研究
- 《中国现代农业发展》课件
- 交通运输概论教学教案
评论
0/150
提交评论