0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

always组合逻辑块的讲解和译码器的实现

冬至子 来源:小小研究生 作者:xxyjs2020 2023-05-22 15:13 次阅读

always 语句

always 语句是重复执行的。always 语句块从 0 时刻开始执行其中的行为语句;当执行完最后一条语句后,便再次执行语句块中的第一条语句,如此循环反复。多用于 仿真时钟的产生信号行为的检测等。

always语句的格式:

always @(posedge clk) begin
    temp    = a ;
    a       = b ;
    b       = temp ;
end

()中可以是*,表示:每当任何输入发生变化时执行begin和end之间的语句。也可以是posedge clk,表示:时钟上升沿时执行begin和end之间的语句。assign语句和always @(*)创建相同的组合逻辑,比如下面代码中的两个输出波形是一致的。

module top_module(
    input a, 
    input b,
    output wire out_assign,
    output reg out_alwaysblock
);
assign out_assign=a&b;
    always @(*) begin
       out_alwaysblock=a&b; 
    end
endmodule

连续性赋值,过程性赋值 :连续性赋值总是处于激活状态,任何操作数的改变都会影响表达式的结果;过程赋值只有在语句执行的时候,才会起作用。

阻塞赋值与非阻塞赋值 :是过程赋值的两种类型。

阻塞赋值 :阻塞赋值属于顺序执行,下一条语句执行前,当前语句一定会执行完毕。使用等号 = 作为赋值符。initial语句用阻塞赋值。

非阻塞赋值 :并行执行,即下一条语句的执行和当前语句的执行是同时进行的,它不会阻塞位于同一个语句块中后面语句的执行。使用 <= 作为赋值符。

使用非阻塞赋值是为了 避免竞争冒险 ,那么实际使用中只需要记住:always 时序逻辑****块中多用非阻塞赋值<=(后面的时序逻辑电路会另外介绍),always 组合逻辑块中多用阻塞赋值=;在仿真电路时,initial 块中一般多用阻塞赋值=。例如下面代码中,用assign语句,always组合语句,always时钟语句实现异或:

module top_module(
    input clk,
    input a,
    input b,
    output wire out_assign,
    output reg out_always_comb,
    output reg out_always_ff   );
assign out_assign=a^b;
    always @(*) begin
       out_always_comb=a^b; 
    end
    always @(posedge clk) begin
       out_always_ff<=a^b; 
    end
endmodule

if 语句格式

if (condition1)       true_statement1 ;
else if (condition2)        true_statement2 ;
else if (condition3)        true_statement3 ;
else                      default_statement ;

如果只有两种情况,就只有if和else。下面用上一节中MUX2_1做练习,上一节中采用了assign的三元运算符语句,这里使用always if语句实现2选1的功能:

