sky 06笔记中

1.进阶的hello verilog

module hello_verilog ();

parameter clk_cyc = 10.0;//定义常量

reg clk,rstn;
reg [31:0] a;

always #(clk_cyc/2.0) clk = ~clk;

initial begin
	$display("Hello Verilog.\n");
end

initial begin
	clk = 0; rstn = 0;
	@(posedge clk); //等待时钟上升沿,#和@都是等待的意思
	a = 1;
	repeat(5) @(posedge clk);//等待5个时钟上升沿
	a = 2; rstn = 1;
	repeat(5) @(negedge clk);
	$finish();
end
endmodule

2.tri0,定义三态,如果这根线没有驱动,看作加了下拉电阻的线,tri1上拉电阻。通常用于模块间的连接,连接设计和仿真环境,一般可综合代码不用。
initial 不可综合,always可综合。initial用于测试,只执行一次。

3.wire signed [9:0] s0 ;//定义无符号变量,最高位符号位,补码表示。
4.wire [15:0] c0 ;
assign c0 = “ab”; //16’h6162,把a,b的ascii码赋给c0
5.实数型变量目前不可综合
6.wire [3:0] array [0:7];//8个4bit数组成的数组
7.按bit位逻辑操作运算符:&, |, ~, ^ (与,或,非,异或)
e.g. a&b ; a|b ; a^b ; &a ; |a ; ~a ;
8.整体逻辑操作:&&, ||, !, ==(相等), !=(不相等)
9.条件运算符(描述MUX)
assign out = sel ? a : b;
10.bit位 使用[]选择,{}拼接
注:a[0 +: 8] //从0bit 开始取8bit,等价于a[7 : 0]
11.算术运算符: + , -, * , < , > , <= , >= , / , %

wire [13:0] a0,a1,a2;
wire [13:0] b0,b1,b2,div;
wire [15:0] sum;
wire [14:0] sub;
wire [27:0] mul;
wire        big,less;

assign sum = a0 + a1 + b0;
assign sub = a0 - a1;//sub最大为a0本身,a0最大为2^13-1,最小为负的2^13-1,因此sub定义为15bit,最高位为符号位
assign mul = a2 * b2;
assign div = b1 / a1;
assign big = (a0 > b0) ? 1'b1 : 1'b0;
assign less = (a0 < b0) ? 1'b1 : 1'b0;

仔细定义位宽,确保结果不溢出。通常两个数相加,扩1bit。/ 与%慎用,逻辑资源消耗较大,delay也比较大。
12.4to1MUX

module 4to1MUX (
dout,
din,
sel);
input wire [3:0] din;
input wire [1:0] sel;
output reg dout;

always @(*)begin
	case (sel)
	2'b00:dout = din[0];
	2'b01:dout = din[1];
	2'b10:dout = din[2];
	default: dout = din[3];	
	endcase
end
endmodule

13.有符号数符号位扩展

wire [15:0] a,b; //signed number
assign out0 = {a[15],a} - {b[15],b};
assign out1 = a - b;//工具自动扩展0,遇到负数会出错
  • 7
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值