请大家帮忙看看这种代码是不是正确的
module uart(clk ,
rst_n ,
key,
txd,
tx_done
);
//参数定义
parameter DATA_W = 8;
//输入信号定义
input clk ;
input rst_n ;
input key ;
//input [2:0] baud_set;
//输出信号定义
output txd ;
output tx_done ;
//输出信号reg定义
reg txd ;
reg tx_done ;
//中间信号定义
wire [13:0] bps_cnt ;
reg [13:0] cnt0 ;
reg [2:0 ] cnt1 ;
wire [9:0] tx_data ;
reg flag ;
wire [7:0] dout ;
assign dout = 8'h12;
assign bps_cnt=5208;
/*
//组合逻辑写法
always@(*)begin
case(baud_set)
1: bps_cnt <= 5208; // baud=9600
2: bps_cnt <= 2604; // 19200
3: bps_cnt <= 1302; // 38400
4: bps_cnt <= 868 ; // 57600
5: bps_cnt <= 434 ; // 115200
endcase
end
*/
// flag
always @(posedge clk or negedge rst_n)begin
if(rst_n==1'b0)begin
flag<=0;
end
else if (key==0)begin
flag <= 1;
end
else if (end_cnt1) begin
flag <= 0;
end
end
//时序逻辑写法 cnt0 分频时钟
always @(posedge clk or negedge rst_n)begin
if(!rst_n)begin
cnt0 <= 0;
end
else if(add_cnt0)begin
if(end_cnt0)
cnt0 <= 0;
else
cnt0 <= cnt0 + 1;
end
end
assign add_cnt0 = flag==1;
assign end_cnt0 = add_cnt0 && cnt0==bps_cnt-1 ;
// 时序 cnt1 数10次
always @(posedge clk or negedge rst_n)begin
if(!rst_n)begin
cnt1 <= 0;
end
else if(add_cnt1)begin
if(end_cnt1)
cnt1 <= 0;
else
cnt1 <= cnt1 + 1;
end
end
assign add_cnt1 = end_cnt0 ;
assign end_cnt1 = add_cnt1 && cnt1==9 ;
assign tx_data={1'b1,dout,1'b0};
// 时序 dout
always @(posedge clk or negedge rst_n)begin
if(rst_n==1'b0)begin
txd <= 1'b1;
end
else if (end_cnt0)begin
txd <= tx_data[cnt1];
end
end
// 时序 tx_done
always @(posedge clk or negedge rst_n)begin
if(rst_n==1'b0)begin
tx_done <= 0;
end
else if(end_cnt1) begin
tx_done <= 1;
end
else begin
tx_done <= 0;
end
end
endmodule
补充内容 (2017-8-15 21:49):
目前仿真可以通过 但是还是串口调试助手还是没数据 求解答啊 弄不出来今晚都睡不着了
always @(posedge clk or negedge rst_n)begin
if(rst_n==1'b0)begin
txd <= 1'b1;
end
//else if (end_cnt0)begin
else if (cnt0 == 1)begin
txd <= tx_data[cnt1];
end
end
看错 我以为你的bps_cnt为波特率的计数子,
另外 你的cnt1是bit计数吧 ? 需要计数到9. 但是你的cnt1只有3bit的位宽 。
需要改为reg [3:0] cnt1;
仿真出错是 end_cnt1 add_cnt1 add_cnt0 end_cnt0这几个信号没预先定义
嗯嗯 但是定义了之后下载板子还是没有 我现在再看看仿真波形找找错误
always @(posedge clk or negedge rst_n)begin
if(rst_n==1'b0)begin
txd <= 1'b1;
end
else if (end_cnt0)begin
txd <= tx_data[cnt1];
end
end
这里的end_cnt0 在bps_cnt==5207才有效。 应该要在bps_cnt==1时候就把tx_data[0]取进来。
这两个的波特率不是都是 一样的吗 ,都是间隔 5208个cnt0 送一个数, 我改过之后还是不行 。
可以用嵌入式逻辑分析仪看下时序对不对
signaltap 吗 ? 我试试 之前没用过
问题解决了吗?选个最佳答案吧
昨天学校停电了 ,今天才看到
这个我试了 还是不行