Xilinx Spartan6-XC6SLX16-22FTG256(2022.3.31)

注意:朋友们,本日类容衔接Xilinx Spartan6-XC6SLX16-22FTG256(2022.3.30)日内容

重点掌握

1、always 语句块描述时序逻辑的用法 ;

2、<=(赋值号的一种,阻塞赋值,在可综合的模块中表达时序逻辑的语句时使用)。

目录

1、顶层设计

2、半加器0

3、半加器1

4、ucf文件

5、项目截图

二、D触发器和阻塞值与非阻塞值理论

1、同步复位的 D 触发器

2、异步复位的 D 触发器

 3、阻塞赋值与非阻塞赋值概念

三、计数器


一、全加器功能

1、顶层设计

`timescale 1ns / 1ps
module led_test(
	input   wire      key1, 
	input   wire  	  key2,  
	input   wire      key3,
	output  reg[3:0]  sum
);
//assign led=key1+key2+key3+key4;

wire [1:0] sum1;
wire [3:0] sum2;

half_adder0 inst0//实例化1
(
		.key1(key1),
		.key2(key2),
		.sum1(sum1)
);
half_adder1 inst1//实例化2
(
		.key3(key3),
		.key4(sum1),
		.sum2(sum2)
);

always@(*)
begin
	sum<=sum2;//最终结果
end
endmodule


2、半加器0

`timescale 1ns / 1ps
module half_adder0(
	input   wire  		key1, 
	input   wire  		key2,  
	output  reg[1:0]  sum1
);
//assign sum1=key1+key2;
always@(*)
	begin
		sum1<=key1+key2;
	end
endmodule

3、半加器1


`timescale 1ns / 1ps
module half_adder1(
    input   wire   			  key3, 
    input   wire  [1:0]      key4,  
    output  reg   [3:0]      sum2
);
//assign led=key1+key2+key3+key4;

always@(*)
    begin
        sum2<=key3+key4;
    end
endmodule

4、ucf文件

NET sum<0>              LOC = P4 | IOSTANDARD = "LVCMOS33";       ## LED1
NET sum<1>              LOC = N5 | IOSTANDARD = "LVCMOS33";       ## LED2
NET sum<2>              LOC = P5 | IOSTANDARD = "LVCMOS33";       ## LED3
NET sum<3>              LOC = M6 | IOSTANDARD = "LVCMOS33";       ## LED4

NET key1                LOC = C3 | IOSTANDARD = "LVCMOS33";       ## KEY1
NET key2                LOC = D3 | IOSTANDARD = "LVCMOS33";       ## KEY2
NET key3                LOC = E4 | IOSTANDARD = "LVCMOS33";       ## KEY3

5、项目截图

 

 

 顶层模块

子模块

 

、D触发器和阻塞值与非阻塞值理论

1、同步复位的 D 触发器

`timescale 1ns / 1ps

module led_clk(
input wire clk,
input wire rst_n,
input wire key,
output reg led
);

