verilog中串口通信中遇到的问题
最近想利用串口通信完成加法的一个设计。再之前串口的接收和发送均仿真成功。问题是1、实现加法就要两个输入,如何用RXD让这两个8位的输入数存到不同的寄存器里?调用两次接收模...
最近想利用串口通信完成加法的一个设计。
再之前串口的接收和发送均仿真成功。问题是
1、实现加法就要两个输入,如何用RXD让这两个8位的输入数存到不同的寄存器里?调用两次接收模块会不会因为同时执行导致错误?
2、接收端中的RXD为什么要经过if(!RXD)的判断才能输入?岂不是RXD最开始只能是0吗?那我想输入11111111的话RXD要怎样设置输入?
3、最后相加的结果会有一个进位时该怎样使用发送模块,既能发送8位结果,又能带进位能?
不知道我描述清楚了没?提前谢谢你的回答
接收模块:
module rec(
rst,clk,rxd, rdata, clkbaud, RI);
input rst,clk,rxd;
output [7:0] rdata;
output clkbaud;
output RI;
reg [8:0]cnt;
reg clkbaud;
reg [7:0]rdata;
reg RI;
parameter count =325;
always @( posedge clk)
if(rst) cnt<=0;
else
begin
if(cnt==count) cnt<=0;
else cnt<=cnt+1'b1;
end
always @( posedge clk)
if(rst) clkbaud<=0;
else if((cnt==(count-1)/2)|(cnt==count-1))
clkbaud<=~clkbaud;
reg [3:0]cnt8; //串行数据位计数器
reg start; //起收发状态标志
reg [9:0]data;
always @ (posedge clkbaud or posedge rst)
if(rst) begin
data<=10'd0;
cnt8<=4'b0;
start<=1'b0;
RI <= 1'b1;
end
else
begin
if((!rxd)) begin //&&(cnt8==4'b0)
if(cnt8==4'b0) begin
start<=1'b1; RI <= 1'b0; end
end
//else RI <= 1'b1;
if(start) begin
data[cnt8]<=rxd;
if(cnt8<4'd9) begin
cnt8<=cnt8+1'b1; end
else if(cnt8==4'd9) begin
rdata<=data[8:1];
cnt8<=4'b0;
start<=1'b0;
RI <= 1'b1;
end
end
else begin
cnt8<=4'h0;
end
end
endmodule 展开
再之前串口的接收和发送均仿真成功。问题是
1、实现加法就要两个输入,如何用RXD让这两个8位的输入数存到不同的寄存器里?调用两次接收模块会不会因为同时执行导致错误?
2、接收端中的RXD为什么要经过if(!RXD)的判断才能输入?岂不是RXD最开始只能是0吗?那我想输入11111111的话RXD要怎样设置输入?
3、最后相加的结果会有一个进位时该怎样使用发送模块,既能发送8位结果,又能带进位能?
不知道我描述清楚了没?提前谢谢你的回答
接收模块:
module rec(
rst,clk,rxd, rdata, clkbaud, RI);
input rst,clk,rxd;
output [7:0] rdata;
output clkbaud;
output RI;
reg [8:0]cnt;
reg clkbaud;
reg [7:0]rdata;
reg RI;
parameter count =325;
always @( posedge clk)
if(rst) cnt<=0;
else
begin
if(cnt==count) cnt<=0;
else cnt<=cnt+1'b1;
end
always @( posedge clk)
if(rst) clkbaud<=0;
else if((cnt==(count-1)/2)|(cnt==count-1))
clkbaud<=~clkbaud;
reg [3:0]cnt8; //串行数据位计数器
reg start; //起收发状态标志
reg [9:0]data;
always @ (posedge clkbaud or posedge rst)
if(rst) begin
data<=10'd0;
cnt8<=4'b0;
start<=1'b0;
RI <= 1'b1;
end
else
begin
if((!rxd)) begin //&&(cnt8==4'b0)
if(cnt8==4'b0) begin
start<=1'b1; RI <= 1'b0; end
end
//else RI <= 1'b1;
if(start) begin
data[cnt8]<=rxd;
if(cnt8<4'd9) begin
cnt8<=cnt8+1'b1; end
else if(cnt8==4'd9) begin
rdata<=data[8:1];
cnt8<=4'b0;
start<=1'b0;
RI <= 1'b1;
end
end
else begin
cnt8<=4'h0;
end
end
endmodule 展开
展开全部
1. 对于串口而言,或者说对于任何协议都是这样,你所要传输的对于它而言都是数据,只有先后之分,你要将它们区分只能自己加些额外的标志,或者用自己定义一个标志来区分。比如你可以一次传两个数,你认为第一个是加数另一个是被加数。或者中间加个间隔标志,诸如种种。还有模块同时执行部知道你指的具体是什么,都是RXD上传输的怎么会有同时调用两次的问题出现;
2. 既然串口都模拟出来了,应该知道串口数据的“起始位”这概念吧,其实也就是个传输开始标志,接收模块只有收到了这个起始标志才知道有数据来了,才开始接收,这个起始标志也就是RXD上的低电平;那么对应代码页就是判断if(!RXD);
3. 溢出这问题有点麻烦,是否可以做个判断,如果有溢出就发送两个字节,就是把溢出位单独再发一次,更好的方法暂时还没想到。
2. 既然串口都模拟出来了,应该知道串口数据的“起始位”这概念吧,其实也就是个传输开始标志,接收模块只有收到了这个起始标志才知道有数据来了,才开始接收,这个起始标志也就是RXD上的低电平;那么对应代码页就是判断if(!RXD);
3. 溢出这问题有点麻烦,是否可以做个判断,如果有溢出就发送两个字节,就是把溢出位单独再发一次,更好的方法暂时还没想到。
追问
恩,谢谢你
还有个问题:
想知道在RXD的起始位的低电平如何在DE2板子上实现?我见有人用个叫串口调试的工具来测试,那是不是在输入的时候要提前手动输入低电平吗?
追答
低电平起始位是协议规范,无论哪个发送端要发送数据都要发这个起始位的,那个调试工具应该是超级终端,网上很多可以下的,就是个发送工具,从那工具里发送数据到串口,通过串口发出去
来自:求助得到的回答
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询