Uart的Verilog建模
开发工具: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建模的更多相关文章
- Norflash控制器的Verilog建模之一
摘要:今天驱动一款SPANSION公司生产的norflash——S29AL032D70,没有别的参考资料,大致了解一下norflash的内部cmos电路架构以及其用途之后,直接看手册吧. 如何看手册: ...
- verilog 建模笔记--低级建模
来源 <verilog HDL那些事--建模篇> 1.并行建模的思想. 2.每个模块最好只有一个功能.(便于修改和扩展,特别在大的项目中) 典型的 HDL 教科书中,才不会要读者了解“模 ...
- SDRAM控制器的Verilog建模之一
前言:作为经典存储器的三剑客中的flash和sram已经建模测试过了,虽然现在都已经ddr2,ddr3,667MHZ.1333MHZ的天下了,但是接下这周来准备写一下sdram的controller. ...
- Norflash控制器的Verilog建模之二(仿真)
前言:经过几天修改,norflash控制器基本已经完成,通过仿真.完整的norflash包含2个模块:直接操作硬件的norflash_ctrl.v与控制ctrl模块的驱动norflash_driver ...
- 异步SRAM控制器的Verilog建模
前言:sram顾名思义静态随机存储器,分为asram异步型和ssram同步型.这里驱动DE2上一块ISSI公司的512KB的asram. 设计思路:因为实际应用中单字节读写效率不高,所以本设计中仿照s ...
- I2C控制器的Verilog建模之三(完结版)
前言:终于到了测试篇,不过悲剧了一下.按照之前<二>里面的思路,在顶层用一个复用器驱动读写独立模块的I2C总线确实失败.虽然综合过去了,不过警告里已经说明:底层的2个原本是inout三态口 ...
- I2C控制器的Verilog建模之一
前言:之前申请了ADI公司的一款ADV7181CBSTZ的视频解码芯片,正好原装DE2板子安的是同系列的ADV7181BBSTZ.虽然都是ADV7181的宗出,但是寄存器配置等等还是有些诧异,引脚也不 ...
- No.5 Verilog 建模方式
5-1 门级建模 VerilogHDL内建基元门: 多输入门:and, nand, or, nor, xor, xnor; 多输出门:buf, not 三态门:bufif0, bufif1, noti ...
- Norflash控制器的Verilog建模之三(測試)
前言:回校了,辦好手續就著手寫測試篇.初步的norflash控制器已經完成,通過硬件測試.目前的norflash完成扇区块擦除.单字节写.单字节读3个功能.博文最后附上源码. 总结:和之前的博文一样, ...
随机推荐
- uboot 各种烧写命令
norflash 烧写 (7) Nor Flash指令 Nor Flash 的命令经常用于烧写数据到Nor Flash . flinfo 打印Flash存储器的信息,并列出所有Sector. fli ...
- Hadoop随笔(一):工作流程的源码
一.几个可能会用到的属性值 1.mapred.map.tasks.speculative.execution和mapred.reduce.tasks.speculative.execution 这两个 ...
- 安装生物信息学软件-Biopython
其实好多东西装过好多次,然而每次都要翻文档,经常掉进前面掉进过的坑...所以这里重新写一份指南,以防下次再装又忘了(魂淡我并不想再装了啊不要立flag) 1. 安装biopython 1.1 因为bi ...
- github常见操作和常见错误!错误提示:fatal: remote origin already exists.
如果输入$ git remote add origin git@github.com:djqiang(github帐号名)/gitdemo(项目名).git 提示出错信息:fatal: remote ...
- Smart210学习记录----nand flash驱动
[详解]如何编写Linux下Nand Flash驱动 :http://www.cnblogs.com/linux-rookie/articles/3016990.html 当读写文件请求到来的时候, ...
- Android关联源码support-v4,v7,v13源码(转)
在Android实际开发过程中往往会遇到使用v4,v7或v13兼容包中的一些类如ViewPager,Fragment等,但却无法关联源码. 在网上搜索之后,有很多办法,这里只向大家介绍一种,我用的觉得 ...
- LPTHW 笨方法学python 19章
本章节,我只是把所有的输出加上了自己的注释. #!/usr/bin/env python # -*- coding:utf-8 -*- def cheese_and_crakers(cheese_co ...
- B - Encoded Love-letter 字符串的处理
B - Encoded Love-letter Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & % ...
- PHP-query 的用法
Jquery Jquery实际上相当于一个升级版的JS,Jquery里面封装了很多的东西,Jquery的功能要比JS强大,用起来比JS方便.Jquery和JS都属于JS,只不过Jquery是封装了一个 ...
- 对于EL表达式和ONGL表达式区别的相关理解
java程序跑起来之后,会有一个内存空间分配出来,存入用到的值,这个值的周围就是上下文空间,而九大内置对象等,都在这个值的周围放着,像这样: el 就只能获取value stack 周围 的数据,va ...