用Verilog 编写的UART(异步收发器)发送接收模块程序,求每一句的注释!!!

用Verilog 编写的UART(异步收发器)发送接收模块程序,求每一句的注释!!!,第1张

/********************rec*************************

**模块名称:rec

**功能描述:uart的接收模块,接收采样率为波特率的16倍

************************************************/

module rec(clk,clkout,Dataout,RXD,RI)

input clk,RXD //时钟数据输入

output clkout,RI //时钟输入、接收中断输出

output [7:0] Dataout //并行数据输出

reg StartF,RI //开始与接收中断标志

reg [9:0] UartBuff //接收缓存区

reg [3:0] count,count_bit //位接收计数器

reg [15:0] cnt //时钟节拍计数器

reg [2:0] bit_collect //采集数据缓存区

wire clk_equ,bit1,bit2,bit3,bit4 //连线

initial //初始化寄存器

begin

StartF=0

UartBuff=0

count=0

count_bit=0

cnt=0

bit_collect=0

end

parameter cout = 312 //时钟是48M除以16*9600的分频数为312.5,这里取整数

/*************波特率发生进程****************************/

always@(posedge clk) //时钟节拍计数器

begin

if(clk_equ)

cnt = 16'd0

else

cnt=cnt+1'b1

end

assign clk_equ = (cnt == cout) //采样时钟

assign clkout = clk_equ

assign bit1 = bit_collect[0]&bit_collect[1] //对采样数据进行判断

assign bit2 = bit_collect[1]&bit_collect[2] //对采样数据进行判断

assign bit3 = bit_collect[0]&bit_collect[2] //对采样数据进行判断

assign bit4 = bit1|bit2|bit3 //对采样数据进行判断,只要有两次相同就可以

always@(posedge clk)

begin

if(clk_equ)

begin

if(!StartF) //是否处于接收状态

begin

if(!RXD)

begin

count = 4'b0 //复位计数器

count_bit = 4'b0

RI = 1'b0

StartF = 1'b1

end

else RI = 1'b1

end

else

begin

count = count+1'b1 //位接收状态加1

if(count==4'd6)

bit_collect[0] = RXD //数据采集

if(count==4'd7)

bit_collect[1] = RXD //数据采集

if(count==4'd8)

begin

bit_collect[2] = RXD //数据采集

UartBuff[count_bit] = bit4

count_bit = count_bit+1'b1 //位计数器加1

if((count_bit==4'd1)&&(UartBuff[0]==1'b1)) //判断开始位是否为0

begin

StartF = 1'b0 //标志开始接收

end

RI = 1'b0 //中断标志位低

end

if(count_bit>4'd9) //检测是否接收结束

begin

RI = 1'b1 //中断标志为高标志转换结束

StartF = 1'b0

end

end

end

end

assign Dataout = UartBuff[8:1] //取出数据位

endmodule

UART verilog代码网上一搜一大堆。一般是固定波特率和位数,校验和停止位固定的。 下载下来自己改一下就是了,波特率可调就是加个计数器根据分频比来产生不同频率时钟,校验产生可用异或门或同或门实现,就是输出位数和停止位稍微麻烦点,在控制

首先若这个数据是按照clk的时钟一位位串行进入,那么你就可以在clk的上升沿触发,将每次进的一位数据存入一个长10bit的寄存器(假设是data_buff),而且这个寄存器没个始终上升沿左移一位,这样每次进的数据都存在data_buff[0],而且每次都记一次数,当计数十次后就是串行数据都进来后,读取data_buff[8:1]就行了,并行出去看你要咋出了,是像数码管那种还是啥?


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11996557.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存