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

verilog简单入门day7

今天我们先尝试一下debug

这是代码块示意图

这是原代码

always @(*) begin if (cpu_overheated) shut_off_computer = 1; end always @(*) begin if (~arrived) keep_driving = ~gas_tank_empty; end

可以发现这个代码无法实现图片功能,因此我们需要进行修改,有两个latch(锁存器),

组合逻辑在任何情况下,所有输出都必须被赋值。

这通常意味着:

  • 必须写else

  • 或者在always一开始给一个default 值

eg1

always @(*) begin shut_off_computer = 1'b0; // 默认值 if (cpu_overheated) shut_off_computer = 1'b1; end

case1 case语句

Verilog 中的case 语句,在功能上几乎等价于一串
if – else if – else,用于将一个表达式多个候选值进行比较。

eg2

module top_module ( input [2:0] sel, input [3:0] data0, input [3:0] data1, input [3:0] data2, input [3:0] data3, input [3:0] data4, input [3:0] data5, output reg [3:0] out );// always@(*) begin // This is a combinational circuit out=4'b0; case(sel) 3'b000:begin out = data0; end 3'b001:begin out = data1; end 3'b010:begin out = data2; end 3'b011:begin out = data3; end 3'b100:begin out = data4; end 3'b101:begin out = data5; end endcase end endmodule

case2实现一个优先编码器

优先编码器(priority encoder)是一种组合逻辑电路
当输入一个比特向量(bit vector)时,
它会输出第一个为 1 的比特所在的位置

module top_module ( input [3:0] in, output reg [1:0] pos ); always @(*)begin pos=2'b0; case(in) 4'b0000:begin pos = 2'd0; end 4'b0001:begin pos = 2'd0; end 4'b0011:begin pos = 2'd0; end 4'b1001:begin pos = 2'd0; end 4'b0101:begin pos = 2'd0; end 4'b1101:begin pos = 2'd0; end 4'b1011:begin pos = 2'd0; end 4'b0111:begin pos = 2'd0; end 4'b1111:begin pos = 2'd0; end 4'b0010:begin pos = 2'd1; end 4'b1010:begin pos = 2'd1; end 4'b0110:begin pos = 2'd1; end 4'b1110:begin pos = 2'd1; end 4'b0100:begin pos = 2'd2; end 4'b1100:begin pos = 2'd2; end 4'b1000:begin pos = 2'd3; end endcase end endmodule

用if语句更简单

module top_module ( input [3:0] in, output reg [1:0] pos ); always @(*) begin if (in[0]) pos = 2'd0; else if (in[1]) pos = 2'd1; else if (in[2]) pos = 2'd2; else if (in[3]) pos = 2'd3; else pos = 2'd0; // in 全 0 的情况,必须有 end endmodule

casez支持高阻输入,当成?来处理

module top_module ( input [7:0] in, output reg [2:0] pos ); always@(*)begin pos = 3'b0; casez(in) 8'b00000000:pos = 3'd0; 8'bzzzzzz10:pos = 3'd1; 8'bzzzzz100:pos = 3'd2; 8'bzzzz1000:pos = 3'd3; 8'bzzz10000:pos = 3'd4; 8'bzz100000:pos = 3'd5; 8'bz1000000:pos = 3'd6; 8'b10000000:pos = 3'd7; endcase end endmodule

case3 游戏编辑器

假设你正在为一个游戏设计电路,用来处理PS/2 键盘传来的扫描码(scancode),给定最近接收到的两个字节(16 位)的扫描码
你需要判断是否有某个方向键被按下。扫描码与方向键的对应关系

Scancode (16-bit)方向键
16'he06b
16'he072
16'he074
16'he075
其他
module top_module ( input [15:0] scancode, output reg left, output reg down, output reg right, output reg up ); always@(*)begin left = 0; down = 0; right = 0; up = 0; case(scancode) 16'he06b:left = 1'b1; 16'he072:down = 1'b1; 16'he074:right = 1'b1; 16'he075:up = 1'b1; endcase end endmodule
http://www.cnnetsun.cn/news/70909.html

相关文章:

  • ZeroOmega代理管理:3分钟掌握浏览器智能代理的完整指南
  • 27、实用awk程序大揭秘
  • Reactor Core终极指南:掌握JVM高性能异步编程核心技术
  • Linux网络编程之封装Socket模块现实意义和价值
  • LangChain输出解析器提取Qwen-Image-Edit-2509编辑指令结构
  • Python字典的`==`操作:从表面相等到深度洞察
  • 3步完成数据库升级:从SQLite到MySQL的智能迁移方案
  • 基于Spring Boot+Vue的电子政务服务管理系统
  • HunyuanVideo-Foley + Git 工作流整合:实现自动化音效生成CI/CD
  • Java开发场景下AI代码生成技术实测报告:效率与安全性双重验证
  • 力扣刷题知识点总结
  • 寻找两个正序数组的中位数:思路与实现
  • 商业广告音效定制避坑指南:3分钟搞懂版权费用与隐藏成本
  • 5个让玩家身临其境的游戏音效设计秘诀(附实战资源库)
  • 影视剪辑必看:5个关键技巧教你避开音效版权雷区
  • 游戏串流实战手册:从零搭建高效串流系统
  • 小米运动步数自动同步:2025年免费刷步数完整教程
  • 原神帧率解锁神器:突破60帧限制的终极解决方案
  • STL——set
  • [CTF]攻防世界:fakebook (sql注入)
  • Zepp Life自动刷步终极指南:3分钟搞定微信支付宝同步
  • FLUX.1-dev与Docker镜像优化:最小化容器体积提升加载速度
  • Applite:Mac软件管理终极指南,告别命令行烦恼
  • Ollama下载GPT-OSS-20B并实现本地化AI服务的完整教程
  • SkyWalking 与 Zipkin、Prometheus 深度对比分析
  • 全面升级!yudao-cloud v2.4.2重磅发布:AI大模型与工作流引擎双引擎驱动业务创新
  • gpt-oss-20b结合Dify部署实现可视化AI工作流
  • AI自动修复CHLSProxy SSL证书错误:开发者新利器
  • 77777
  • 大麦抢票终极指南:DamaiHelper全自动解决方案