FPGA学习笔记(6)——串、并转换

这篇具有很好参考价值的文章主要介绍了FPGA学习笔记(6)——串、并转换。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

74HC595芯片

FPGA学习笔记(6)——串、并转换

图1 功能框图

FPGA学习笔记(6)——串、并转换

图2 芯片引脚图

FPGA学习笔记(6)——串、并转换

图3 引脚功能图

引脚定义:

SHCP

Input

移位寄存器时钟

STCP

Input

存储寄存器使能

MR_n

Input

复位信号,低电平有效

DS

Input

输入串行信号

Q[7:0]

Output

输出并行信号

Q7S

Output

输出串行信号

FPGA学习笔记(6)——串、并转换

图4 时序图

时序图说明:

1. 蓝色虚线表示SHCP的时钟上升沿,橙色信号表示当前DS信号在移位寄存器中的时序,Qn表示DS信号在STCP上升沿进入到锁存器的时序。

2. 当前DS信号经过移位8次,在第7时钟周期上升沿后到达Q7S,之后在STCP上升沿可将串行输入的8位信号锁存到锁存器中,再同步输出到Q0-Q7。

3. 图中Q0-Q7的信号变化是同一位DS信号,在不同时钟周期下时在锁存器中的位置;正常使用时要等串行输入信号全部输入后再对STCP拉高,可将串行数据同步转换为并行数据。

4. Q7S是将串行输入的信号移位8次后再串行输出,逻辑上Q7S的值等于移位寄存器最高位的值(在功能框图中可以看出)。

5. DS信号在SHCP下降沿变化,在SHCP上升沿稳定用来移位,移位寄存器中的数据在STCP下降沿变化(即在SHCP上升沿进行移位操作),在STCP上升沿稳定用来转入锁存器中。

根据功能框图coding

module serial_to_parallel
(
	input		shcp	,
	input		stcp	,
	input		mr_n	,
	input		ds	,
	output	reg[7:0]Q	,
	output	reg	Q7s	
);
	reg	[7:0]	m_data	; //8位移位寄存器

always@(posedge shcp or negedge mr_n)
begin
	if(!mr_n)
		m_data <= 8'd0;
	else 
	begin
		m_data[0] <= ds;
		Q7s <= m_data[7];    // 串行输出,根据图1得出,Q7s连接在第八位移位寄存器之后,相较于原串行信号延后8个shcp周期; 该语句也是并行信号转串行信号的关键
		//m_data <= (m_data << 1);
		m_data[7:1]<= m_data[6:0] ;
	end
end
always@(posedge stcp)
begin
	Q <= m_data;    //省略锁存器,直接赋值给Q
end
endmodule

Tb:

`timescale	1ns/1ns
`define	clk_period 20
module tb();
reg	shcp;
reg	stcp;
reg	mr_n;
reg	ds  ;
wire	[7:0]	Q;
wire	Q7s;
initial
begin
	shcp <= 1'd0;
	stcp <= 1'd0;
	mr_n <= 1'd0;
	ds <= 1'd0;
	#(`clk_period)
	mr_n <= 1'd1;
	ds <= 1'b1;	//8'b1110_0001
	#(`clk_period)
	ds <= 1'b1;
	#(`clk_period)
	ds <= 1'b1;
	#(`clk_period)
	ds <= 1'b0;	
	#(`clk_period)
	ds <= 1'b0;
	#(`clk_period)
	ds <= 1'b0;
	#(`clk_period)
	ds <= 1'b0;	
	#(`clk_period)
	ds <= 1'b1;
	#(`clk_period)
	stcp <= 1'b1;
	#(`clk_period*10)
	$stop;
end
always@(*) #(`clk_period/2) shcp <= ~shcp;
serial_to_parallel
u1
(
	.shcp(shcp),
	.stcp(stcp),
	.mr_n(mr_n),
	.ds  (ds  ),
	.Q   (Q   ),
	.Q7s (Q7s ) 
);
endmodule

仿真结果如下

FPGA学习笔记(6)——串、并转换

图5 modelsim仿真波形图

 


注意:

移位操作
m_data[0] <= ds;
m_data <= m_data << 1;

上述移位语句在仿真中的现象是:只进行移位,不会对0位更新;原因是:Verilog标准定义了在同一个always块中,可对某同一变量进行多次非阻塞赋值,但在多次赋值中,只有最后一次赋值对该变量起作用。

阻塞赋值与非阻塞赋值的区别/理解:

阻塞赋值时,不允许任何别的Verilog语句的干扰,直到现行的赋值完成时刻,即把RHS赋值给LHS的时刻,才允许别的赋值语句的执行。可以理解为阻塞赋值的执行只有一个步骤的操作,即计算RHS并更新LHS。

非阻塞赋值的操作过程可以看成两个步骤,①在赋值开始时刻,计算非阻塞赋值RHS表达式,②在赋值结束时刻,更新非阻塞赋值LHS表达式。在两个步骤期间,其他的Verilog语句包括其他的非阻塞赋值语句都能同时计算RHS和更新LHS。

移位寄存器的正确写法:

第一种:m_data[7:1] <= m_data[6:0];左移,右移同理

第二种:dout <= {din[6:0],din[7]};循环左移,不循环时{ din[6:0],0}


74HC595驱动模块(并转串)

根据图4设计驱动模块

引脚定义:

CLK

Input

系统时钟,50MHz

RST_N

Input

复位信号,低电平有效

DATA[15:0]

Input

数码管的段选和位选信号,由模块内部产生;

SHCP

Output

移位寄存器时钟

STCP

Output

存储寄存器标志位

DS

Output

74hc595芯片的输入串行信号

module hc595_driver(
	input		clk	,
	input		rst_n	,
	input	[15:0]	data	,
	output	reg	shcp	,
	output	reg	stcp	,
	output	reg	ds	
);
	reg	[1:0]	cnt	;
	reg		shcp_dge;
	reg	[4:0]	cnt_dge ;
/*---------divider 6.25M-----------*/
always@(posedge clk or negedge rst_n)
begin
	if(!rst_n)
	begin
		cnt <= 1'd0;
		shcp_dge <= 1'd0;
	end
	else if(cnt == 2'd3)
	begin
		cnt <= 1'd0;
		shcp_dge <= 1'd1;
	end
	else
	begin
		cnt <= cnt + 1'd1;
		shcp_dge <= 0;
	end
end
always@(posedge clk or negedge rst_n)    //shcp变化沿计数,上升沿时ds值稳定用来移位,下降沿时ds值变化
begin
	if(!rst_n)
		cnt_dge <= 5'd0;
	else if(shcp_dge)
	begin
		if(cnt_dge == 5'd31)
		cnt_dge <= 5'd0;
		else
		cnt_dge <= cnt_dge + 1'd1;
	end
end
always@(posedge clk or negedge rst_n)
begin
	if(!rst_n)
	begin
		shcp <= 1'd0;
		stcp <= 1'd0;
		ds <= 1'd0;
	end
	else if(shcp_dge)
		case(cnt_dge)    //根据图4时序写出,
			0: begin shcp <= 1'd0; stcp <= 1'd1; ds <= data[15];end
			1: begin shcp <= 1'd1; end
			2: begin shcp <= 1'd0; stcp <= 1'd0; ds <= data[14];end
			3: begin shcp <= 1'd1; end
			4: begin shcp <= 1'd0; ds <= data[13];end
			5: begin shcp <= 1'd1; end
			6: begin shcp <= 1'd0; ds <= data[12];end
			7: begin shcp <= 1'd1; end
			8: begin shcp <= 1'd0; ds <= data[11];end
			9: begin shcp <= 1'd1; end
			10: begin shcp <= 1'd0; ds <= data[10];end
			11: begin shcp <= 1'd1; end
			12: begin shcp <= 1'd0; ds <= data[9];end
			13: begin shcp <= 1'd1; end
			14: begin shcp <= 1'd0; ds <= data[8];end
			15: begin shcp <= 1'd1; end
			16: begin shcp <= 1'd0; ds <= data[7];end
			17: begin shcp <= 1'd1; end
			18: begin shcp <= 1'd0; ds <= data[6];end
			19: begin shcp <= 1'd1; end
			20: begin shcp <= 1'd0; ds <= data[5];end
			21: begin shcp <= 1'd1; end
			22: begin shcp <= 1'd0; ds <= data[4];end
			23: begin shcp <= 1'd1; end
			24: begin shcp <= 1'd0; ds <= data[3];end
			25: begin shcp <= 1'd1; end
			26: begin shcp <= 1'd0; ds <= data[2];end
			27: begin shcp <= 1'd1; end
			28: begin shcp <= 1'd0; ds <= data[1];end
			29: begin shcp <= 1'd1; end
			30: begin shcp <= 1'd0; ds <= data[0];end
			31: begin shcp <= 1'd1; end
		endcase
end
endmodule

FPGA学习笔记(6)——串、并转换

仿真图,与时序图4结果一致

参考:https://www.bilibili.com/video/BV1KE411h7AZ?p=12&vd_source=3e7443822a1d6c6318a816938f700f14文章来源地址https://www.toymoban.com/news/detail-413624.html

到了这里,关于FPGA学习笔记(6)——串、并转换的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • STM32实现74HC595控制

            本文主要是实出74HC595的简单控制功能实现(学习笔记整理)。 (一)74HC595简述           74HC595是一个8位串行输入、平行输出的位移缓存器:平台行输出为三态输出 。         在SCHCP的上升沿输入,在STCP的上升沿进入存储寄存器中去,如果两个时钟连在

    2024年02月14日
    浏览(32)
  • stm32 74hc595级联编程

    原理图如下  代码如下\\\"xl74hc595.c\\\" \\\"xl74hc595.h\\\" 代码如下 GPIO初始化 具体IO口根据实际需求进行修改 支持任意长度的的595芯片级联  

    2024年02月06日
    浏览(36)
  • 【51单片机】IO 扩展(串转并)--74HC595

    参考: 普中 51 单片机开发攻略 第12章 【51单片机入门教程-2020版 程序全程纯手打 从零开始入门】 https://www.bilibili.com/video/BV1Mb411e7re/?p=21share_source=copy_webvd_source=77e36f24add8dc77c362748ffb980148 nop ()是什么语句? and 位运算操作符 【51单片机入门教程-2020版 程序全程纯手打 从零开始入

    2024年01月22日
    浏览(35)
  • 51单片机——74HC595的应用(SPI实践)

    目录 SPI总线 SPI总线概述  SPI总线分类 SPI 优点及缺点 SPI接口硬件原理 SPI四种工作模式  74HC595应用 74HC595芯片概述 74HC595封装及管脚功能 74HC595工作原理 ​编辑  74HC595串行转并行点亮LED灯  程序实现   Proteus运行结构示意图 SPI总线概述   SPI(Serial Peripheral interface): 串行外

    2024年02月02日
    浏览(32)
  • STM32 4位数码管和74HC595

            在使用一位数码管的时候,会用到8个IO口,那如果使用4位数码管,难道要使用32个IO口吗?肯定是不行的,太浪费了IO口了。把四个数码管全部接一起共用8个IO口,然后分别给他们一个片选。所以4位数码管共有12个IO口。         当选择数码管1显示的时候,这可以

    2024年04月17日
    浏览(70)
  • 51单片机开发:通过74HC595控制LED点阵

    (1)LED点阵就是多个LED发光二极管的集合,在单个LED的发光原理上没有任何区别; (2)上面是16x16的LED点阵,总共有16x16=256个LED灯,由32个引脚来控制,其中16个引脚是正极(posn,n=1、2······、16),16个引脚是负极(NEGn,n=1、2······、16); (3)LED点阵可以用坐标系的思想来理解,

    2024年02月12日
    浏览(36)
  • 三、51单片机用74HC595控制LED点阵

    (1)外观 (2)作用 LED点阵通过LED(发光二极管)组成,以灯珠亮灭来显示文字、图片等,LED点阵显示被广泛应用于各种公共场合,如汽车报站器、广告屏以及公告牌等。 以8*8LED点阵为例。 (1)单片机端口直接驱动。驱动8*8的点阵需要2个IO端口(16个IO口)。 (2)使用串转并移位锁存器驱

    2024年02月03日
    浏览(55)
  • 51单片机——IO拓展(串转并)-74HC595 小白详解

    74HC595 芯片介绍 74HC595 是一个 8 位串行输入、并行输出的位移缓存器,其中并行输出为三 态输出(即高电平、低电平和高阻抗)。芯片管脚及功能说明如下:图1 上面两张都是 74HC595 芯片管脚图,细心的朋友就会发现左侧的 1 脚是 QB, 而右侧芯片的 1 脚是 Q1,左侧芯片的 11

    2024年02月04日
    浏览(34)
  • 74HC595D介绍与实现(C语言与verilog实现)

    8位串行输入 8位可串行或并行输出 具有3种状态输出的存储寄存器 具有复位功能的移位寄存器 具有串行输入(DS)和串行输出(Q7S)来级联的功能。 移位寄存器和存储寄存器的时钟可分开控制。 引脚名 引脚号 说明 Q0、Q1、Q2、Q3、Q4、Q5、Q6、Q7 15,1,2,3,4,5,6,7 并行数据输出 Q7

    2024年02月17日
    浏览(24)
  • 51单片机驱动8位数码管(74HC595驱动)滚动显示

    原文链接:https://www.yourcee.com/newsinfo/2929591.html 点击图片购买 主要关注下供电电压是3.0-5.0v(建议5V),请在规定范围内供电。 模块上芯片引出5个引脚,芯片引脚与模块引脚对应关系是:VCC-VCC SCK-SCLK, RCK-RCLK,SER-DIO,GND-GND 可以对比程序学习时序图,便于理解。 1.显示异常可排除

    2024年02月15日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包