FPGA学习-8-串并转换器-补充完整版8bit

系统:win10
软件编辑和程序下载平台:Quartus II
仿真平台:modelsim
FPGA:EP4CE6

实验仿真结果

在这里插入图片描述

设计思路:

由于是程序员,所以结构要清晰,操作要骚
在这里插入图片描述
首先创建三个个块

块1 serial_in
目的:
实现串口输入.将输入的数据保存到八位寄存器中,每次连续输入8位后,
再一次性将八位分别在并行端口的八位对应输出
模块2
并行输出
模块3
顶层模块例化

下面是代码

模块1serial_in

/*
	该程序串行输入并进行转换为并行,保存到8位寄存器 out中
	
	输入:
		时钟,复位,
		串行输入使能
		串行输入
	输出:
		并行输出
		并行输出使能
*/
`define bit0 8
module serial_in(
	input 	sys_clk,
	input 	sys_rst_n,	//系统复位,低电平有效
	
	input 	in,	//串行输入
	
	output reg [`bit0 - 1:0] out,	//并行输出
	output reg ready	//高电平有效_输出使能
);

reg [2:0] i;	//用于计数
reg en;	//高电平有效


always @ (posedge sys_clk or negedge sys_rst_n) begin
	if(!sys_rst_n)begin	//复位初始化
		out   <= `bit0'b0000_0000;
		i 	  <= 3'd0;
		ready <= 1'b0; 		
		en	  <= 1'b1;	//使能输入
	end
	
	else if(en) begin	
		out <= {out[`bit0-2 : 0], in};	//相当于左移一位
//		out <= {out, in};	//相当于左移一位

		i 	<= i + 1'b1;
		if(i == 3'd7) 	//已经传来了8位数据, 此时out寄存器已满, 使能输出ready
			ready <= 1;
		else
			ready <= 0;
	end
	else begin	//没有使能
		out <= out;
		i 	<= 3'd0;
		ready <= 0;	
	end		
end

endmodule

模块2 parallel_out

`define bit0 8

module parallel_out(
	input 	sys_clk,
	input 	sys_rst_n,	//系统复位,低电平有效
	
	input	ready,	//并行输入使能
	input [`bit0 - 1:0] data_reg,	//并行输入

	output reg[`bit0 - 1:0] data_out	
//	output reg en_out	//高电平有效_输出使能
);


always @ (posedge sys_clk or negedge sys_rst_n) begin
	if(!sys_rst_n) begin
		data_out <= `bit0'b0000_0000;
//		en_out	 <= 1'b0;
	end
		
	else if(ready) begin
		data_out <= data_reg;
//		en_out <= 1'b1;	//输出使能
	
	end
	
	else begin
		data_out <= data_out;
//		en_out <= 1'b0;
	end
end

endmodule

模块3 例化代码

`define bit0 8

module top_serial_to_parallel_8bit(
	input 	sys_clk,
	input 	sys_rst_n,	//系统复位,低电平有效

	input 	en_in,	//串行输入使能
	input 	in,	//串行输入
	output [`bit0 - 1:0] data_out	//并行输出

);

wire [`bit0 - 1:0] out_reg;
wire ready;

serial_in u_serial_in(
	.sys_clk	(sys_clk),
	.sys_rst_n	(sys_rst_n),	//系统复位,低电平有效
//	.en			(en_in),	//IO输入使能,高电平有效
	.in			(in),	//串行输入
	
	.out		(out_reg),	//并行输出
	.ready		(ready)	//高电平有效_输出使能
);


parallel_out u_parallel_out(
	.sys_clk	(sys_clk),
	.sys_rst_n	(sys_rst_n ),	//系统复位,低电平有效
	
	.ready		(ready),	//并行输入使能
	.data_reg	(out_reg),	//并行输入
	
	.data_out	(data_out)	//并行输出
//	.en_out		(en_out)
);





endmodule

/*
移位一般是要有时钟做同步的,也就是说,n个时钟采样到的串行数据需要在n个时钟周期后以并行方式输出,这是最基本的传入并出设计思想,对于串行接口大行其道的高速传输领域,这种简单的转换也是接口芯片的重要任务之一,但从FPGA的角度来看,串并转换又有着更深的意义,串并转换正是面积换速度思想的体现。

*/

仿真代码

`timescale 1 ns/ 1 ns
module top_serial_to_parallel_8bit_vlg_tst();
// constants                                           
// general purpose registers
reg eachvec;
// test vector input registers

//输入
reg in;
reg sys_clk;
reg sys_rst_n;
// wires           
//输出                                    
wire [7:0]  data_out;

// assign statements (if any)                          
top_serial_to_parallel_8bit i1 (
	.data_out(data_out),
	.in(in),
	.sys_clk(sys_clk),
	.sys_rst_n(sys_rst_n)
);

reg [31:0] i;
initial begin      
	sys_clk = 1'b0;                                          
	sys_rst_n = 1'b0;
	i = 1'b0;
    #10 sys_rst_n = 1'b1;	//延时100ns 复位信号拉高
	
	#5000 $stop;
end                                                    

always #10 sys_clk = ~sys_clk;	//延时10ns反转	50MHz  
 

always @ (posedge sys_clk or negedge sys_rst_n)begin
	if(i%10==0 || i%3==0 )begin
		in <= 1;
		i <= i+1'b1;
	end
	else if(i>99)
		i <= 32'b0;
	else begin
		i <= i+1'b1;
		in <= 0;	
	end
		
end

 
endmodule

仿真结果图

见第一个图

注意:
问题
该程序有一个问题是串行并行转换总会延迟1个时钟周期, 程序还是有点问题,待我干掉这个bug

  • 3
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

落子无悔!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值