fpga图像处理学习日记(4)

此次任务的主要目标是完成之前三次的仿真任务以及uart协议串口接收的代码编写,仿真还是花了不少时间的,因为仿真用的板子是ego1,利用vivado来下板子,之前一直是通过ise在basys3上完成板级实验,要说的是,ego1提供的是100mhz的频率时钟,所以需要一个时钟分频来校对

100hz转25hz:

module c100_25(
input clk_100mhz,
input rst_n,

output reg clk_25m
);


reg cnt;

always@(posedge clk_100mhz or negedge rst_n)
begin
if(!rst_n)
clk_25m <= 1'b0;
else if(cnt == 1'b1)
clk_25m <= ~clk_25m;
else
clk_25m <= clk_25m;
end

always@(posedge clk_100mhz or negedge rst_n)
begin
if(!rst_n)
cnt <= 1'b0;
else
cnt <= cnt + 1'b1;
end

endmodule

 

100hz转50hz:

module c100_50(
input clk_100mhz,
input rst_n,

output reg clk
);

always@(posedge clk_100mhz or negedge rst_n)
begin
if(!rst_n)
clk <= 1'b0;
else
clk <= ~clk;
end

endmodule

 

uart协议串口接收:

module js(
input clk_100mhz,

input rst_n,

input [2:0]baud_set,

input rx,


output reg [7:0]data_byte,

output reg rx_done

);

wire clk;

c100_50 a(
.clk_100mhz(clk_100mhz),
.rst_n(rst_n),
.clk(clk)
);

reg s0_rx,s1_rx;// 同步寄存器

reg tmp0_rx,tmp1_rx; // 数据寄存器

reg [2:0] r_data_byte [7:0];

reg [15:0]bps_dr;

reg [15:0]div_cnt;

reg state;

reg bps_clk;

reg [7:0]bps_cnt;

wire nedege;



reg [2:0] stop_bit,start_bit;

always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
begin
s0_rx <= 1'b0;
s1_rx <= 1'b0;
end
else
begin
s0_rx <= rx;
s1_rx <= s0_rx;
end
end


always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
begin
tmp0_rx <= 1'b0;
tmp1_rx <= 1'b0;
end
else
begin
tmp0_rx <= s1_rx;
tmp1_rx <= tmp0_rx;
end
end

assign nedege = tmp0_rx & tmp1_rx;

//波特率选择
always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
bps_dr <= 16'd324;
else
case(baud_set)
0: bps_dr <= 16'd324;
1: bps_dr <= 16'd162;
2: bps_dr <= 16'd80;
3: bps_dr <= 16'd53;
4: bps_dr <= 16'd26;
default: bps_dr <= 16'd324;
endcase
end

always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
div_cnt <= 16'd0;
else if(state) begin
if (div_cnt == bps_dr)
div_cnt <= 16'd0;
else
div_cnt <= div_cnt + 1'd1;
end
else
div_cnt <= 16'd0;
end

always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
bps_clk <= 1'b0;
else if(div_cnt == 16'd1)
bps_clk <= 1'b1;
else
bps_clk <= 1'b0;
end

always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
bps_cnt <= 8'd0;
else if(rx_done | (bps_cnt == 8'd12 && (start_bit > 2)))
bps_cnt <= 8'd0;
else if(bps_clk)
bps_cnt <= bps_cnt + 1'd1;
else
bps_cnt <= bps_cnt;
end


always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
rx_done <= 1'b0;
else if(bps_cnt == 8'd159)
rx_done <= 1'b1;
else
rx_done <= 1'b0;
end



always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
data_byte <= 8'd0;
else if(bps_cnt == 8'd159)
begin
data_byte[0] <= r_data_byte[0][2];
data_byte[1] <= r_data_byte[1][2];
data_byte[2] <= r_data_byte[2][2];
data_byte[3] <= r_data_byte[3][2];
data_byte[4] <= r_data_byte[4][2];
data_byte[5] <= r_data_byte[5][2];
data_byte[6] <= r_data_byte[6][2];
data_byte[7] <= r_data_byte[7][2];
end
else
begin
data_byte[0] <= data_byte[0];
data_byte[1] <= data_byte[1];
data_byte[2] <= data_byte[2];
data_byte[3] <= data_byte[3];
data_byte[4] <= data_byte[4];
data_byte[5] <= data_byte[5];
data_byte[6] <= data_byte[6];
data_byte[7] <= data_byte[7];
end

end

always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
begin
start_bit <= 3'd0;
r_data_byte[0] <= 8'd0;
r_data_byte[1] <= 8'd0;
r_data_byte[2] <= 8'd0;
r_data_byte[3] <= 8'd0;
r_data_byte[4] <= 8'd0;
r_data_byte[5] <= 8'd0;
r_data_byte[6] <= 8'd0;
r_data_byte[7] <= 8'd0;
stop_bit <= 3'd0;
end
else if(bps_clk)
case(bps_cnt)
0:
begin
start_bit <= 3'd0;
r_data_byte[0] <= 8'd0;
r_data_byte[1] <= 8'd0;
r_data_byte[2] <= 8'd0;
r_data_byte[3] <= 8'd0;
r_data_byte[4] <= 8'd0;
r_data_byte[5] <= 8'd0;
r_data_byte[6] <= 8'd0;
r_data_byte[7] <= 8'd0;
stop_bit <= 3'd0;
end

5,6,7,8,9,10 : start_bit <= s1_rx + start_bit;
21,22,23,24,25,26 : r_data_byte[0] <= r_data_byte[0] + s1_rx;
37,38,39,40,41,42 : r_data_byte[1] <= r_data_byte[1] + s1_rx;
53,54,55,56,57,58 : r_data_byte[2] <= r_data_byte[2] + s1_rx;
69,70,71,72,73,74 : r_data_byte[3] <= r_data_byte[3] + s1_rx;
85,86,87,88,89,90 : r_data_byte[4] <= r_data_byte[4] + s1_rx;
101,102,103,104,105,106 : r_data_byte[5] <= r_data_byte[5] + s1_rx;
117,118,119,120,121,122 : r_data_byte[6] <= r_data_byte[6] + s1_rx;
133,134,135,136,137,138 : r_data_byte[7] <= r_data_byte[7] + s1_rx;
149,150,151,152,153,154 : stop_bit <= s1_rx + stop_bit;
default :;
endcase
else
begin
r_data_byte[0] <= r_data_byte[0];
r_data_byte[1] <= r_data_byte[1];
r_data_byte[2] <= r_data_byte[2];
r_data_byte[3] <= r_data_byte[3];
r_data_byte[4] <= r_data_byte[4];
r_data_byte[5] <= r_data_byte[5];
r_data_byte[6] <= r_data_byte[6];
r_data_byte[7] <= r_data_byte[7];
end
end




always@(posedge clk or negedge rst_n)
begin
if(!rst_n)
state <= 1'b0;
else if(nedege)
state <= 1'b1;
else if(rx_done || (bps_cnt == 8'd12 && (start_bit > 2)))
state <= 1'b0;
else
state <= state;
end

endmodule

 

 

附:前三次学习下板子的表现

 

转载于:https://www.cnblogs.com/fpgamzy/p/10355473.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值