?? fdd.v
字號(hào):
/*
自己編寫的串口UART的發(fā)送器,通過與外部的FIFO連接,可以實(shí)現(xiàn)自動(dòng)的數(shù)據(jù)發(fā)送(具體原理圖參考bmp文件)。
接口中tclk和over是測試信號(hào)。波特率38400bps 8位數(shù)據(jù)位,1位停止位,也可以根據(jù)需要調(diào)整波特率,增減數(shù)據(jù)位,具體的
內(nèi)容參考文件中的說明。
由于是初學(xué)Verilog時(shí)編寫的,條理和移植性較差,但總算能正確運(yùn)行,希望批評(píng)指正。liyzz99@163.com。
*/
module fdd(clk,enable,d,txd,rd,over,tclk);
input clk; 輸入時(shí)鐘60MHZ,可以自己選擇
input enable; FIFO的空標(biāo)記
input [7:0]d; 從FIFO輸入的需要發(fā)送的字節(jié)
output txd; 串行數(shù)據(jù)輸出端
output rd; 到FIFO的讀FIFO的允許信號(hào)
output tclk;
output over;
reg [11:0]bps_cnt; 波特率計(jì)數(shù)器
reg [3:0]bit_cnt; 發(fā)送數(shù)據(jù)位計(jì)數(shù)器
reg [4:0]step; 開始進(jìn)行一個(gè)數(shù)據(jù)發(fā)送時(shí)的時(shí)序控制節(jié)拍移位器
reg [7:0]id; 輸入8位數(shù)據(jù)鎖存器
reg [8:0]xd; 輸出數(shù)據(jù)的暫存器
reg flag;
wire byte_stop,ld,lx,li,clr_flag;
//wire over,tclk;
assign over = (bps_cnt==1562)?1:0; /*用60MHZ時(shí)鐘計(jì)數(shù)得到38400bps的發(fā)送鐘。*/
assign byte_stop = (bit_cnt==10)?1:0; 起始位+8位數(shù)據(jù)位+1位停止位,也可以增加奇偶校驗(yàn)位,則bit_cnt==11
assign clr_flag = (bit_cnt ==9&&bps_cnt==1561)?1:0; 在發(fā)送最后一位停止位時(shí),設(shè)定clr_flag,保證數(shù)據(jù)的快速發(fā)送,在有校驗(yàn)位的情況下
則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;
/*
如果想實(shí)現(xiàn)有校驗(yàn)位的發(fā)送,則xd數(shù)據(jù)應(yīng)該變?yōu)? xd[0] <= id[7]^id[6]^id[5]^id[4]^id[3]^id[2]^id[1]^id[0]^1;/*奇校驗(yàn)*/
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
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -