74HC165是并行输入,串行输出,其中SER端也可以作为串行输入,在级联的使用。在使用时候碰到一些问题,解释如下:

1. ABCDEFGH输入后,串行输出,首先输出哪个?

由其逻辑框图可知,H端离输出端最近,且只有一个D触发器,所以第一个输出的是H端,依次输出HGFEDCBA。

2. 如果级联的话,输出顺序是什么?

如下图级联所示:

在FPGA中逻辑我们可以这么写:code_temp4 <= {code_temp4[30:0],i_shift_qh4};

其中code_temp4 是寄存器,i_shift_qh4是U10的串行输出端,输出给FPGA

这样的话对于每一片74HC165输出顺序是固定的,为HGFEDCBA,图总级联了四片,其输出顺序为U10-U9-U7-U6,这样最后的数据code_temp4 为:

 31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
U10 U10 U10 U10 U10 U10 U10 U10 U9 U9 U9 U9 U9 U9 U9 U9 U7 U7 U7 U7 U7 U7 U7 U7 u6 u6 u6 u6 u6 u6 u6 u6
H G F E D C B A H G F E D C B A H G F E D C B A H G F E D C B A

具体FPGA驱动程序如下所示:

//Serial clock generator

always @(posedge i_clk or negedge i_rstn) begin
if(!i_rstn) begin
o_shift_clk <= 1'b0;
counter_divider <= 3'b0;
end
else if(counter_divider >= 3'd4) begin
o_shift_clk <= ~o_shift_clk;
counter_divider <= 3'b0;
end
else begin
o_shift_clk <= o_shift_clk;
counter_divider <= counter_divider + 3'b1;
end
end

//Serial clock edge check 
assign rising_edgeof_shiftclk = (clk_temp==2'b01);
assign falling_edgeof_shiftclk = (clk_temp==2'b10);

always @(posedge i_clk or negedge i_rstn) begin
if(!i_rstn) begin
clk_temp <= 2'b0;
end
else begin
clk_temp <= {clk_temp[0],o_shift_clk};
end
end

//Serial data input process
always @(posedge i_clk or negedge i_rstn) begin
if(!i_rstn) begin
o_shift_clkinh <= 1'b1 ;
o_shift_shld_n <= 1'b1 ;
o_code_valid <= 1'b0 ;
o_code <= {28{1'b1}} ;

counter_shift <= 8'h0 ;

state <= IDLE ;
end
else begin
case(state)
IDLE: begin
o_shift_clkinh <= 1'b1 ;
o_shift_shld_n <= 1'b1 ;
o_code_valid <= 1'b0 ;
o_code <= {28{1'b1}} ;

counter_shift <= 8'h0 ;

if(i_start) begin
state <= LOAD ;
end
else begin
state <= IDLE ;
end
end
LOAD: begin
if(rising_edgeof_shiftclk) begin
o_shift_clkinh <= 1'b1 ;
o_shift_shld_n <= 1'b0 ;
state <= LOAD_PULSE ;
end
else begin
state <= LOAD ;
end
end
LOAD_PULSE: begin
if(rising_edgeof_shiftclk) begin
o_shift_clkinh <= 1'b1 ;
o_shift_shld_n <= 1'b1 ;
state <= LOAD_DELAY ;
end
else begin
state <= LOAD_PULSE ;
end
end
LOAD_DELAY: begin
if(rising_edgeof_shiftclk) begin
o_shift_clkinh <= 1'b1 ;
o_shift_shld_n <= 1'b1 ;
state <= SHIFT_START ;
end
else begin
state <= LOAD_DELAY ;
end
end
SHIFT_START: begin
if(falling_edgeof_shiftclk) begin
o_shift_clkinh <= 1'b0 ;
o_shift_shld_n <= 1'b1 ;
state <= SHIFT ;
end
else begin
state <= SHIFT_START ;
end
end
SHIFT: begin
if(falling_edgeof_shiftclk) begin
counter_shift <= counter_shift + 1'b1 ;

if(counter_shift >= 31) begin
o_shift_clkinh <= 1'b1 ;
o_shift_shld_n <= 1'b1 ;
state <= SHIFT_DONE ;
end
end
else begin
state <= SHIFT ;
end
end
SHIFT_DONE: begin
o_shift_clkinh <= 1'b1 ;
o_shift_shld_n <= 1'b1 ;
counter_shift <= 8'h0 ;

o_code_valid <= 1'b1 ;
//o_code <= {code_temp4[3:0],
// code_temp3[7:0],
// code_temp2[7:0],
// code_temp1[7:0]} ;

o_code <= code_temp4[27:0] ;
state <= IDLE ;
end
default: begin
o_shift_clkinh <= 1'b1 ;
o_shift_shld_n <= 1'b1 ;
o_code_valid <= 1'b0 ;
o_code <= {28{1'b1}} ;

counter_shift <= 8'h0 ;

state <= IDLE ;
end
endcase
end

end

always @(posedge i_clk or negedge i_rstn) begin
if(!i_rstn) begin
code_temp4 <= 32'hffff_ffff;
end
else if(o_shift_clkinh==1'b0 && rising_edgeof_shiftclk) begin
code_temp4 <= {code_temp4[30:0],i_shift_qh4};//其中i_shift_qh4是sn165的输出引脚,连接到FPGA
end
else begin
code_temp4 <= code_temp4;
end
end

SN74HC165驱动相关推荐

  1. 嵌入式Linux设备驱动程序:在运行时读取驱动程序状态

    嵌入式Linux设备驱动程序:在运行时读取驱动程序状态 Embedded Linux device drivers: Reading driver state at runtime 在运行时了解驱动程 ...

  2. 0、Spring 注解驱动开发

    0.Spring注解驱动开发 0.1 简介 <Spring注解驱动开发>是一套帮助我们深入了解Spring原理机制的教程: 现今SpringBoot.SpringCloud技术非常火热,作 ...

  3. 安装 Python MySQL 驱动(mysql-connector-python、MySQL-python)

    1. 安装 由于 MySQL 服务器以独立的进程运行,并通过网络对外服务,所以,需要支持 Python 的MySQL 驱动来连接到 MySQL 服务器. 目前,有两个MySQL驱动: mysql-co ...

  4. Linux驱动框架之framebuffer驱动框架

    1.什么是framebuffer? (1)framebuffer帧缓冲(一屏幕数据)(简称fb)是linux内核中虚拟出的一个设备,framebuffer向应用层提供一个统一标准接口的显示设备.帧缓冲 ...

  5. [Ubuntu] 安装/卸载 声卡驱动

    卸载 sudo apt-get --purge remove linux-sound-base alsa-base alsa-utils 安装 sudo apt-get install linux-s ...

  6. pci串口驱动安装失败_TSC TTP-243E Pluse装LTP并口驱动无法安装

    一.前言描述 接到客户报修说,电脑无法开机,即到哥上门维修立即安排人员到现场查看原因,到现场后,查看的确是电脑系统问题,重新安装系统,安装完成系统后,发现打印机无法使用.这个打印机型号是TSC TTP ...

  7. linux mipi驱动分析_寒武纪社招内推数字IC设计、DSI驱动、软件架构、产品经理、芯片架构、工具链开发、深度学习、FAE工程师...

    点击上方蓝字关注我吧! 为什么内推更靠谱?内推是基于人脉关系链的推荐,其背后有一定的信用背书,靠谱的人推荐的人相对也会比较靠谱,所以企业一般职位都是从内部开始分享的,相较于自己海投简历,内推的效率和成 ...

  8. i7 7700hq安装Linux,黑苹果安装火影金刚4K VULCAN JinGang GTX i7-7700HQ 独显驱动 Hackintosh...

    严格来说,这不是一台笔记本,更像是一台移动一体机.火影金刚4K,独显GTX 1060,核显HD 630,在BIOS里是可以屏蔽核显的.所以这一次安装黑苹果时,直接当是一台IMAC来安装,连机型都是选择 ...

  9. java获取达梦数据库_Java连接达梦数据库驱动dm_jdbc

    [实例简介] Java连接达梦数据库驱动dm_jdbc: dm_jdbc\com.dameng.floader.jar dm_jdbc\com.dameng.impexp.jar dm_jdbc\Dm ...

最新文章

  1. Linux那些事儿 之 戏说USB(9)面纱
  2. c语言递归求五阶行列式源代码,久游堂怎么样 -官网
  3. 八张图彻底了解JDK8 GC调优秘籍!
  4. 7.0、Android Studio命令行工具
  5. SSH-publickey
  6. 配置Configuration Manager站点和层次架构(2)
  7. 达梦数据库中服务器日志的开关
  8. c++用一级运算比较大小_1.1.2 python基本数据类型与运算符
  9. 在Win2003中安装bind【部署智能DNS】
  10. 1-4dockerfile基本使用
  11. ASP 無組件上傳類
  12. springboot进行微信公众号相关开发:(二)获取微信公众号access_token用以微信公众号各功能接口的调用
  13. Spark入门程序(idea,scala)
  14. 使用Markdown编写微信公众号文章
  15. 对话罗永浩:手机行业唯一的聪明人死了,我胜算很大
  16. 建筑灭火器配置设计规范
  17. 7个技巧让你写出干净的 TSX 代码
  18. opencv立方体的画法_美术生干货,最详细的立方体透视变化及画法讲解,不看后悔!...
  19. 【数学】扩展卢卡斯定理
  20. win7系统笔记本架设无线热点(AP)

热门文章

  1. Linux 压缩、解压、打包操作
  2. PMEdit一个富文本框可以编辑文本、图片并可以显示GIF动画
  3. 十大经典排序算法动图图解
  4. SDN概述:简介、工具、环境部署
  5. docker pull redis 镜像
  6. android 如何获取网络视频的第一帧
  7. 超好用的在线编程IDE——CS50
  8. 关于GLSL的gl_FragCoord、gl_FragDepth以及深度计算
  9. 免费的桌面主题按钮 V1.0
  10. 电缆故障测试仪的基本原理与组成——TFN DG15M电缆故障测试仪