📄 fdd.v
字号:
/*
自己编写的串口UART的发送器,通过与外部的FIFO连接,可以实现自动的数据发送(具体原理图参考bmp文件)。
接口中tclk和over是测试信号。波特率38400bps 8位数据位,1位停止位,也可以根据需要调整波特率,增减数据位,具体的
内容参考文件中的说明。
由于是初学Verilog时编写的,条理和移植性较差,但总算能正确运行,希望批评指正。liyzz99@163.com。
*/
module fdd(clk,enable,d,txd,rd,over,tclk);
input clk; 输入时钟60MHZ,可以自己选择
input enable; FIFO的空标记
input [7:0]d; 从FIFO输入的需要发送的字节
output txd; 串行数据输出端
output rd; 到FIFO的读FIFO的允许信号
output tclk;
output over;
reg [11:0]bps_cnt; 波特率计数器
reg [3:0]bit_cnt; 发送数据位计数器
reg [4:0]step; 开始进行一个数据发送时的时序控制节拍移位器
reg [7:0]id; 输入8位数据锁存器
reg [8:0]xd; 输出数据的暂存器
reg flag;
wire byte_stop,ld,lx,li,clr_flag;
//wire over,tclk;
assign over = (bps_cnt==1562)?1:0; /*用60MHZ时钟计数得到38400bps的发送钟。*/
assign byte_stop = (bit_cnt==10)?1:0; 起始位+8位数据位+1位停止位,也可以增加奇偶校验位,则bit_cnt==11
assign clr_flag = (bit_cnt ==9&&bps_cnt==1561)?1:0; 在发送最后一位停止位时,设定clr_flag,保证数据的快速发送,在有校验位的情况下
则bit_cnt == 10。
assign ld = step[0]&~step[1];
assign rd = step[1]&~step[2];
assign li = step[2]&~step[3];
assign lx = step[3]&~step[4];
assign tclk = over | ld;
assign txd = xd[8];
always @(posedge(clk))
begin
if(over|ld)
bps_cnt <= 0;
else
begin
if(~byte_stop)
begin
bps_cnt <= bps_cnt+1;
end
end
if(ld)
bit_cnt <=0;
else
begin
if(over)
bit_cnt <= bit_cnt+1;
end
if(clr_flag)
flag <= 0;
else
begin
if(byte_stop)
flag <= ~enable;
end
if(~flag)
step <= 0;
else
begin
step <= step <<1;
step[0] <= 1;
end
if(li)
id <= d;
if(lx)
begin
xd[0] <= id[7];
xd[1] <= id[6];
xd[2] <= id[5];
xd[3] <= id[4];
xd[4] <= id[3];
xd[5] <= id[2];
xd[6] <= id[1];
xd[7] <= id[0];
xd[8] <= 0;
/*
如果想实现有校验位的发送,则xd数据应该变为
xd[0] <= id[7]^id[6]^id[5]^id[4]^id[3]^id[2]^id[1]^id[0]^1;/*奇校验*/
xd[1] <= id[7];
xd[2] <= id[6];
xd[3] <= id[5];
xd[4] <= id[4];
xd[5] <= id[3];
xd[6] <= id[2];
xd[7] <= id[1];
xd[8] <= id[0];
xd[9] <= 0;
*/
end
else
begin
if(tclk)
begin
xd <= xd<<1;
xd[0] <= 1;
end
end
end
endmodule
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -