这些小活动你都参加了吗?快来围观一下吧!>>
电子产品世界 » 论坛首页 » DIY与开源设计 » 电子DIY » wanderer8885的进程贴

共15条 2/2 1 2 跳转至
菜鸟
2013-08-02 23:04:56     打赏
11楼

这个是发送,每秒发送一个0x31,这次有点懒了,连发的数据都没改下,按教程来的,不过内容并不是完全按教程,先把例程看一下,明白了思路后就自己敲,想不起来了或综合通不过了再对比例程,找原因,我觉得这样学习比较快一点。

/*********************************************/


/*********************************************/
module tx_232_top(clk,rst_n,tx_pin_out);


input clk;
input rst_n;

output tx_pin_out;


wire Tx_done_sig;
wire Tx_en_sig;
wire[7:0] Tx_data;


tx U1(
.clk(clk),.rst_n(rst_n),
.tx_en_sig(Tx_en_sig),
.tx_data(Tx_data),
.tx_done_sig(Tx_done_sig),
.tx_pin_out(tx_pin_out)
);

control U2(
.clk(clk),.rst_n(rst_n),
.tx_done_sig(Tx_done_sig),
.tx_en_sig(Tx_en_sig),
.tx_data(Tx_data)
);


endmodule


/*********************************************/


/*********************************************/


module control (clk,rst_n,tx_done_sig,tx_en_sig,tx_data);


input clk;
input rst_n;
input tx_done_sig;

output tx_en_sig;
output[7:0] tx_data;

reg[7:0] tx_data_r;
reg[25:0] count;


reg is_En;

parameter T_1S = 26'd50_000_000;
always@(posedge clk or negedge rst_n)
if(!rst_n)
count <= 26'd0;
else if(count == T_1S)
count <= 26'd0;
else
count <= count + 1'b1;


always@(posedge clk or negedge rst_n)
if(!rst_n)
begin
is_En <= 1'b0;
tx_data_r <= 8'h31;
end
else if(tx_done_sig)
begin
tx_data_r <= 8'h31;
is_En <= 1'b0;
end
else if(count == T_1S)
is_En <= 1'b1;






assign tx_en_sig = is_En;
assign tx_data = tx_data_r;


endmodule








/*********************************************/


/*********************************************/


module tx(clk,rst_n,tx_en_sig,tx_data,tx_done_sig,tx_pin_out);


input clk;
input rst_n;


input[7:0] tx_data;
input tx_en_sig;


output tx_done_sig;
output tx_pin_out;

wire bps_clk;
rs_bps U1( 
.clk(clk),
.rst_n(rst_n),
.count_sig(tx_en_sig),
.bps_clk(bps_clk)
);


tx_control U2(
.clk(clk),.rst_n(rst_n),
.tx_en_sig(tx_en_sig),
.tx_data(tx_data),
.bps_clk(bps_clk),
.tx_done_sig(tx_done_sig),
.tx_pin_out(tx_pin_out)
);


endmodule


/*********************************************/


/*********************************************/
module rs_bps( clk,rst_n,count_sig,bps_clk );


input clk;
input rst_n;
input count_sig;
output bps_clk;

/***************************/
reg[12:0] count_bps;

always@(posedge clk or negedge rst_n)
if(!rst_n)
count_bps <= 13'd0;
else if(count_bps == 13'd5207) //50M/9600 = 5208
count_bps <= 13'd0;
else if(count_sig)
count_bps <= count_bps + 1'b1;
else
count_bps <= 13'd0;


/***************************/


assign bps_clk = (count_bps == 13'd2604) ? 1'b1 : 1'b0 ;


/***************************/


endmodule




/*********************************************/


/*********************************************/
module tx_control
(
clk,rst_n,
tx_en_sig,
tx_data,
bps_clk,
tx_done_sig,
tx_pin_out
);


input clk;
input rst_n;


input tx_en_sig;
input [7:0] tx_data;
input bps_clk;


output tx_done_sig;
output tx_pin_out;


/*************************************/


reg [3:0] i;
reg tx_r;
reg isDone;


always@(posedge clk or negedge rst_n)
if(!rst_n)
begin
i <= 4'd0;
tx_r <= 1'b1;
isDone <= 1'b0;
end
else if(tx_en_sig)
case(i)
4'd0:
if(bps_clk) begin i <= i + 1'b1; tx_r <= 1'b0; end
4'd1,4'd2,4'd3,4'd4,4'd5,4'd6,4'd7,4'd8:
if(bps_clk)
begin
i <= i + 1'b1;
tx_r <= tx_data[i-1];
end
4'd9:
if(bps_clk)
begin
i <= i + 1'b1;
tx_r <= 1'b1;
end
4'd10:
if(bps_clk)
begin
i <= i + 1'b1;
tx_r <= 1'b1;
end
4'd11:
if(bps_clk)
begin
i <= i + 1'b1;
isDone <= 1'b1;
end
4'd12:
begin
i <= 1'b0;
isDone <= 1'b0;
end
endcase


/***************************/
assign tx_pin_out = tx_r;
assign tx_done_sig = isDone;
/***************************/


endmodule


菜鸟
2013-08-02 23:07:31     打赏
12楼

最后是把两种功能综合起来,实现接收到一个字节就以LED显示出来,并发送回去。跟单片机测试串口模块程序一样。

/*********************************************/


/*********************************************/
module rs_232_top(clk,rst_n,rx_pin_in,rx_data,tx_pin_out);


input clk;
input rst_n;
input rx_pin_in;
output[7:0] rx_data;
// output tx_done_sig;
output tx_pin_out;

wire[7:0] Rx_data_in;
wire Rx_done_sig;

rx U4(.clk(clk),.rst_n(rst_n),
.rx_pin_in(rx_pin_in),
.rx_en_sig(Rx_en_sig),
.rx_done_sig(Rx_done_sig),
.rx_data(Rx_data_in));


wire[7:0] RX_data_out;
wire Rx_en_sig;

control U5(.clk(clk),.rst_n(rst_n),
.rx_en_sig(Rx_en_sig),
.rx_done_sig(Rx_done_sig),
.rx_data_in(Rx_data_in),
.rx_data_out(RX_data_out),
.tx_done_sig(Tx_done_sig),
.tx_en_sig(Tx_en_sig),
.tx_data_out(TX_data_out)
);
wire[7:0] TX_data_out;
wire Tx_en_sig;
wire Tx_done_sig;
// wire[7:0] Tx_data_out;
tx U6(.clk(clk),.rst_n(rst_n),
.tx_en_sig(Tx_en_sig),.tx_data(TX_data_out),
.tx_done_sig(Tx_done_sig),.tx_pin_out(tx_pin_out));


assign rx_data = ~RX_data_out;




endmodule


/*********************************************/


/*********************************************/


module control(
clk,rst_n,
rx_en_sig,
rx_done_sig,
rx_data_in,
rx_data_out,
tx_done_sig,
tx_en_sig,
tx_data_out
);


input clk;
input rst_n;

input rx_done_sig;
input tx_done_sig;
input[7:0] rx_data_in;

output rx_en_sig;
output[7:0] rx_data_out;

output tx_en_sig;
output[7:0] tx_data_out;

reg[7:0] rx_data_r;
reg[7:0] tx_data_r;
reg isEn;
reg isEn2;

always@(posedge clk or negedge rst_n)
if(!rst_n)
rx_data_r <= 8'd0;
else if(rx_done_sig)
begin
rx_data_r <= rx_data_in;
tx_data_r <= rx_data_in;
isEn <= 1'b0;
isEn2 <= 1'b1;
end
else if(tx_done_sig)
begin
isEn2 <= 1'b0;
end
else
isEn <= 1'b1;


/***************************/
assign rx_data_out = rx_data_r;
assign tx_data_out  = tx_data_r;
assign rx_en_sig = isEn;
assign tx_en_sig = isEn2;
/***************************/


endmodule


/*********************************************/


/*********************************************/


module tx(clk,rst_n,tx_en_sig,tx_data,tx_done_sig,tx_pin_out);


input clk;
input rst_n;


input[7:0] tx_data;
input tx_en_sig;


output tx_done_sig;
output tx_pin_out;

wire bps_clk;
rs_bps U1( 
.clk(clk),
.rst_n(rst_n),
.count_sig(tx_en_sig),
.bps_clk(bps_clk)
);


tx_control U2(
.clk(clk),.rst_n(rst_n),
.tx_en_sig(tx_en_sig),
.tx_data(tx_data),
.bps_clk(bps_clk),
.tx_done_sig(tx_done_sig),
.tx_pin_out(tx_pin_out)
);


endmodule


/*********************************************/


/*********************************************/


module rx(clk,rst_n,rx_pin_in,rx_en_sig,rx_done_sig,rx_data);


input clk;
input rst_n;


input rx_pin_in;
input rx_en_sig;


output rx_done_sig;
output[7:0] rx_data;


wire h2l_sig;
detect U1( .clk(clk),.rst_n(rst_n),.rx_pin_in(rx_pin_in),.h2l_sig(h2l_sig) );

wire bps_clk;
rs_bps U2( .clk(clk),.rst_n(rst_n),.count_sig(count_sig),.bps_clk(bps_clk) );

wire count_sig;
rx_control U3(
.clk(clk),.rst_n(rst_n),.h2l_sig(h2l_sig),.rx_pin_in(rx_pin_in),
.bps_clk(bps_clk),.rx_en_sig(rx_en_sig),.count_sig(count_sig),
.rx_data(rx_data),.rx_done_sig(rx_done_sig));


endmodule


/*********************************************/


/*********************************************/
module detect( clk,rst_n,rx_pin_in,h2l_sig );


input clk;
input rst_n;
input rx_pin_in;
output h2l_sig;


/***************************/
reg h2l_f1;
reg h2l_f2;


always@(posedge clk or negedge rst_n)
if(!rst_n)
begin
h2l_f1 <= 1'b1;
h2l_f2 <= 1'b1;
end
else
begin
h2l_f1 <= rx_pin_in;
h2l_f2 <= h2l_f1;
end


/***************************/


assign h2l_sig = h2l_f2 & !h2l_f1;


/***************************/


endmodule




/*********************************************/


/*********************************************/
module rs_bps( clk,rst_n,count_sig,bps_clk );


input clk;
input rst_n;
input count_sig;
output bps_clk;

/***************************/
reg[12:0] count_bps;

always@(posedge clk or negedge rst_n)
if(!rst_n)
count_bps <= 13'd0;
else if(count_bps == 13'd5207) //50M/9600 = 5208
count_bps <= 13'd0;
else if(count_sig)
count_bps <= count_bps + 1'b1;
else
count_bps <= 13'd0;


/***************************/


assign bps_clk = (count_bps == 13'd2604) ? 1'b1 : 1'b0 ;


/***************************/


endmodule


/*********************************************/


/*********************************************/
module rx_control(
clk,rst_n,h2l_sig,rx_pin_in,
bps_clk,rx_en_sig,count_sig,
rx_data,rx_done_sig);


input clk;
input rst_n;
input h2l_sig;
input rx_pin_in;
input bps_clk;
input rx_en_sig;


output count_sig;
output rx_done_sig;
output[7:0] rx_data;


/***************************/
reg [3:0] i;
reg [7:0] data_r;
reg isCount;
reg isDone;

always@(posedge clk or negedge rst_n)
if(!rst_n)
begin
i <= 4'd0;
data_r <= 8'd0;
isCount <= 1'b0;
isDone <= 1'b0;
end
else if(rx_en_sig)
case(i)
4'd0:
if(h2l_sig)
begin
i <= i + 1'b1;
isCount <= 1'b1;
end


4'd1:
if(bps_clk) begin i <= i + 1'b1; end


4'd2,4'd3,4'd4,4'd5,4'd6,4'd7,4'd8,4'd9:
if(bps_clk)
begin
i <= i + 1'b1;
data_r[i-2] <= rx_pin_in;
end
4'd10:
if(bps_clk)
begin
i <= i + 1'b1;
end
4'd11:
if(bps_clk)
begin
i <= i + 1'b1;
end
4'd12:
begin
i <= i + 1'b1;
isDone <= 1'b1;
isCount <= 1'b0;
end


4'd13:
begin
i <= 1'b0;
isDone <= 1'b0;
end


endcase


/***************************/


assign count_sig = isCount;
assign rx_data = data_r;
assign rx_done_sig = isDone;
/***************************/


endmodule


/*********************************************/


/*********************************************/
module tx_control
(
clk,rst_n,
tx_en_sig,
tx_data,
bps_clk,
tx_done_sig,
tx_pin_out
);


input clk;
input rst_n;


input tx_en_sig;
input [7:0] tx_data;
input bps_clk;


output tx_done_sig;
output tx_pin_out;


/*************************************/


reg [3:0] i;
reg tx_r;
reg isDone;


always@(posedge clk or negedge rst_n)
if(!rst_n)
begin
i <= 4'd0;
tx_r <= 1'b1;
isDone <= 1'b0;
end
else if(tx_en_sig)
case(i)
4'd0:
if(bps_clk) begin i <= i + 1'b1; tx_r <= 1'b0; end
4'd1,4'd2,4'd3,4'd4,4'd5,4'd6,4'd7,4'd8:
if(bps_clk)
begin
i <= i + 1'b1;
tx_r <= tx_data[i-1];
end
4'd9:
if(bps_clk)
begin
i <= i + 1'b1;
tx_r <= 1'b1;
end
4'd10:
if(bps_clk)
begin
i <= i + 1'b1;
tx_r <= 1'b1;
end
4'd11:
if(bps_clk)
begin
i <= i + 1'b1;
isDone <= 1'b1;
end
4'd12:
begin
i <= 1'b0;
isDone <= 1'b0;
end
endcase


/***************************/
assign tx_pin_out = tx_r;
assign tx_done_sig = isDone;
/***************************/


endmodule


菜鸟
2013-08-02 23:09:38     打赏
13楼
到现在已经把做的实验例程都发完了,这几个例程花了我将近一个星期时间,不过现在总算能用CPLD做些简单的事了,深奥的东西还是稀里糊涂,以后的路还很长,慢慢学吧。

院士
2013-08-05 11:04:03     打赏
14楼
全公开啊?

菜鸟
2013-08-06 14:01:19     打赏
15楼
这也是我根据网上的一些例子改的,调试通过,谁要是刚好也弄这块可以参考下嘛

共15条 2/2 1 2 跳转至

回复

匿名不能发帖!请先 [ 登陆 注册 ]