verilog简单入门day7
2026/6/13 20:42:11 网站建设 项目流程

今天我们先尝试一下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

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询