名稱:一種數(shù)據(jù)通信系統(tǒng)設(shè)計Verilog代碼Quartus仿真
軟件:Quartus
語言:Verilog
代碼功能:
要求:系統(tǒng)為同步設(shè)計。TX模塊通過串行通道向RX模塊發(fā)送串行數(shù)據(jù),串行數(shù)據(jù)中包含有效數(shù)據(jù)和無效數(shù)據(jù),串行通道僅有1位時鐘和1位數(shù)據(jù),RX應(yīng)正確接收TX發(fā)來的有效數(shù)據(jù),不接收無效數(shù)據(jù)。自定義標(biāo)記有效數(shù)據(jù)和無效數(shù)據(jù)的方法。
FPGA代碼Verilog/VHDL代碼資源下載:www.hdlcode.com
演示視頻:
設(shè)計文檔:
1. 發(fā)送端代碼文件
2. 接收端代碼文件
3. 發(fā)送端testbench
4. 接收端testbench
5. 仿真圖
發(fā)送端仿真
發(fā)送接收仿真
部分代碼展示:
//發(fā)送端 module?source( ????input??????sys_clk,??????????????????//系統(tǒng)時鐘 ????input?????????sys_rst_n,????????????????//系統(tǒng)復(fù)位,低電平有效 ????input?????????TS_en,????????????????????//發(fā)送使能信號 ????input??[7:0]??TS_data,?????????????????//待發(fā)送數(shù)據(jù) output??reg???clock,???????????????????//串行通道發(fā)送時鐘 ????output??reg???data?????????????????????//串行通道發(fā)送端口 ????); ???? //parameter?define parameter??CLK_FREQ?=?50000000;?????????????//系統(tǒng)時鐘頻率 parameter??BPS?=?115200;?????????????????//波特率 localparam?BPS_CNT??=?CLK_FREQ/BPS;????//為得到指定波特率,對系統(tǒng)時鐘計數(shù)BPS_CNT次 //reg?define reg????????TS_en_d0;? reg????????TS_en_d1;?? reg?[15:0]?clk_cnt;?????????????????????????//系統(tǒng)時鐘計數(shù)器 reg?[?3:0]?tx_cnt;??????????????????????????//發(fā)送數(shù)據(jù)計數(shù)器 reg????????tx_flag;?????????????????????????//發(fā)送過程標(biāo)志信號 reg?[?7:0]?tx_data;?????????????????????????//寄存發(fā)送數(shù)據(jù) //wire?define wire???????en_flag; //***************************************************** //**????????????????????main?code //*****************************************************????????????????????????????????????????? //對發(fā)送使能信號TS_en延遲兩個時鐘周期 always?@(posedge?sys_clk?or?negedge?sys_rst_n)?begin????????? ????if?(!sys_rst_n)?begin ????????TS_en_d0?<=?1'b0;?????????????????????????????????? ????????TS_en_d1?<=?1'b0; ????end?????????????????????????????????????????????????????? ????else?begin??????????????????????????????????????????????? ????????TS_en_d0?<=?TS_en;??????????????????????????????? ????????TS_en_d1?<=?TS_en_d0;???????????????????????????? ????end end //捕獲TS_en上升沿,得到一個時鐘周期的脈沖信號 assign?en_flag?=?(~TS_en_d1)?&?TS_en_d0; //當(dāng)脈沖信號en_flag到達(dá)時,寄存待發(fā)送的數(shù)據(jù),并進(jìn)入發(fā)送過程?????????? always?@(posedge?sys_clk?or?negedge?sys_rst_n)?begin????????? ????if?(!sys_rst_n)?begin?????????????????????????????????? ????????tx_flag?<=?1'b0; ????????tx_data?<=?8'd0; ????end? ????else?if?(en_flag)?begin?????????????????//檢測到發(fā)送使能上升沿?????????????????????? ????????????tx_flag?<=?1'b1;????????????????//進(jìn)入發(fā)送過程,標(biāo)志位tx_flag拉高 ????????????tx_data?<=?TS_data;????????????//寄存待發(fā)送的數(shù)據(jù) ????????end ????????else? ????????if?((tx_cnt?==?4'd9)&&(clk_cnt?==?BPS_CNT/2)) ????????begin???????????????????????????????//計數(shù)到停止位中間時,停止發(fā)送過程 ????????????tx_flag?<=?1'b0;????????????????//發(fā)送過程結(jié)束,標(biāo)志位tx_flag拉低 ????????????tx_data?<=?8'd0; ????????end ????????else?begin ????????????tx_flag?<=?tx_flag; ????????????tx_data?<=?tx_data; ????????end? end //進(jìn)入發(fā)送過程后,啟動系統(tǒng)時鐘計數(shù)器與發(fā)送數(shù)據(jù)計數(shù)器 always?@(posedge?sys_clk?or?negedge?sys_rst_n)?begin????????? ????if?(!sys_rst_n)?begin????????????????????????????? ????????clk_cnt?<=?16'd0;?????????????????????????????????? ????????tx_cnt??<=?4'd0; ????end?????????????????????????????????????????????????????? ????else?if?(tx_flag)?begin?????????????????//處于發(fā)送過程 ????????if?(clk_cnt?<?BPS_CNT?-?1)?begin ????????????clk_cnt?<=?clk_cnt?+?1'b1; ????????????tx_cnt??<=?tx_cnt; ????????end ????????else?begin ????????????clk_cnt?<=?16'd0;???????????????//對系統(tǒng)時鐘計數(shù)達(dá)一個波特率周期后清零 ????????????tx_cnt??<=?tx_cnt?+?1'b1;???????//此時發(fā)送數(shù)據(jù)計數(shù)器加1 ????????end ????end ????else?begin??????????????????????????????//發(fā)送過程結(jié)束 ????????clk_cnt?<=?16'd0; ????????tx_cnt??<=?4'd0; ????end end //根據(jù)clk_cnt計數(shù)器控制輸出串行通道發(fā)送時鐘 always?@(posedge?sys_clk?or?negedge?sys_rst_n)?? if?(!sys_rst_n)??? clock<=0; else?if?(clk_cnt?>?BPS_CNT/2)? clock<=1;//高電平 else clock<=0;//低電平
點(diǎn)擊鏈接獲取代碼文件:http://www.hdlcode.com/index.php?m=home&c=View&a=index&aid=588