03_串口 RS232( 五 )


8.8.1
`timescale1ns/1nsmoduletb_uart_rx();//********************************************************************////****************** Parameter and Internal Signal *******************////********************************************************************////regdefineregsys_clk;regsys_rst_n;regrx;//wiredefinewire[7:0]po_data;wirepo_flag;//********************************************************************////***************************** Main Code ****************************////********************************************************************////初始化系统时钟、全局复位和输入信号initial beginsys_clk= 1'b1;sys_rst_n <= 1'b0;rx<= 1'b1;#20;sys_rst_n <= 1'b1;end//模拟发送8次数据,分别为0~7initial begin#200rx_bit(8'd0);//任务的调用,任务名+括号中要传递进任务的参数rx_bit(8'd1);rx_bit(8'd2);rx_bit(8'd3);rx_bit(8'd4);rx_bit(8'd5);rx_bit(8'd6);rx_bit(8'd7);end//sys_clk:每10ns电平翻转一次,产生一个50MHz的时钟信号always #10 sys_clk = ~sys_clk;//定义一个名为rx_bit的任务,每次发送的数据有10位//data的值分别为0~7由j的值传递进来//任务以task开头,后面紧跟着的是任务名,调用时使用task rx_bit(//传递到任务中的参数,调用任务的时候从外部传进来一个8位的值input[7:0]data);integer i;//定义一个常量//用for循环产生一帧数据,for括号中最后执行的内容只能写i=i+1//不可以写成C语言i=i++的形式for(i=0; i<10; i=i+1) begincase(i)0: rx <= 1'b0;1: rx <= data[0];2: rx <= data[1];3: rx <= data[2];4: rx <= data[3];5: rx <= data[4];6: rx <= data[5];7: rx <= data[6];8: rx <= data[7];9: rx <= 1'b1;endcase#(5208*20); //每发送1位数据延时5208个时钟周期endendtask//任务以endtask结束//********************************************************************////*************************** Instantiation **************************////********************************************************************////------------------------uart_rx_inst------------------------uart_rx uart_rx_inst(.sys_clk(sys_clk),//inputsys_clk.sys_rst_n(sys_rst_n),//inputsys_rst_n.rx(rx),//inputrx.po_data(po_data),//output[7:0]po_data.po_flag(po_flag)//outputpo_flag);endmodule
8.2
`timescale1ns/1ns/moduletb_uart_tx();//********************************************************************////****************** Parameter and Internal Signal *******************////********************************************************************////regdefineregsys_clk;regsys_rst_n;reg [7:0]pi_data;regpi_flag;//wiredefinewiretx;//********************************************************************////***************************** Main Code ****************************////********************************************************************////初始化系统时钟、全局复位initial beginsys_clk= 1'b1;sys_rst_n <= 1'b0;#20;sys_rst_n <= 1'b1;end//模拟发送7次数据,分别为0~7initial beginpi_data <= 8'b0;pi_flag <= 1'b0;#200//发送数据0pi_data <= 8'd0;pi_flag <= 1'b1;#20pi_flag <= 1'b0;//每发送1bit数据需要5208个时钟周期,一帧数据为10bit//所以需要数据延时(5208*20*10)后再产生下一个数据#(5208*20*10);//发送数据1pi_data <= 8'd1;pi_flag <= 1'b1;#20pi_flag <= 1'b0;#(5208*20*10);//发送数据2pi_data <= 8'd2;pi_flag <= 1'b1;#20pi_flag <= 1'b0;#(5208*20*10);//发送数据3pi_data <= 8'd3;pi_flag <= 1'b1;#20pi_flag <= 1'b0;#(5208*20*10);//发送数据4pi_data <= 8'd4;pi_flag <= 1'b1;#20pi_flag <= 1'b0;#(5208*20*10);//发送数据5pi_data <= 8'd5;pi_flag <= 1'b1;#20pi_flag <= 1'b0;#(5208*20*10);//发送数据6pi_data <= 8'd6;pi_flag <= 1'b1;#20pi_flag <= 1'b0;#(5208*20*10);//发送数据7pi_data <= 8'd7;pi_flag <= 1'b1;#20pi_flag <= 1'b0;end//sys_clk:每10ns电平翻转一次,产生一个50MHz的时钟信号always #10 sys_clk = ~sys_clk;//********************************************************************////*************************** Instantiation **************************////********************************************************************////------------------------uart_rx_inst------------------------uart_tx uart_tx_inst(.sys_clk(sys_clk),//inputsys_clk.sys_rst_n(sys_rst_n),//inputsys_rst_n.pi_data(pi_data),//output[7:0]pi_data.pi_flag(pi_flag),//outputpi_flag.tx(tx)//inputtx);endmodule