HDLbits基础知识点与部分题目解析(1)
基础知识
线网(wire)
wire 类型表示硬件单元之间的物理连线,由其连接的器件输出端连续驱动。如果没有驱动元件连接到 wire 型变量,缺省值一般为 “Z”。
在定义wire型变量时不要忘记定义位宽,默认为1bit
寄存器(reg)
寄存器(reg)用来表示存储单元,它会保持数据原有的值,直到被改写。
reg变量通常在always块中被综合成变压触发器,在组合逻辑中北综合成wire型变量。
定义位宽时通常高位在左,表示最高有效位在左。
// Verilog 支持 bit 位后固定位宽的向量域选择访问
// 下面 2 种赋值是等效的
A = data1[31-: 8] ;
A = data1[31:24] ;
其他类型变量
-
整数(integer)声明时不用指明位宽,位宽和编译器有关,一般为32 bit有符号数(reg型变量为无符号数)
-
实数(real)声明时不能带有范围,默认值为0,可以用十进制或科学计数法表示。
-
时间寄存器变量(time)对仿真时间进行保存,其宽度一般为64bit,通过$time获取。
-
参数(parameter)用来表示常量,只能赋值一次。
-
数组 举例: wire [7:0] {表示位宽} addr_bus [3:0]{表示个数/维度}
表达式
乘(*)、除(/)、加(+)、减(-)、求幂(**)、取模(%)
a^b ; //a与b进行异或操作
a~^b ; //a与b进行同或操作
逻辑操作符主要有 3 个:&&(逻辑与), ||(逻辑或),!(逻辑非)。
移位操作符(<<...) 拼接操作符({,}) 条件操作符(?:)
Norgate 或非门
//nor是或非 xor是异或 xnor是同或...注意区分
module top_module(
input a,
input b,
output out );
assign out = ~(a|b);//同或为a^~b
endmodule
Vector reversal
//看到题目的第一反应是遍历 但就8bit就一个个拼吧
module top_module(
input [7:0] in,
output [7:0] out
);
assign out[7:0]={in[0],in[1],in[2],in[3],in[4],in[5],in[6],in[7]};
endmodule
Vector4
module top_module (
input [7:0] in,
output [31:0] out );//
assign out = {{24{in[7]}},in};//倍数要在大括号内
endmodule