今天我们先尝试一下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; endcase1 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 endmodulecase2实现一个优先编码器
优先编码器(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 endmodulecasez支持高阻输入,当成?来处理
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 endmodulecase3 游戏编辑器
假设你正在为一个游戏设计电路,用来处理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