always@(posedge clk)
	if(rst_n==1'b0)
		led<=1'b0;
	else
		led<=key;
endmodule

 

2异步复位的 D 触发器

`timescale 1ns / 1ps

module led_clk(
input wire clk,
input wire rst_n,
input wire key,
output reg led
);
/*
always@(posedge clk)//同步复位清零
    if(rst_n==1'b0)
        led<=1'b0;
    else
        led<=key;
*/        
always@(posedge clk or negedge rst_n)//异步复位清零
    if(rst_n==1'b0)
        led<=1'b0;
    else
        led<=key;   
endmodule

 3阻塞赋值与非阻塞赋值概念

阻塞赋值的赋值号用“=”表示。为什么称这种赋值方式为阻塞赋值呢?因为对应的 电路结构往往与触发沿没有关系,只与输入电平的变化有关系。阻塞赋值的操作可以认为 是只有一个步骤的操作,即计算赋值号右边的语句并更新赋值号左边的语句,此时不允许 有来自任何其他 Verilog 语句的干扰,直到现行的赋值完成时刻,即把当前赋值号右边的值 赋值给左边的时刻完成后,它才允许下一条的赋值语句的执行。串行块(begin-end)中的 各条阻塞型过程赋值语句将以它们在顺序块后的排列次序依次执行。阻塞型过程赋值语句 的执行过程是:首先计算赋值号右边的值,然后立即将计算结果赋值给左边,赋值语句结 束,变量值立即发生改变。阻塞的概念是指在同一个 always 块中,其后面的赋值语句从概 念上是在前一句赋值语句结束后再开始下面的赋值。

非阻塞赋值的赋值号用“<=”表示。为什么称这种赋值方式为非阻塞赋值呢?这是因 为对应的电路结构往往与触发沿有关系,只有在触发沿的时刻才能进行非阻塞赋值。非阻 塞操作开始时计算非阻塞赋值符的赋值号右边的语句,赋值操作结束时刻才更新赋值号左 边的语句,可以认为是两个步骤(赋值开始时刻和结束时刻)来完成非阻塞赋值。在计算 非阻塞语句赋值号右边的语句和更新赋值号左边的语句期间,其他的 Verilog 语句包括其他 的 Verilog 非阻塞赋值语句都能同时计算赋值号右边的语句和更新赋值号左边的语句,允许 其他的 Verilog 语句同时进行操作。非阻塞赋值的操作可以看作为两个步骤的过程:在赋值 开始时刻,计算赋值号右边的语句。在赋值结束时刻,更新赋值号左边的语句。注意:非 阻塞操作只能用于对寄存器类型变量进行赋值,因此只能用于“initial”和“always”块 中,不允许用于连续赋值“assign”

阻塞赋值(=):该语句结束时就完成赋值操作,前面的语句没有完成前,后面的语 句是不能执行的。在一个过程块内多个阻塞赋值语句是顺序执行的。 非阻塞赋值(<=):一条非阻塞赋值语句的执行是不会阻塞下一条语句的执行,也就 是说在本条非阻塞赋值语句执行完毕前,下一条语句也可开始执行。非阻塞赋值语句在过 程块结束时才完成赋值操作。在一个过程块内的多个非阻塞赋值语句是并行执行的。 最后我们总结在编写 RTL 代码时推荐的一些规范,详细如下: (1)在编写时序逻辑的代码时采用非阻塞赋值的方式 计算赋值号右手边的信号时,所有的变量值均是触发沿到来前的值,更新的赋值号左 手边的信号作为触发沿后的值,并且保持到下一个触发沿到来时候,等待更新。这样,就 可以使得在同一个块中非阻塞赋值语句不必要求出现的顺序,都是在全部进行赋值号右手 边的信号计算后同时更新赋值号左手边的信号的值。非阻塞赋值可以简单的认为是赋予下 一状态的值。 (2)使用 always 块来编写组合逻辑的代码时要用阻塞赋值的方式 使用 always 块建立组合逻辑电路模型时不要忘记 always 块中的敏感列表一定要使用电 平触发的方式,然后在 always 块中使用阻塞赋值语句就可以实现组合逻辑,这样做既简单 且方针又快又好,这样的风格是值得推荐的。 (3)在同一个 always 块中不要既要用非阻塞赋值又用阻塞方式赋值 在同一个 always 块中对同一个变量既进行阻塞赋值又进行非阻塞赋值会产生综合不可 预测的结果,不是可综合的 Verilog 风格。 (4)虽然锁存器电路建模是我们不推荐的,但是如果使用到要采用非阻塞赋值的方 式。 使用非阻塞赋值实现时序逻辑,实现锁存器是最为安全的。 (5)一个 always 块只一个变量进行赋值 因为 always 块是并行的,执行的顺序是随机的,综合时会报多驱动的错误,所以严禁 在多个 always 块中对同一个变量赋值;当然也不推荐一个 always 对多个变量进行赋值,虽 然这种方式是允许的,但如果过多会导致代码的混乱且不易后期的维护和修改(本例之所 以写在一起时因为变量不多,其次是为了进行对比得出本章的实验效果),不是本教程推 荐的设计方法。

三、计数器

计数器功能中值得注意的是利用计数器实现精确延时,利用利用50MHz晶振实现500ms的延时就需要至少25位的计数器,没计数一次延时20ns,计数25000000次延时500ms。

`timescale 1ns / 1ps

module counter_led(
	input wire clk,
	input wire rst_n,
	output reg led
);
reg [24:0] counter;


always@(posedge clk or negedge rst_n) 
	if(!rst_n)
		counter<=25'b0;
	else 
	if(counter==25'd24_999_999)//50MHz晶振延时500ms   25*10^6*20ns=500ms
		counter<=25'b0;
	else
		counter<=counter+1'b1;
		
always@(posedge clk or negedge rst_n) 
	begin
	if(!rst_n)
			led<=1'b0;
	else 
	if(counter==25'd24_999_999)
			led<=~led;
   end
endmodule

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jy_jiangyan

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值