当前位置: 首页 > ai >正文

HC595串转并

HC595.v

/**https://docs.wokwi.com/zh-CN/parts/wokwi-74hc595
**/
`timescale 1ns / 1ps
module HC595 (input wire i_clk,             // 全局时钟,用于同步操作input wire i_rst_n,             // 复位信号,清除所有寄存器input wire DS,            // 串行数据输入(DS)input wire SHCP,            // 移位时钟(SHCP),用于移位操作input wire STCP,            // 存储时钟(STCP),用于锁存数据output reg [7:0] Q,     // 8 位并行输出(Q)output reg Q7S              // 串行输出(从移位寄存器)
);reg [7:0] r_shift_reg; // 8 位移位寄存器// 移位操作:每当 SHCP 上升沿时,将串行数据输入到移位寄存器always @(posedge SHCP or posedge i_rst_n) beginif (!i_rst_n) beginr_shift_reg <= 8'b0; // 复位时清零移位寄存器end else beginr_shift_reg <= {r_shift_reg[6:0], DS}; // 左移并输入串行数据endend// 存储操作:每当 STCP 上升沿时,将移位寄存器的内容传递到并行输出寄存器always @(posedge STCP or posedge i_rst_n) beginif (!i_rst_n) beginQ <= 8'b0; // 复位时清空并行输出end else beginQ <= r_shift_reg; // 将移位寄存器的内容输出到并行输出endend// 串行输出:移位寄存器的最右边位(r_shift_reg[7])作为串行输出always @(posedge i_clk) beginQ7S <= r_shift_reg[7]; // 串行输出为移位寄存器的最右边位endendmodule

hc595_drive.v

`timescale 1ns / 1psmodule hc595_drive (input wire        i_clk,       // 全局时钟input wire        i_rst_n,     // 低电平复位input wire        i_start,     // 启动信号input wire [7:0]  i_data,     // 8 位数据输入output reg        o_shcp,      // 移位时钟output reg        o_stcp,      // 存储时钟output reg        o_ds,      // 串行数据输出output reg        o_done       // 传输完成信号
);// 状态编码localparam S_IDLE        = 3'd0,S_LOAD        = 3'd1,S_SHIFT_LOW   = 3'd2,S_SHIFT_HIGH  = 3'd3,S_LATCH_LOW   = 3'd4,S_LATCH_HIGH  = 3'd5,S_DONE        = 3'd6;reg [2:0] state;reg [3:0] r_bit_cnt;reg [7:0] r_shift_reg;always @(posedge i_clk or negedge i_rst_n) beginif (!i_rst_n) begino_shcp      <= 1'b0;o_stcp      <= 1'b0;o_ds      <= 1'b0;o_done      <= 1'b0;r_bit_cnt   <= 4'd0;r_shift_reg <= 8'd0;state       <= S_IDLE;end else begincase (state)S_IDLE: begino_done <= 1'b0;o_shcp <= 1'b0;o_stcp <= 1'b0;if (i_start) beginstate <= S_LOAD;endendS_LOAD: beginr_shift_reg <= i_data;r_bit_cnt   <= 4'd0;state       <= S_SHIFT_LOW;endS_SHIFT_LOW: begino_ds <= r_shift_reg[7];o_shcp <= 1'b0;state  <= S_SHIFT_HIGH;endS_SHIFT_HIGH: begino_shcp      <= 1'b1;r_shift_reg <= {r_shift_reg[6:0], 1'b0};  // 左移r_bit_cnt   <= r_bit_cnt + 1;if (r_bit_cnt == 4'd7)state <= S_LATCH_LOW;elsestate <= S_SHIFT_LOW;endS_LATCH_LOW: begino_stcp <= 1'b0;state  <= S_LATCH_HIGH;endS_LATCH_HIGH: begino_stcp <= 1'b1;state  <= S_DONE;endS_DONE: begino_stcp <= 1'b0;o_shcp <= 1'b0;o_done <= 1'b1;state  <= S_IDLE;endendcaseendendendmodule

