这个程序是用串口发送一个指定的8位数据给pc,用quartus编译没问题,但是下到板子里并不能实现用modelsim
仿真时,说是 end_cnt1 add_cnt1 add_cnt0 end_cnt0 出了问题, 是不是这种赋值方式不对?
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):
目前仿真可以通过 但是还是串口调试助手还是没数据 求解答啊 弄不出来今晚都睡不着了
一周热门 更多>