• 方案介紹
  • 附件下載
  • 相關(guān)推薦
申請入駐 產(chǎn)業(yè)圖譜

一種數(shù)據(jù)通信系統(tǒng)設(shè)計Verilog代碼Quartus仿真

加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

2-24011G04200221.doc

共1個文件

名稱:一種數(shù)據(jù)通信系統(tǒng)設(shè)計Verilog代碼Quartus仿真

軟件:Quartus

語言:Verilog

代碼功能:

QQ圖片20240117103925.png

要求:系統(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

  • 2-24011G04200221.doc
    下載

相關(guān)推薦