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个功能.博文最后附上源码. 总结:和之前的博文一样, ...
随机推荐
- 在standalone模式下运行yarn 0.9.0对HDFS上的数据进行计算
1.通读http://spark.incubator.apache.org/docs/latest/spark-standalone.html 2.在每台机器上将spark安装到/opt/spark ...
- SoapUI中如何传递cookie
import com.eviware.soapui.support.types.StringToStringMap //Get all the cookies in the response def ...
- JS 功能弹框封装
// 功能提示弹框 function messageBox ( option ) { var html = ''; html += '<div class="message-box-h ...
- (spring-第17回【AOP基础篇】) 创建增强类
一. 增强类包含的信息: a) 横切逻辑(插入的具体代码) b) 部分连接点信息(在方法的哪个位置插入代码,比如方法前.方法后等). 二. 增强的类型 每一种增强有一个需要实现的增强类 ...
- EC6 map 和 set
1.map 首先map是一个具有键值对的结构 给定一个名字,要查找对应的成绩,就先要在names中找到对应的位置,再从scores取出对应的成绩,Array越长,耗时越长. 如果用Map实现,只需要一 ...
- git 添加ssh的方法 push免登陆
在github.com上 建立了一个小项目,可是在每次push 的时候,都要输入用户名和密码,很是麻烦 原因是使用了https方式 push 在termail里边 输入 git remote -v ...
- Java程序员应更新的知识
2013: 你应该更新的Java知识之常用程序库(一) 你应该更新的Java知识之常用程序库(二) 你应该更新的Java知识之Observer 你应该更新的Java知识之集合初始化 你应该更新的Jav ...
- SQL视图与触发器
视图(虚拟的表) select查询出来的结果集可以用as起别名当作虚拟表来使用 视图只能添加使用不能添加修改 视图不能建在其他视图上,只能一其他实体表作为基础 视图表的数据会随实体表的变动而变动 视图 ...
- tensorflow1
特征: 1 灵活 2 可移植性 3 和研究/生产联系 4 自动求导 5 语言选择:python,严谨的c++接口:未来扩展更多 6 最大性能化
- Socket编程基础——面向连接TCP
WinSock是Windows环境下的网络编程接口,它最初是基于Unix环境下的BSD Socket,是一个与网络协议无关的编程接口.WinSock包含两个主要版本,即WinSock1和WinSock ...