tb.v

`timescale 1ns / 1psmodule tb;reg clk;reg rst_n;reg start;reg [7:0] dat;wire SHCP;wire STCP;wire DS;wire done;wire [7:0] Q;wire Q7S;// 实例化 HC595HC595 u_hc595 (.i_clk(clk),.i_rst_n(rst_n),.DS(DS),.SHCP(SHCP),.STCP(STCP),.Q(Q),.Q7S(Q7S));// 实例化驱动模块hc595_drive u_hc595_drive (.i_clk(clk),.i_rst_n(rst_n),.i_start(start),.i_data(dat),.o_shcp(SHCP),.o_stcp(STCP),.o_ds(DS),.o_done(done));// 生成时钟initial clk = 0;always #5 clk = ~clk; // 100MHzinitial begin// 初始化rst_n = 0;start = 0;dat = 8'h00;#20;rst_n = 1;#20;// 写入 0x38dat = 8'h38;start = 1;#10;start = 0;// 等待传输完成wait(done == 1);#10;$display("Q_OUT after 0x38 = %b", Q);// 写入 0x46dat = 8'h46;start = 1;#10;start = 0;wait(done == 1);#10;$display("Q_OUT after 0x46 = %b", Q);#50;$finish;endendmodule

wokwi

main.ino

#include <Arduino.h>
#define datapin  2
#define clockpin  3
#define latchpin  4
#define HC595_SCLK(x)  digitalWrite(clockpin, x)
#define HC595_RCLK(x)  digitalWrite(latchpin, x)
#define HC595_SDAT(x)  digitalWrite(datapin, x)
void hc595_drive(unsigned char dat_h)
{unsigned char i;unsigned char dat_temp;HC595_SCLK(0);HC595_RCLK(0);dat_temp = dat_h;for (i = 0; i<8; i++){HC595_SDAT(dat_temp >= 0x80);HC595_SCLK(0);delay(1);HC595_SCLK(1);delay(1);dat_temp = dat_temp << 1;}HC595_RCLK(0);delay(1);HC595_RCLK(1);delay(1);HC595_SCLK(0);HC595_RCLK(0);HC595_SDAT(0);
}
void hc595_init()
{pinMode(datapin, OUTPUT);pinMode(clockpin, OUTPUT);pinMode(latchpin, OUTPUT);
}void setup()
{hc595_init();hc595_drive(0x01);
}void loop()
{}

diagram.json

{"version": 1,"author": "Uri Shaked","editor": "wokwi","parts": [{ "type": "wokwi-arduino-uno", "id": "uno", "top": 231, "left": -135, "attrs": {} },{"type": "wokwi-74hc595","id": "sr1","top": 94.66,"left": 178.9,"rotate": 270,"attrs": {}},{"type": "wokwi-led-bar-graph","id": "bargraph1","top": 72,"left": 321.6,"attrs": { "color": "lime" }},{ "type": "wokwi-gnd", "id": "gnd1", "top": 182.4, "left": 345, "attrs": {} }],"connections": [[ "sr1:DS", "uno:2", "blue", [ "h-75.6", "h0", "v115.2" ] ],[ "sr1:STCP", "uno:4", "purple", [ "h-56.4", "v0", "h-61.5" ] ],[ "sr1:SHCP", "uno:3", "gray", [ "h-75.6", "v0", "h-32.8" ] ],[ "sr1:Q0", "bargraph1:A1", "green", [ "h-18", "v28.8", "h67.2", "v-86.4" ] ],[ "sr1:Q1", "bargraph1:A2", "green", [ "h38.4", "v-57.6" ] ],[ "sr1:Q2", "bargraph1:A3", "green", [ "h28.8", "v-38.4" ] ],[ "sr1:Q3", "bargraph1:A4", "green", [ "h9.6", "v-19.2" ] ],[ "sr1:Q4", "bargraph1:A5", "green", [ "h0" ] ],[ "sr1:Q5", "bargraph1:A6", "green", [ "h9.6", "v-48", "h67.2", "v67.2" ] ],[ "sr1:Q6", "bargraph1:A7", "green", [ "h57.6", "v48" ] ],[ "sr1:Q7", "bargraph1:A8", "green", [ "h48", "v57.6" ] ],[ "bargraph1:C1", "bargraph1:C2", "green", [ "v0" ] ],[ "bargraph1:C3", "bargraph1:C4", "green", [ "h0" ] ],[ "bargraph1:C5", "bargraph1:C6", "green", [ "h0" ] ],[ "bargraph1:C7", "bargraph1:C8", "green", [ "h0" ] ],[ "bargraph1:C9", "bargraph1:C10", "green", [ "h0" ] ],[ "bargraph1:C8", "bargraph1:C9", "green", [ "h0" ] ],[ "bargraph1:C2", "bargraph1:C3", "green", [ "h0" ] ],[ "bargraph1:C4", "bargraph1:C5", "green", [ "h0" ] ],[ "bargraph1:C6", "bargraph1:C7", "green", [ "h0" ] ],[ "gnd1:GND", "bargraph1:C10", "black", [ "v0" ] ]],"dependencies": {}
}

hc595_drive.c

void hc595_drive(unsigned char dat_h/*,unsigned char dat_l*/)
{unsigned char i;unsigned char dat_temp;HC595_SCLK = 0;HC595_RCLK = 0;dat_temp = dat_h;for (i = 0; i<8; i++){if (dat_temp >= 0x80)HC595_SDAT = 1;else HC595_SDAT = 0;HC595_SCLK = 0;_delay(1);HC595_SCLK = 1;_delay(1);dat_temp = dat_temp << 1;}/*dat_temp=dat_l;for(i=0;i<8;i++){if(dat_temp>=0x80)HC595_SDAT=1;else HC595_SDAT=0;HC595_SCLK=0;_delay(1);HC595_SCLK=1;_delay(1);dat_temp=dat_temp<<1;}*/HC595_RCLK = 0;_delay(1);HC595_RCLK = 1;_delay(1);HC595_SCLK = 0;HC595_RCLK = 0;HC595_SDAT = 0;
}

arduino


#include <Arduino.h>int datapin = 2; 
int clockpin = 3;
int latchpin = 4;
#define HC595_SCLK(x)  digitalWrite(3, x)
#define HC595_RCLK(x)  digitalWrite(4, x)
#define HC595_SDAT(x)  digitalWrite(2, x)
void hc595_drive(unsigned char dat_h)
{unsigned char i;unsigned char dat_temp;HC595_SCLK(0);HC595_RCLK(0);dat_temp = dat_h;for (i = 0; i<8; i++){HC595_SDAT(dat_temp >= 0x80);HC595_SCLK(0);delay(1);HC595_SCLK(1);delay(1);dat_temp = dat_temp << 1;}HC595_RCLK(0);delay(1);HC595_RCLK(1);delay(1);HC595_SCLK(0);HC595_RCLK(0);HC595_SDAT(0);
}void setup()
{pinMode(datapin, OUTPUT);pinMode(clockpin, OUTPUT);  pinMode(latchpin, OUTPUT);hc595_drive(0x01);
}void loop()
{}

diagram.json

{"version": 1,"author": "Uri Shaked","editor": "wokwi","parts": [{ "type": "wokwi-arduino-uno", "id": "uno", "top": 231, "left": -135, "attrs": {} },{"type": "wokwi-74hc595","id": "sr1","top": 94.66,"left": 178.9,"rotate": 270,"attrs": {}},{"type": "wokwi-led-bar-graph","id": "bargraph1","top": 72,"left": 321.6,"attrs": { "color": "lime" }},{ "type": "wokwi-gnd", "id": "gnd1", "top": 182.4, "left": 345, "attrs": {} }],"connections": [[ "sr1:DS", "uno:2", "blue", [ "h-75.6", "h0", "v115.2" ] ],[ "sr1:STCP", "uno:4", "purple", [ "h-56.4", "v0", "h-61.5" ] ],[ "sr1:SHCP", "uno:3", "gray", [ "h4", "v30", "h-66" ] ],[ "sr1:Q0", "bargraph1:A1", "green", [ "h-18", "v28.8", "h67.2", "v-86.4" ] ],[ "sr1:Q1", "bargraph1:A2", "green", [ "h38.4", "v-57.6" ] ],[ "sr1:Q2", "bargraph1:A3", "green", [ "h28.8", "v-38.4" ] ],[ "sr1:Q3", "bargraph1:A4", "green", [ "h9.6", "v-19.2" ] ],[ "sr1:Q4", "bargraph1:A5", "green", [ "h0" ] ],[ "sr1:Q5", "bargraph1:A6", "green", [ "h9.6", "v-48", "h67.2", "v67.2" ] ],[ "sr1:Q6", "bargraph1:A7", "green", [ "h57.6", "v48" ] ],[ "sr1:Q7", "bargraph1:A8", "green", [ "h48", "v57.6" ] ],[ "bargraph1:C1", "bargraph1:C2", "green", [ "v0" ] ],[ "bargraph1:C3", "bargraph1:C4", "green", [ "h0" ] ],[ "bargraph1:C5", "bargraph1:C6", "green", [ "h0" ] ],[ "bargraph1:C7", "bargraph1:C8", "green", [ "h0" ] ],[ "bargraph1:C9", "bargraph1:C10", "green", [ "h0" ] ],[ "bargraph1:C8", "bargraph1:C9", "green", [ "h0" ] ],[ "bargraph1:C2", "bargraph1:C3", "green", [ "h0" ] ],[ "bargraph1:C4", "bargraph1:C5", "green", [ "h0" ] ],[ "bargraph1:C6", "bargraph1:C7", "green", [ "h0" ] ],[ "gnd1:GND", "bargraph1:C10", "black", [ "v0" ] ]],"dependencies": {}
}
···
http://www.xdnf.cn/news/15416.html

相关文章:

  • CUDA 环境下 `libcuda.so` 缺失问题解决方案
  • linux网络编程之单reactor模型(二)
  • 僵尸进程Zombie Process
  • Java核心类库深度解析与实战:从字符串处理到计算器开发
  • 【Android】按钮的使用
  • Windows远程FX的编解码器性能优化
  • vscode 打开c++文件注释乱码
  • WPF,Winform,HTML5网页,哪个UI开发速度最快?
  • 智驾芯片软件分层测试
  • Element plus参考vben逻辑实现的描述列表组件封装实践
  • Spark Expression codegen
  • 利用DeepSeek为chdb命令行客户端添加输出重定向和执行SQL脚本功能
  • uniapp 微信小程序Vue3项目使用内置组件movable-area封装悬浮可拖拽按钮(拖拽结束时自动吸附到最近的屏幕边缘)
  • JDK1.8函数式编程实战(附日常工作案例,仅此一篇耐心看完彻底搞懂)
  • 力扣73:矩阵置零
  • redis红锁
  • 微信小程序开发-桌面端和移动端UI表现不一致问题记录
  • 自然语言指令驱动的工业机器人协同学习系统:大语言模型如何重塑智能体协作范式
  • Containerd容器技术详解
  • 拥抱 Spring Boot:开启 Java 后端开发的“快车道”
  • 2025阿里云黑洞恢复全指南:从应急响应到长效防御的实战方案
  • AJAX 开发中的注意点
  • C++ Qt插件开发样例
  • Python初学者笔记第十三期 -- (常用内置函数)
  • 【鸿蒙HarmonyOS】鸿蒙app开发入门到实战教程(二):封装自定义可复用组件
  • 深入解析环境变量:从基础概念到系统级应用
  • kdump生成转储文件调试内核崩溃、死机
  • Java 栈和队列
  • linux 系统依赖包查询命令汇总
  • IPM31主板E3300usb键盘鼠标安装成功Sata接口硬盘IDE模式server2003-nt-5.2.3790