基于verilog hdl语言的串口设计

上传人:第*** 文档编号:32823105 上传时间:2018-02-12 格式:DOCX 页数:28 大小:56.38KB
返回 下载 相关 举报
基于verilog hdl语言的串口设计_第1页
第1页 / 共28页
基于verilog hdl语言的串口设计_第2页
第2页 / 共28页
基于verilog hdl语言的串口设计_第3页
第3页 / 共28页
基于verilog hdl语言的串口设计_第4页
第4页 / 共28页
基于verilog hdl语言的串口设计_第5页
第5页 / 共28页
点击查看更多>>
资源描述

《基于verilog hdl语言的串口设计》由会员分享,可在线阅读,更多相关《基于verilog hdl语言的串口设计(28页珍藏版)》请在金锄头文库上搜索。

1、基于 Verilog HDL 语言的串口设计串口 Verilog HDL 代码:/串口module trans(clk,rst,en,TxD_data,Wsec,RxD,TxD,TxD_busy,rcven,RxD_data);/时钟50MHzinput clk,rst,en; /en 时发送数据使能input 7:0TxD_data; /发送数据输入input 2:0Wsec; /波特率调节 0-2400;1-4800;2-9600 ;3-14400;4-19200;5-38400 ;6-115200;7-128000input RxD; /接收数据输入端output TxD,TxD_bus

2、y,rcven;/发送,发送忙,接收结束标志输出output 7:0RxD_data;/接收数据输出wire Baud1,Baud8;reg 7:0addwire;/RAM 地址连线reg 7:0data;wire7:0AD_t;/读取 RAM 数据的地址用于发送wire7:0AD_r;/接收的数据存储在 RAM 中的地址wire 7:0datawire;/数据连线/发送例化trans_t tt1(.clk_t(clk),.rst_t(rst),.en_t(en),.BTI_t(Baud1),.recen(recen),.TxD_data_t(datawire),.TxD_t(TxD),.ad

3、dro_t(AD_t),.TxD_busy_t(TxD_busy);/波特生成例化BaudG tt2(.clk_b(clk),.rst_b(rst),.BTO_b(Baud1),.BTO_R(Baud8),.Wsec_b(Wsec);/接收例化trans_r tt3(.clk_r(clk),.rst_r(rst),.BTI_r(Baud8),.RxD_r(RxD),.RxD_data_r(RxD_data),.wren_r(wren_r),.addro_r(AD_r),.RxD_end(RxD_end);/LPM_RAM 例化RAM0 tt4(.address(addwire),.clock(

4、clk),.data(data),.wren(wren_r),.q(datawire);always (posedge clk or negedge rst)if(rst)addwire 1302)begin FT8=1b1; BGA162500)begin FT=1b1;FT8=1b1; BGA1651)begin FT8=1b1; BGA162500)begin FT=1b1; FT8=1b1; BGA1651)begin FT8=1b1; BGA115625)begin FT=1b1;FT8=1b1; BGA1217)begin FT8=1b1; BGA117361)begin FT=1

5、b1;FT8=1b1; BGA1651)begin FT8=1b1; BGA115625)begin FT=1b1; FT8=1b1; BGA1244)begin FT8=1b1; BGA115625)begin FT=1b1;FT8=1b1; BGA1217)begin FT8=1b1; BGA1434) begin FT=1b1;FT8=1b1; BGA1122)begin FT8=1b1; BGA13125) begin FT=1b1; BGA=2000000) printf(*); else printf( );acc %= 2000000;这段代码会精确的以平均每 17.361111

6、111. 个时钟间隔打印出一个*。为了从 FPGA 得到同样的效果,考虑到串行接口可以容忍一定的波特率误差,所以即使我们使用 17.3 或者 17.4 这样的分频比也是没有关系的。FPGA 波特率发生器我们希望 2000000 是 2 的整数幂,但很可惜,它不是。所以我们改变分频比,2000000/115200 约等于 1024/59 = 17.356. 这跟我们要求的分频比很接近,并且使得在 FPGA 上实现起来相当有效。/10 位的累加器 (9:0), 1 位进位输出 (10)reg 10:0 acc; /一共 11 位!always (posedge clk)acc 5)/(ClkFre

7、quency4);这行程序也使得结果成为整数,从而避免截断。这就是整个的设计方法了。现在我们已经得到了足够精确的波特率,可以继续设计串行接收和发送模块了。FPGA 实现串行接口 RS232(3)2008-12-17 11:40RS-232 发送模块下面是我们所想要实现的:它应该能像这样工作: 发送器接收 8 位的数据,并将其串行输出。 (TxD_start置位后开始传输). 当有数传输的时候,使busy信号有效,此时“TxD_start” 信号被忽略. RS-232 模块的参数是固定的: 8 位数据, 2 个停止位, 无奇偶校验.数据串行化假设我们已经有了一个 115200 波特的BaudTi

8、ck信号.我们需要产生开始位、8 位数据以及停止位。用状态机来实现看起来比较合适。reg 3:0 state;always (posedge clk)case(state)4b0000: if(TxD_start) state =1&state_rec=8) beginif(clkbaud_rec) beginrxd_buf7=rxd_reg2;rxd_buf6:0=rxd_buf7:1;state_rec=state_rec+1;endendelse if(state_rec=9) beginif(clkbaud_rec) beginstate_rec=0;recstart=0;endend

9、endendalways(rxd_buf) /将接受的数据用数码管显示出来begincase (rxd_buf)8h30:seg_data=8b0000_0011;8h31: seg_data=8b1001_1111;8h32:seg_data=8b0010_0101;8h33:seg_data=8b0000_1101;8h34:seg_data=8b1001_1001;8h35:seg_data=8b0100_1001;8h36:seg_data=8b0100_0001;8h37:seg_data=8b0001_1111;8h38:seg_data=8b0000_0001;8h39:seg_data=8b0001_1001;8h41:seg_data=8b0001_0001;8h42:seg_data=8b1100_0001;8h43:seg_data=8b0110_0011;8h44:seg_data=8b1000_0101;8h45:seg_data=8b0110_0001;8h46:seg_data=8b0111_0001;default:seg_data=8b1111_1111;endcaseend endmodule

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 建筑/环境 > 工程造价

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号