完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
module uart_tx #( parameter UART_BPS = 'd9600 , parameter CLK_FREQ = 'd50_000_000 ) ( input wire sys_clk , input wire sys_rst_n , input wire [7:0] pi_data , input wire pi_flag , output reg tx ); parameter BAUD_CNT_MAX = CLK_FREQ / UART_BPS; reg work_en ; reg [15:0] baud_cnt ; reg bit_flag ; reg [3:0] bit_cnt ; always@(posedge sys_clk or negedge sys_rst_n) if(sys_rst_n == 1'b0) work_en <= 1'b0; else if(pi_flag == 1'b1) work_en <= 1'b1; else if((bit_cnt == 4'd9) && (bit_flag == 1'b1)) work_en <= 1'b0; always@(posedge sys_clk or negedge sys_rst_n) if(sys_rst_n == 1'b0) baud_cnt <= 16'd0; else if((work_en == 1'b0) || (baud_cnt == BAUD_CNT_MAX - 1)) baud_cnt <= 16'd0; else baud_cnt <= baud_cnt + 1'b1; always@(posedge sys_clk or negedge sys_rst_n) if(sys_rst_n == 1'b0) bit_flag <= 1'b0; else if(baud_cnt == 16'd1) bit_flag <= 1'b1; else bit_flag <= 1'b0; always@(posedge sys_clk or negedge sys_rst_n) if(sys_rst_n == 1'b0) bit_cnt <= 4'd0; else if((bit_flag == 1'b1) && (bit_cnt == 4'd9)) bit_cnt <= 4'b0; else if((bit_flag == 1'b1) && (work_en == 1'b1)) bit_cnt <= bit_cnt + 1'b1; always@(posedge sys_clk or negedge sys_rst_n) if(sys_rst_n == 1'b0) tx <= 1'b1; else if(bit_flag == 1'b1) case(bit_cnt) 0:tx <= 1'b0; 1:tx <= pi_data[0]; 2:tx <= pi_data[1]; 3:tx <= pi_data[2]; 4:tx <= pi_data[3]; 5:tx <= pi_data[4]; 6:tx <= pi_data[5]; 7:tx <= pi_data[6]; 8:tx <= pi_data[7]; 9:tx <= 1'b1; default:tx <= 1'b1; endcase endmodule 编写顶层模块代码 module rs232 ( input wire sys_clk , input wire sys_rst_n , input wire rx , output wire tx ); wire [7:0] rx_data; wire rx_flag; uart_rx #( .UART_BPS (9600 ), .CLK_FREQ (50_000_000) ) uart_rx_inst ( .sys_clk (sys_clk ), .sys_rst_n (sys_rst_n), .rx (rx ), .po_data (rx_data), .po_flag (rx_flag) ); uart_tx #( .UART_BPS(9600 ), .CLK_FREQ(50_000_000) ) uart_tx_inst ( .sys_clk (sys_clk ), .sys_rst_n (sys_rst_n), .pi_data (rx_data), .pi_flag (rx_flag), .tx () ); endmodule 编写顶层模块的仿真代码 `timescale 1ns/1ns module tb_rs232(); reg sys_clk ; reg sys_rst_n ; reg rx ; wire tx ; initial begin sys_clk = 1'b1; sys_rst_n <= 1'b0; rx <= 1'b1; #20 sys_rst_n <= 1'b1; end always #10 sys_clk = ~sys_clk; initial begin #200 rx_byte(); end task rx_byte(); integer j; for(j=0;j<9;j=j+1) rx_data(j); task rx_bit ( input [7:0] data ); integer i; for(i = 0;i < 10; i = i + 1) begin case(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); end endtask rs232 rs232_inst ( .sys_clk (sys_clk), .sys_rst_n (sys_rst_n), .rx (rx), .tx (tx) ); endmodule |
|
|
|
只有小组成员才能发言,加入小组>>
3310 浏览 9 评论
2991 浏览 16 评论
3492 浏览 1 评论
9057 浏览 16 评论
4086 浏览 18 评论
1175浏览 3评论
603浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
596浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2333浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1894浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-22 11:30 , Processed in 1.049274 second(s), Total 49, Slave 40 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号