开发工具:Quartus II 9.1;

仿真软件:Questa Sim 10.0c;

硬件平台:Terasic DE2-115(EP2C35F672C6);

外设:MAX3232;

3个工程文件:"uart_baud.v" + "uart_rx.v" + "uart_tx.v";

2个仿真文件::"uart_rx_tsb.v" + "uart_tx_tsb.v"

设计思路:略

注意事项:波特率模块采样脉冲式分频;

     接收模块仅在一个时刻采样,若需要考虑误码率可在状态机里插入0-1计数器;

partI:uart_baud.v

 `timescale  ns /  ps
`define SYS_CLK
`define BAUD
`define DIV `SYS_CLK/`BAUD/
module uart_baud(
sys_clk,
sys_rst_n,
sys_baud16_o,
sys_baud_o
);
input sys_clk;
input sys_rst_n;
output sys_baud16_o;
output sys_baud_o; reg [:] baud16_cnt =; always @ (posedge sys_clk) begin
if('b0 == sys_rst_n) baud16_cnt <= 0;
else if(baud16_cnt == `DIV-) baud16_cnt <= ;
else baud16_cnt <= baud16_cnt + 'd1;
end reg [:] baud_cnt = ;
always @ (posedge sys_clk) begin
if('b0 == sys_rst_n) baud_cnt <= 0;
else if(sys_baud16_o == 'b1) baud_cnt <= baud_cnt + 1'd1;
else baud_cnt <= baud_cnt;
end assign sys_baud16_o = (baud16_cnt == `DIV-)?'b1:1'b0;
assign sys_baud_o = ((baud_cnt == 'd15) && (sys_baud16_o == 1'b1))?'b1:1'b0; endmodule

partII:uart_tx.v

 `timescale  ns /  ps
`define SIM
module uart_tx(
sys_clk,
sys_rst_n,
sys_baud_i,
sys_wreq_i,
sys_data_i,
uart_tx,
uart_tx_idle_o,
uart_tx_ack_o
);
input sys_clk;
input sys_rst_n;
input sys_baud_i;
input sys_wreq_i;
input [:] sys_data_i;
output uart_tx;
output uart_tx_idle_o;
output uart_tx_ack_o;
`ifdef SIM
parameter ST_WIDTH = ;
parameter IDLE = "IDLE.",
START = "START",
SHIFT = "SHIFT",
CHECK = "CHECK",
END = "END..";
`else
parameter ST_WIDTH = ;
parameter IDLE = 'b0_0001,
START = 'b0_0010,
SHIFT = 'b0_0100,
CHECK = 'b0_1000,
END = 'b1_0000;
`endif
parameter EVEN = 'd0; reg [ST_WIDTH-:] c_st = IDLE;
reg [ST_WIDTH-:] n_st = IDLE;
reg check_bit = ; //奇偶检验位
reg [:] bit_cnt = ; //计数8个比特
reg uart_tx=; always @ (posedge sys_clk) begin
if(sys_rst_n == 'b0) c_st <= IDLE;
else c_st <= n_st;
end always @ (*) begin
n_st = IDLE;
case(c_st)
IDLE:begin
n_st = ('b1 == sys_wreq_i)?START:IDLE;end
START:begin
n_st = (sys_baud_i == 'b1)?SHIFT:START;end
SHIFT:begin
n_st = ((bit_cnt == 'd7) && (sys_baud_i == 1'b1))?CHECK:SHIFT;end
CHECK:begin
n_st = (sys_baud_i == 'b1)?END:CHECK;end
END:begin
n_st = (sys_baud_i == 'b1)?IDLE:END;end
default:begin
n_st = IDLE;end
endcase
end always @ (posedge sys_clk) begin
if('b0 == sys_rst_n) begin
bit_cnt <= 'd7;
uart_tx <= ;
check_bit <= EVEN;
end
else begin
case(n_st)
IDLE:begin
bit_cnt <= 'd7;
uart_tx <= ;
check_bit <= EVEN;end
START:begin
bit_cnt <= 'd7;
uart_tx <= ;
check_bit <= EVEN;end
SHIFT:begin
uart_tx <= sys_data_i[bit_cnt];
check_bit <= (sys_baud_i == 'b1)?check_bit^sys_data_i[bit_cnt]:check_bit;
bit_cnt <= (sys_baud_i == 'b1)?bit_cnt + 1'd1:bit_cnt;end
CHECK:begin
uart_tx <= check_bit;
check_bit <= check_bit;
bit_cnt <= 'd7;end
END:begin
bit_cnt <= 'd7;
check_bit <= check_bit;
uart_tx <= ;end
default:begin
bit_cnt <= bit_cnt;
check_bit <= check_bit;
uart_tx <= uart_tx;end
endcase
end
end //assign
assign uart_tx_idle_o = (c_st == IDLE)?'b1:1'b0;
assign uart_tx_ack_o = ((c_st == END) && (sys_baud_i == 'b1))?1'b1:'b0; endmodule

partIII:uart_rx.v

 `timescale  ns /  ps
`define SIM
module uart_rx(
sys_clk,
sys_rst_n,
uart_rx,
sys_baud16_i,
uart_rx_idle_o,
uart_rx_ack_o,
uart_rx_error_o,
sys_data_o
);
input sys_clk;
input sys_rst_n;
input uart_rx;
input sys_baud16_i;
output uart_rx_idle_o;
output uart_rx_ack_o;
output uart_rx_error_o;
output [:] sys_data_o;
parameter EVEN = 'd0;
`ifdef SIM
parameter ST_WIDTH = ;
parameter IDLE = "IDLE.",
START = "START",
SHIFT = "SHIFT",
CHECK = "CHECK",
END = "END..";
`else
parameter ST_WIDTH = ;
parameter IDLE = 'b0_0001,
START = 'b0_0010,
SHIFT = 'b0_0100,
CHECK = 'b0_1000,
END = 'b1_0000;
`endif //capture the negedge of rx
reg rx_r0=;
wire rx_trigger; always @ (posedge sys_clk) begin
if('b0 == sys_rst_n) rx_r0 <= 1;
else if('b1 == sys_baud16_i) rx_r0 <= uart_rx;
else rx_r0 <= rx_r0;
end assign rx_trigger = ~uart_rx & rx_r0; //fsm
reg [ST_WIDTH-:] c_st = IDLE;
reg [ST_WIDTH-:] n_st = IDLE;
reg [:] bit_cnt = 'd0;
reg [:] clk_cnt = 'd0;
reg [:] sys_data = 'd0;
reg check_bit = EVEN;
reg error = ;
//fsm-1
always @ (posedge sys_clk) begin
if(sys_rst_n == 'b0) c_st <= IDLE;
else c_st <= n_st;
end
//fsm-2
always @ (*) begin
n_st = IDLE;
case(c_st)
IDLE:begin
n_st = (rx_trigger == 'b1)?START:IDLE;end
START:begin
n_st = (clk_cnt == 'd15 && sys_baud16_i == 1'b1)?SHIFT:START;end
SHIFT:begin
n_st = ((clk_cnt == 'd15)&&(bit_cnt == 4'd8))?CHECK:SHIFT;end
CHECK:begin
n_st = (clk_cnt == 'd15 && bit_cnt == 4'd9)?END:CHECK;end
END:begin
n_st = (clk_cnt == 'd15 && bit_cnt == 4'd10)?IDLE:END;end
default:begin
n_st = IDLE;end
endcase
end
//fsm-3
always @ (posedge sys_clk) begin
if(sys_rst_n == 'b0) begin
sys_data <= 'd0;
error <= ;
clk_cnt <= 'd0;
bit_cnt <= 'd0;
check_bit <= EVEN;end
else begin
case(n_st)
IDLE:begin
sys_data <= sys_data;
error <= ;
clk_cnt <= 'd0;
bit_cnt <= 'd0;
check_bit <= EVEN;end
START:begin
sys_data <= sys_data;
error <= ;
clk_cnt <= (sys_baud16_i == 'b1)?(clk_cnt+1'd1):clk_cnt;
bit_cnt <= 'd0;
check_bit <= EVEN;end
SHIFT:begin
sys_data <= ((sys_baud16_i == 'b1)&&(clk_cnt == 4'd15))?{uart_rx,sys_data[:]}:sys_data;
error <= ;
clk_cnt <= (sys_baud16_i)?clk_cnt+'d1:clk_cnt;
bit_cnt <= ((sys_baud16_i)&&(clk_cnt == 'd15))?bit_cnt+1'd1:bit_cnt;
check_bit <= ((sys_baud16_i)&&(clk_cnt == 'd15))?check_bit^sys_data[bit_cnt]:check_bit;end
CHECK:begin
sys_data <= sys_data;
error <= ((sys_baud16_i)&&(clk_cnt == 'd15)&&(uart_rx!=check_bit))?1'b1:error;
clk_cnt <= (sys_baud16_i)?clk_cnt+'d1:clk_cnt;
bit_cnt <= ((sys_baud16_i)&&(clk_cnt == 'd15))?bit_cnt+1'd1:bit_cnt;
check_bit <=check_bit;end
END:begin
sys_data <= sys_data;
error <= error;
clk_cnt <= (sys_baud16_i)?clk_cnt+'d1:clk_cnt;
bit_cnt <= ((sys_baud16_i)&&(clk_cnt == 'd15))?bit_cnt+1'd1:bit_cnt;
check_bit <= check_bit;end
default:begin
sys_data <= sys_data;
error <= ;
clk_cnt <= 'd0;
bit_cnt <= 'd0;
check_bit <= EVEN;end
endcase
end
end //assign
assign uart_rx_error_o = error;
assign sys_data_o = sys_data;
assign uart_rx_idle_o = (c_st == IDLE)?'b1:1'b0;
assign uart_rx_ack_o = ((c_st == END) && (sys_baud16_i == 'b1) && (clk_cnt == 4'd15))?'b1:1'b0; endmodule

partIV:uart_tx_tsb.v

 `timescale  ns /  ps
module uart_tx_tsb();
reg sys_clk;
reg sys_rst_n; reg [:] sys_data_i;
reg sys_wreq_i;
initial begin
sys_clk=;
sys_data_i=;
sys_wreq_i=;
sys_rst_n=;
# sys_rst_n=;
end always begin
# sys_clk=~sys_clk;end wire sys_baud16_o;
wire sys_baud_o; uart_baud u0(
.sys_clk( sys_clk ),
.sys_rst_n( sys_rst_n ),
.sys_baud16_o( sys_baud16_o ),
.sys_baud_o( sys_baud_o )
); wire uart_tx;
wire uart_idle_o;
wire uart_ack_o;
uart_tx u1(
.sys_clk( sys_clk ),
.sys_rst_n( sys_rst_n ),
.sys_baud_i( sys_baud_o ),
.sys_wreq_i( sys_wreq_i ),
.sys_data_i( sys_data_i ),
.uart_tx( uart_tx ),
.uart_idle_o( uart_idle_o ),
.uart_ack_o( uart_ack_o )
); always @ (posedge sys_clk) begin
if(sys_rst_n == 'b0) begin
sys_wreq_i <= ;
sys_data_i <= ;end
else if(uart_ack_o) begin
sys_wreq_i <= ;
sys_data_i <= sys_data_i + 'd1;end
else begin
sys_wreq_i <= ;
sys_data_i <= sys_data_i;end
end endmodule

partV:uart_rx_tsb.v

 `timescale  ns /  ps
module uart_rx_tsb();
reg sys_clk;
reg sys_rst_n; reg [:] sys_data_i;
reg sys_wreq_i;
initial begin
sys_clk=;
sys_data_i=;
sys_wreq_i=;
sys_rst_n=;
# sys_rst_n=;
end always begin
# sys_clk=~sys_clk;end wire sys_baud16_o;
wire sys_baud_o; uart_baud u0(
.sys_clk( sys_clk ),
.sys_rst_n( sys_rst_n ),
.sys_baud16_o( sys_baud16_o ),
.sys_baud_o( sys_baud_o )
); wire uart_tx;
wire uart_tx_idle_o;
wire uart_tx_ack_o;
uart_tx u1(
.sys_clk( sys_clk ),
.sys_rst_n( sys_rst_n ),
.sys_baud_i( sys_baud_o ),
.sys_wreq_i( sys_wreq_i ),
.sys_data_i( sys_data_i ),
.uart_tx( uart_tx ),
.uart_tx_idle_o( uart_tx_idle_o ),
.uart_tx_ack_o( uart_tx_ack_o )
); always @ (posedge sys_clk) begin
if(sys_rst_n == 'b0) begin
sys_wreq_i <= ;
sys_data_i <= ;end
else if(uart_tx_ack_o) begin
sys_wreq_i <= ;
sys_data_i <= sys_data_i + 'd1;end
else begin
sys_wreq_i <= ;
sys_data_i <= sys_data_i;end
end wire uart_rx_idle_o;
wire uart_rx_ack_o;
wire uart_rx_error_o;
wire [:] sys_data_o;
uart_rx u2(
.sys_clk( sys_clk ),
.sys_rst_n( sys_rst_n ),
.uart_rx( uart_tx ),
.sys_baud16_i( sys_baud16_o ),
.uart_rx_idle_o( uart_rx_idle_o ),
.uart_rx_ack_o( uart_rx_ack_o ),
.uart_rx_error_o( uart_rx_error_o ),
.sys_data_o( sys_data_o )
);
endmodule

Uart的Verilog建模的更多相关文章

  1. Norflash控制器的Verilog建模之一

    摘要:今天驱动一款SPANSION公司生产的norflash——S29AL032D70,没有别的参考资料,大致了解一下norflash的内部cmos电路架构以及其用途之后,直接看手册吧. 如何看手册: ...

  2. verilog 建模笔记--低级建模

    来源  <verilog HDL那些事--建模篇> 1.并行建模的思想. 2.每个模块最好只有一个功能.(便于修改和扩展,特别在大的项目中) 典型的 HDL 教科书中,才不会要读者了解“模 ...

  3. SDRAM控制器的Verilog建模之一

    前言:作为经典存储器的三剑客中的flash和sram已经建模测试过了,虽然现在都已经ddr2,ddr3,667MHZ.1333MHZ的天下了,但是接下这周来准备写一下sdram的controller. ...

  4. Norflash控制器的Verilog建模之二(仿真)

    前言:经过几天修改,norflash控制器基本已经完成,通过仿真.完整的norflash包含2个模块:直接操作硬件的norflash_ctrl.v与控制ctrl模块的驱动norflash_driver ...

  5. 异步SRAM控制器的Verilog建模

    前言:sram顾名思义静态随机存储器,分为asram异步型和ssram同步型.这里驱动DE2上一块ISSI公司的512KB的asram. 设计思路:因为实际应用中单字节读写效率不高,所以本设计中仿照s ...

  6. I2C控制器的Verilog建模之三(完结版)

    前言:终于到了测试篇,不过悲剧了一下.按照之前<二>里面的思路,在顶层用一个复用器驱动读写独立模块的I2C总线确实失败.虽然综合过去了,不过警告里已经说明:底层的2个原本是inout三态口 ...

  7. I2C控制器的Verilog建模之一

    前言:之前申请了ADI公司的一款ADV7181CBSTZ的视频解码芯片,正好原装DE2板子安的是同系列的ADV7181BBSTZ.虽然都是ADV7181的宗出,但是寄存器配置等等还是有些诧异,引脚也不 ...

  8. No.5 Verilog 建模方式

    5-1 门级建模 VerilogHDL内建基元门: 多输入门:and, nand, or, nor, xor, xnor; 多输出门:buf, not 三态门:bufif0, bufif1, noti ...

  9. Norflash控制器的Verilog建模之三(測試)

    前言:回校了,辦好手續就著手寫測試篇.初步的norflash控制器已經完成,通過硬件測試.目前的norflash完成扇区块擦除.单字节写.单字节读3个功能.博文最后附上源码. 总结:和之前的博文一样, ...

随机推荐

  1. Sql获取第一天、最后一天

    昨天面试一家公司,上机题目中要求获取每月最后一笔订单.用到了日期的选择性查询,回来在ITeye上找到了这篇文章. 原文: http://new-fighter.iteye.com/blog/17587 ...

  2. div嵌套引起的margin-top不起作用

    通常大家在制作网页的过程中会遇到很多棘手的问题,比如我在写一个页面的时候,遇到了div嵌套引起的margin-top不起作用,对内部的div设置margin-top时,内部对于外部的div并没有产生一 ...

  3. php大力力 [042节] 今天做了一个删除功能

    php大力力 [042节] 今天做了一个删除功能 if(isset($_GET['action'])){ if($_GET['action']=="del"){ $sql = &q ...

  4. angular插件合集

    图片视频类 angular-maxonry 图片墙效果插件,可以将图片组织成类似于瀑布流的效果,依赖于jQuery.imageloaded和Masonry angular-deckgrid 另一个照片 ...

  5. c++嵌套类-内存分配

    首先看下列代码:int main(){    double *p;    printf("sizeof(int):%d\nsizeof(double):%d\nsizeof(ptr):%d\ ...

  6. ZeroMQ - 三种模型的python实现

    ZeroMQ是一个消息队列网络库,实现网络常用技术封装.在C/S中实现了三种模式,这段时间用python简单实现了一下,感觉python虽然灵活.但是数据处理不如C++自由灵活. 1.Request- ...

  7. 字符串匹配--manacher算法模板

    manacher算法主要是处理字符串中关于回文串的问题的,它可以在 O(n) 的时间处理出以字符串中每一个字符为中心的回文串半径,由于将原字符串处理成两倍长度的新串,在每两个字符之间加入一个特定的特殊 ...

  8. 一些上流的CSS3图片样式

    直接在图片元素上直接应用CSS3 inset box-shadow 或 border-radius时,浏览器并不能完美的渲染它们.不过,如果把这个图片用作背景图,你就可以可以给它添加任何样式了,浏览器 ...

  9. javaScript DOM JQuery AJAX

    http://www.cnblogs.com/wupeiqi/articles/5369773.html 一 JavaScript JavaScript是一门编程语言,浏览器内置了JavaScript ...

  10. 各种Linux发行版本优缺点对比[转]

    转自:http://www.zzbeidaqingniao.com/linux/20100127/1495.html linux最早由Linus Benedict Torvalds在1991年开始编写 ...