module mux2_1 
(
input wire in1, 
input wire in2, 
input wire sel, 
output reg out 
 ); 
 
 always@(*) begin
 if(sel == 1'b1)//当“if...else...”中只有一个变量时不需要加“begin...end".但是为了不遗漏,还是加上
 out = in1; //always块中的组合逻辑关系时使用阻塞赋值“=”进行赋值
 else
 out = in2;
 end
 endmodule

3-8译码器的实现

从真值表看译码器功能:A2A1A0=000-111共8种输入,对应输出Y的下标,对应下标的输出为1(高电平),其他输出为0(低电平)。3-8译码器的作用:按照之前点亮LED灯的思路,如果一个I/O端口控制一个LED灯,那么I/O端口很有可能不够用,这时候聪明人就想出用3-8译码器的方式,3个I/O口就可以控制8个LED。

图片

设计规划

这个示例中,绘制波形图如图所示。

图片

图片

编写代码

module decoder3_8
(
input wire in1 , 
input wire in2 , 
input wire in3 , 
output reg [7:0] out 
);


 always@(*) begin
 //使用"{}"位拼接符将31bit数据按照顺序拼成一个3bit数据
 if({in1, in2, in3} == 3'b000)
 out = 8'b0000_0001;
 else if({in1, in2, in3} == 3'b001)
 out = 8'b0000_0010;
 else if({in1, in2, in3} == 3'b010)
 out = 8'b0000_0100;
 else if({in1, in2, in3} == 3'b011)
 out = 8'b0000_1000;
 else if({in1, in2, in3} == 3'b100)
 out = 8'b0001_0000;
 else if({in1, in2, in3} == 3'b101)
 out = 8'b0010_0000;
 else if({in1, in2, in3} == 3'b110)
 out = 8'b0100_0000;
 else if({in1, in2, in3} == 3'b111)
 out = 8'b1000_0000;
 else
 out = 8'b0000_0001;
end
 endmodule

代码中使用always组合逻辑块。由于if对应的执行语句只有一句,可以不使用begin,end但是由于怕以后复杂代码会遗漏,还是选择加上。always组合逻辑使用阻塞语句,用=进行赋值。

上面RTL代码综合出的RTL视图:

图片

编写testbench

`timescale 1ns/1ns
module tb_decoder3_8();


//reg define
reg in1;
reg in2;
reg in3;
wire [7:0] out;


 //初始化输入信号
 initial begin
 in1 <= 1'b0;
 in2 <= 1'b0;
 in3 <= 1'b0;
 end


 always #10 in1 <= {$random} % 2;
 always #10 in2 <= {$random} % 2;
 always #10 in3 <= {$random} % 2;
 //-------------decoder3_8_inst----------------
 decoder3_8 decoder3_8_ins
 (
 .in1(in1), 
 .in2(in2), 
 .in3(in3), 
 .out(out) 
 );


 endmodule

经过两个实例后,testbench已经超级熟悉了吧。

对比波形

看看波型:

图片

验证了波形的正确性。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • FPGA设计
    +关注

    关注

    9

    文章

    425

    浏览量

    26273
  • led灯
    +关注

    关注

    22

    文章

    1554

    浏览量

    107034
  • 译码器
    +关注

    关注

    4

    文章

    310

    浏览量

    49914
  • 仿真电路
    +关注

    关注

    5

    文章

    82

    浏览量

    33027
收藏 人收藏

    评论

    相关推荐

    [3.1.1]--译码器实现组合逻辑

    译码器
    学习电子知识
    发布于 :2022年12月13日 19:39:01

    组合逻辑3-8译码器的设计及实验

    组合逻辑3-8译码器的设计及实验  说明:本书将以实验一为例详细介绍Altera公司MaxplusII 10.1版本软件的基本应用,其它实验将不再赘述。读者在通过本实验后将对
    发表于 10-09 18:22

    FPGA基础学习笔记--组合逻辑电路-编码译码器

    `FPGA基础学习笔记--组合逻辑电路-编码译码器编码4输入2输出编码代码如下modul
    发表于 02-20 15:36

    设计一个虚拟3-8译码器实现138译码器的功能

    设计一个虚拟3-8译码器实现138译码器的功能
    发表于 05-15 15:16

    第二章_组合逻辑电路之译码器

    本帖最后由 芯航线跑堂 于 2016-12-23 21:02 编辑 组合逻辑电路设计之译码器课程目标: 1. 再次熟悉Quartus II工程的建立以及完整的FPGA开发流程 2. 以
    发表于 12-20 18:45

    第二章 组合逻辑电路之译码器

    组合逻辑电路设计之译码器课程目标: 1. 再次熟悉Quartus II工程的建立以及完整的FPGA开发流程 2. 以译码器为例学会简单组合
    发表于 12-20 18:54

    编码译码器(数电实验报告)精选资料分享

    编码译码器一、 实验目的掌握用逻辑实现编码的方法掌握中规模集成电路编码
    发表于 07-30 07:41

    如何利用译码器进行组合逻辑电路的设计呢

    集成电路编码译码器的工作原理即逻辑功能是什么?如何利用逻辑门去实现一种集成电路编码呢?如何
    发表于 11-03 06:55

    译码器定义

    译码器1. 译码器定义译码器是一种用以检测输入位(码)的特定组合是否存在,并以特定的输出电平来指示这种特定码的存在的数字电路。——《数字电子技术基础系统方法》
    发表于 12-07 09:37

    138译码器怎么用

    138译码器的设置目的是为了实现IO复用,单片机上IO资源紧张,挂载的外设较多,为了解决这一矛盾,引入了138译码器单个138译码器能够利用3个IO
    发表于 01-12 07:25

    译码器,译码器是什么意思

    译码器,译码器是什么意思 译码器组合逻辑电路的一个重要的器件,其可以分为:变量译码和显示
    发表于 03-08 16:32 5388次阅读

    译码器逻辑功能_译码器的作用及工作原理

    本文首先介绍了译码器的定义与译码器的分类,其次介绍了译码器的作用和译码器的工作原理,最后介绍了译码器
    发表于 02-08 14:04 10.9w次阅读
    <b class='flag-5'>译码器</b>的<b class='flag-5'>逻辑</b>功能_<b class='flag-5'>译码器</b>的作用及工作原理

    集成译码器逻辑功能和使用方法

    译码器是一个多输入、多输出的组合逻辑电路。它的作用是把给定的代码进行“翻译”,变成相应的状态,使输出通道中相应的一路有信号输出。译码器在数字系统中有广泛的用途,不仅用于代码的转换、终端
    的头像 发表于 04-26 14:34 3382次阅读
    集成<b class='flag-5'>译码器</b>的<b class='flag-5'>逻辑</b>功能和使用方法

    组合逻辑电路中的译码器介绍

    译码器定义 逻辑功能:将每个输入的二进制代码对应输出为高、低电平信号。 译码是编码的反操作。
    的头像 发表于 04-30 16:19 1417次阅读
    <b class='flag-5'>组合</b><b class='flag-5'>逻辑</b>电路中的<b class='flag-5'>译码器</b>介绍

    FPGA设计:always组合逻辑块的讲解译码器实现

    always 语句是重复执行的。always 语句块从 0 时刻开始执行其中的行为语句;当执行完最后一条语句后,便再次执行语句块中的第一条语句,如此循环反复。多用于仿真时钟的产生,信号行为的检测等。
    的头像 发表于 05-12 14:42 2527次阅读
    FPGA设计:<b class='flag-5'>always</b><b class='flag-5'>组合</b><b class='flag-5'>逻辑</b>块的<b class='flag-5'>讲解</b>和<b class='flag-5'>译码器</b>的<b class='flag-5'>实现</b>