fpga中24位的数据怎样通过8位串口传输到上位机,该如何解决
fpga中24位的数据怎样通过8位串口传输到上位机
在接收到上位机指令后,fpga将采集到的24位数据通过8位的串口传输给上位机。由于串口是8位,就得分开传。我想用状态机,case语句来实现,可是在调试的时候只有第一个状态,好像没有进行循环,各位帮忙给看一下。
module TEST_CONTROL (clk,rst,datain,dataout);
parameter DATASIZE = 8;
input clk;
input rst;
input [DATASIZE-1:0]datain; //串口输入端口,接收上位机指令
output [DATASIZE-1:0]dataout;//串口输出端口,传输数据至上位机
reg [DATASIZE-1:0]dataout;
reg [23:0]data_all; //用于测试的数据
integer num = 0;
always @(posedge clk )
data_all[15:0] <= 16'b0000_0110_0000_0100_0000_0110 ; //测试数据
if (datain[DATASIZE-1:0] == 8'h0a)
for (num=0;num<4;num=num+1) //进行循环传输
begin
begin
num = num + 1;
case (num)
4'd1: dataout[DATASIZE-1:0] <= data_all[7:0];
4'd2: dataout[DATASIZE-1:0] <= data_all[15:8];
4'd3: dataout[DATASIZE-1:0] <= data_all[23:16];
endcase
end
if (num == 4'd4) //置零,当传完后置零
num = 4'd0;
end
endmodule
------解决方案--------------------
重新学习下verilog语法吧。不要用for循环,一个always块一个begin-end
------解决方案--------------------
always @(posedge clk )
begin
data_all[15:0] <=。。。。。。。。。。。。。
end
使用for语句比较浪费硬件资源,多看些书就好了,积累!加油!
------解决方案--------------------
module ****_zhenfen__test_control
#( parameter data_size = 8 )
( input wire clk,
input wire rst,
input wire [data_size-1:0] din,
output wire den,
output reg [data_size-1:0] dout );
/// 3个数据
wire [data_size*3-1:0] data_all = 'b0000_0110_0000_0100_0000_0110 ;
/// din 由非0x0a变为0x0a触发一次测试
reg [data_size-1:0] data_bak;
always @(posedge clk, posedge rst) begin
data_bak <= rst ? 0 : din;
end
wire startup = (!rst) && (din == 'h0a) && (data_bak != 'h0a);
/// 每次测试,输出一轮,自动停止
reg [1:0] num;
always @(posedge clk, posedge rst) begin
if( rst ) begin
num <= 0;
end
else if( startup | num[1] | num[0] ) begin
num <= num + 1;
end
end
assign den = |num;
always @* begin
case( num )
0: dout = 0;
1: dout = data_all[data_size*1-1 -: data_size];
2: dout = data_all[data_size*2-1 -: data_size];
3: dout = data_all[data_size*3-1 -: data_size];
endcase
end
endmodule
在接收到上位机指令后,fpga将采集到的24位数据通过8位的串口传输给上位机。由于串口是8位,就得分开传。我想用状态机,case语句来实现,可是在调试的时候只有第一个状态,好像没有进行循环,各位帮忙给看一下。
module TEST_CONTROL (clk,rst,datain,dataout);
parameter DATASIZE = 8;
input clk;
input rst;
input [DATASIZE-1:0]datain; //串口输入端口,接收上位机指令
output [DATASIZE-1:0]dataout;//串口输出端口,传输数据至上位机
reg [DATASIZE-1:0]dataout;
reg [23:0]data_all; //用于测试的数据
integer num = 0;
always @(posedge clk )
data_all[15:0] <= 16'b0000_0110_0000_0100_0000_0110 ; //测试数据
if (datain[DATASIZE-1:0] == 8'h0a)
for (num=0;num<4;num=num+1) //进行循环传输
begin
begin
num = num + 1;
case (num)
4'd1: dataout[DATASIZE-1:0] <= data_all[7:0];
4'd2: dataout[DATASIZE-1:0] <= data_all[15:8];
4'd3: dataout[DATASIZE-1:0] <= data_all[23:16];
endcase
end
if (num == 4'd4) //置零,当传完后置零
num = 4'd0;
end
endmodule
------解决方案--------------------
重新学习下verilog语法吧。不要用for循环,一个always块一个begin-end
------解决方案--------------------
always @(posedge clk )
begin
data_all[15:0] <=。。。。。。。。。。。。。
end
使用for语句比较浪费硬件资源,多看些书就好了,积累!加油!
------解决方案--------------------
module ****_zhenfen__test_control
#( parameter data_size = 8 )
( input wire clk,
input wire rst,
input wire [data_size-1:0] din,
output wire den,
output reg [data_size-1:0] dout );
/// 3个数据
wire [data_size*3-1:0] data_all = 'b0000_0110_0000_0100_0000_0110 ;
/// din 由非0x0a变为0x0a触发一次测试
reg [data_size-1:0] data_bak;
always @(posedge clk, posedge rst) begin
data_bak <= rst ? 0 : din;
end
wire startup = (!rst) && (din == 'h0a) && (data_bak != 'h0a);
/// 每次测试,输出一轮,自动停止
reg [1:0] num;
always @(posedge clk, posedge rst) begin
if( rst ) begin
num <= 0;
end
else if( startup | num[1] | num[0] ) begin
num <= num + 1;
end
end
assign den = |num;
always @* begin
case( num )
0: dout = 0;
1: dout = data_all[data_size*1-1 -: data_size];
2: dout = data_all[data_size*2-1 -: data_size];
3: dout = data_all[data_size*3-1 -: data_size];
endcase
end
endmodule