【正文】
8當(dāng)counters指定時(shí)間時(shí)功能仿真 圖38當(dāng)counters指定時(shí)間時(shí) 解釋:由圖可明顯看出data[0]和data[1]變化,模塊功能仿真通過圖39當(dāng)counters未指定時(shí)間時(shí)功能仿真圖39當(dāng)counters未指定時(shí)間時(shí)功能仿真 UART控制器實(shí)質(zhì)上是一組計(jì)數(shù)器,由state決定計(jì)數(shù)器數(shù)據(jù)發(fā)送對(duì)象,在這里指定當(dāng)state為1時(shí),發(fā)送到UART接收模塊,反之,發(fā)送到UART發(fā)送模塊。當(dāng)計(jì)數(shù)到指定數(shù)據(jù)時(shí),觸發(fā)指定模塊的制定操作。module counters(read_enable,send_enable,clk,state,t1,read,counters,reset,clear)。//程序計(jì)數(shù)寄存器input clk,state,t1,read,reset,clear。//state為uart狀態(tài)輸入,//clear為程序計(jì)數(shù)寄存器清零控制位output[7:0] counters。output read_enable,send_enable。reg read_enable,send_enable,control。//read_enable為接收控制位?//////////send_enable為發(fā)送控制位,control為程序計(jì)數(shù)寄存器為零狀態(tài)寄存位reg[7:0] counters。//8位程序計(jì)數(shù)寄存器always@(posedge clk)//當(dāng)程序計(jì)數(shù)寄存器為零時(shí),程序計(jì)數(shù)寄存器為零狀態(tài)寄存位置位 begin control=(!counters)? 1 : 0。 end///////////////////////////////////////////////////////////////////////////////////////always@(negedge read)//uart發(fā)送或接收狀態(tài)判斷 if(control) begin if(state) begin if(!read) begin read_enable=1。 send_enable=0。 end else begin send_enable=0。 end end else begin send_enable=1。 read_enable=0。 end end////////////////////////////////////////////////////////////always@(posedge t1) if(!reset amp。amp。 !clear)//reset為1時(shí),clear為1時(shí)程序計(jì)數(shù)寄存器清零 begin if(counters839。b10101111) counters=839。b00000000。 else counters=counters + 1。 end else begin counters=839。b00000000。 endendmodule圖310UART控制器模塊程序仿真圖由圖判讀有:1. 當(dāng)計(jì)時(shí)器為175ns時(shí),!計(jì)時(shí)器==0,control被賦予1;xx_enable未被賦值2. 當(dāng)計(jì)時(shí)器為265ns時(shí),xx_enable未被賦值3. 當(dāng)計(jì)時(shí)器為335ns時(shí),xx_enable被賦值 4. 當(dāng)計(jì)時(shí)器為475ns時(shí),xx_enable被賦值5. 當(dāng)計(jì)時(shí)器為630ns時(shí),xx_enable被賦值6. 當(dāng)計(jì)時(shí)器為721ns時(shí),xx_enable未被賦值7. 當(dāng)計(jì)時(shí)器為850ns時(shí),xx_enable被賦值可判斷UART控制器模塊程序編譯成功為UART控制器提供時(shí)鐘,本文采用9600波特率發(fā)送或接收數(shù)據(jù)。波特率發(fā)生器實(shí)際上就是分頻器,設(shè)計(jì)比較簡(jiǎn)單。///波特率產(chǎn)生模塊module clk_bau(clk,t1,clk_enable)。//時(shí)鐘計(jì)數(shù)器模塊input clk,clk_enable。output t1。//output[8:0] counter1。reg t1。reg[7:0] counter1。//(48,000,000/9,600)=5,000 為一個(gè)數(shù)據(jù)發(fā)送計(jì)數(shù),接收為16倍頻為5,000/16=312always@(posedge clk) if(clk_enable)//當(dāng)clk_enable有效時(shí),計(jì)數(shù)器計(jì)數(shù) begin if(counter1==839。b10010111)//當(dāng)counter等于156時(shí) begin counter1=839。b00000000。//counter清零 t1=t1 + 1。//t1取反 end else begin counter1=counter1 + 1。 t1=t1。 end end else begin counter1=839。b00000000。 t1=0。 endendmodule如圖311;圖311UART波特發(fā)生器程序仿真圖由圖判讀:1. 當(dāng)clk_enable為0時(shí),時(shí)鐘不計(jì)時(shí);2. 當(dāng)clk_enable為1時(shí),時(shí)鐘計(jì)時(shí) 譯文 51