You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
47 lines
2.0 KiB
Verilog
47 lines
2.0 KiB
Verilog
module led( // 该括号内对 io口 以及类型 进行说明
|
|
input key, // 默认为 wire 型
|
|
output reg led // 因为需要再always中改变状态, 需要设置为寄存器型
|
|
);
|
|
|
|
parameter WIDTH = 5; // 定义一个内部常量, 可以供模块式用, 当然你这个变量可以在外部被修改, 编译的时候使用
|
|
|
|
|
|
wire [WIDTH:0] tmp1, tmp2; // 定义两个 线类型信号, 宽度为 常量 WIDTH
|
|
|
|
reg [WIDTH:0]v_reg; // 定义一个 寄存器类型, 宽度为 6bit 寄存器类型在下一次触发机制到来之前, 保留原值
|
|
wire [WIDTH:0]v_wire; // 定义一个 线类型, 宽度为 6bit
|
|
|
|
always @(*) begin // * 表示内部的任何变量发生变化的时候, 就会并行执行该 block
|
|
// 该块 没有带时钟信号, 虽然内部产生的信号定义还是 reg型的, 但是他并没有产生时序逻辑, 还是组合逻辑, 只有带时钟信号之后, 才会使用真正的存储单元/寄存器
|
|
// begin ... end 表示改语句是一个块, 块内的语句是一体的, 如果没有begin ... end, 则只会执行 always 下面紧挨着的 1行!
|
|
led = !key; // 对reg 类型变量 阻塞赋值, 他执行完毕, 才会执行下面的
|
|
|
|
v_reg[1] = key;
|
|
// v_wire[1] = key; // 不能 对 wire 类型 进行赋值, wire类型是用来连接各种门的信号线, 他只能使用 assign进行连线
|
|
end
|
|
|
|
// assign v_reg[0] = key; // 寄存器类型 不能进行 连线, 他只能在 always中进行赋值
|
|
assign v_wire[0] = key;
|
|
assign v_wire[1] = v_reg[1]; // 把 v_wire 线中 下标1的位置直接连到 v_reg寄存器中的下标1
|
|
|
|
|
|
|
|
// 信号的位宽
|
|
// 信号宽度默认是 1bit, 可以省略不写
|
|
wire c;
|
|
assign c = 1'b1 + 1'b1; // c的宽度是 1bit, 这个加法溢出了, 溢出的丢失, 所以c 是 1'b0
|
|
|
|
|
|
wire a;
|
|
wire b;
|
|
wire d;
|
|
wire s;
|
|
assign a = 1'b1;
|
|
assign b = 1'b1;
|
|
assign {s, d} = a + b; // 也会溢出, 我们把进位保存起来到 s
|
|
|
|
wire [1:0]ret;
|
|
assign {ret[1], ret[0]} = a + b; // 把结果和进位 拼接到位宽为 2 的 ret中
|
|
|
|
|
|
endmodule |