【5】基础语法篇 - VL5 位拆分与运算

news2024/11/15 17:41:07

VL5 位拆分与运算

1 自己犯的错误

(1)语法错误

在begin end块 后面加了" ; "

 case(sel)
            2'b00: begin validout<=0; out<=0; end;
            2'b01: begin validout<=1; out<=d0 + d1; end;
            2'b10: begin validout<=1; out<=d0 + d2; end;
            2'b11: begin validout<=1; out<=d0 + d3; end;
        endcase

(2)题目描述 与 所给代码框架不符

题干要求输出为 reg

在这里插入图片描述

但是平台给出的输出为wire
module data_cal(
	input clk,
	input rst,
	input [15:0]d,
	input [1:0]sel,
	
	output [4:0]out,
	output validout
);
我按照题目要求写的代码,编译有错,提醒【validout不是data_cal中的有效值】
`timescale 1ns/1ns

module data_cal(
input clk,
input rst,
input [15:0]d,
input [1:0]sel,

output [4:0]out,
output validout
);
//*************code***********//

wire [7:0] load_d = (sel==0) ? d : load_d;

wire d0 = load_d[3:0];
wire d1 = load_d[7:4];
wire d2 = load_d[11:8];
wire d3 = load_d[15:12];


always@(posedge clk , negedge rst) begin
    if(rst==0)begin
        validout<=0;
        out<=0;
    end else begin
        case(sel)
            2'b00: begin validout<=0; out<=0; end
            2'b01: begin validout<=1; out<=d0 + d1; end
            2'b10: begin validout<=1; out<=d0 + d2; end
            2'b11: begin validout<=1; out<=d0 + d3; end
        endcase
    end
end

//*************code***********//
endmodule

提醒错误如下:
在这里插入图片描述

我擅自更改平台所给输出信号类型,可以得到仿真结果,但是【压根不对】

可以看到 标准的out值都变成了全0,就是说紊乱了
【结论】输出的数据类型,以平台所给的模块代码框架中声明的类型为准。
在这里插入图片描述

(4)在错误中摸索

思路:使用纯组合逻辑

摸索1:使用case语句
代码
`timescale 1ns/1ns

module data_cal(
input clk,
input rst,
input [15:0]d,
input [1:0]sel,

output [4:0]out,
output validout
);
//*************code***********//

wire [7:0] load_d = (sel==0) ? d : load_d;

wire d0 = load_d[3:0];
wire d1 = load_d[7:4];
wire d2 = load_d[11:8];
wire d3 = load_d[15:12];

assign validout = (sel==0) ? 0 : 1;

always@(sel) begin
    case(sel)
        2'b00: out=d0; 
        2'b01: out=d0 + d1; 
        2'b10: out=d0 + d2; 
        2'b11: out=d0 + d3;
    endcase
end
//*************code***********//
endmodule
提示错误:out在data_cal中不是有效的值

在这里插入图片描述

最后这个提示错误的原因是【被赋值的信号都应该是reg型】
解决:使用一个reg型的中间变量,而wire型输出直接取自这个reg值即可

代码如下

reg [4:0] inner_out=0;
assign out = inner_out;
always@(sel) begin
    case(sel)
        2'b00: inner_out = d0; 
        2'b01: inner_out =d0 + d1; 
        2'b10: inner_out =d0 + d2; 
        2'b11: inner_out =d0 + d3;
    endcase
end
摸索2:使用三目运算符
代码
`timescale 1ns/1ns

module data_cal(
input clk,
input rst,
input [15:0]d,
input [1:0]sel,

output [4:0]out,
output validout
);
//*************code***********//

wire [7:0] load_d = (sel==0) ? d : load_d;

wire d0 = load_d[3:0];
wire d1 = load_d[7:4];
wire d2 = load_d[11:8];
wire d3 = load_d[15:12];

assign validout = (sel==0) ? 0 : 1;

assign out = (sel==2'b00) ? d0 :
             (sel==2'b01) ? (d0 + d1) :
             (sel==2'b10) ? (d0 + d2) :
             (sel==2'b11) ? (d0 + d3) ;

//*************code***********//
endmodule
提示错误:语法错误

在这里插入图片描述

(3)还有俩本质错误

所以上面的错误可能都不是错误

①错误1:我声明的内部数据位数有误

wire  d0 = load_d[3:0];
wire  d1 = load_d[7:4];
wire  d2 = load_d[11:8];
wire  d3 = load_d[15:12];

②错误2:我TestBench中未对sel输入信号做设置

initial fork
    sel=0;
    #13 sel=1;
    #20 sel=2;
    #30 sel=3;
  join

(4)又发现本质错误:模块框图中的clk和rst关键信号没用到

有这俩关键信号在,说明模块内部还是需要时序逻辑的。而我使用了纯纯的组合逻辑,所以必然是一直都是错误的
这也解释了为啥我的放着结果一直是高阻态【因为我没有用clk把组合逻辑每步计算的结果隔离开】
【解决】内部逻辑需要使用时序逻辑,而使用组合逻辑来满足输出。
【教训】真就是很奇怪的考察点,但也怪自己粗心。

(5)好吧,又一个原则性错误

我把输入信号的位数搞错了。显然这个输入d的位数是16位的,而我将其赋值给了8位的数,所以出现了特别奇怪的仿真结果

代码
module data_cal(
input clk,
input rst,
input [15:0]d,
input [1:0]sel,

output [4:0]out,
output validout
);
//*************code***********//

wire [7:0] load_d = (sel==0) ? d : load_d;
仿真结果

正确啦

1 题目 + 代码 + TestBench

代码

`timescale 1ns/1ns

module data_cal(
input clk,
input rst,
input [15:0]d,
input [1:0]sel,

output [4:0]out,
output validout
);
//*************code***********//

wire [15:0] load_d = (sel==0) ? d : load_d;
// reg [4:0] inner_out=0;

wire [3:0] d0 = load_d[3:0];
wire [3:0] d1 = load_d[7:4];
wire [3:0] d2 = load_d[11:8];
wire [3:0] d3 = load_d[15:12];

reg flag;
reg [4:0] inner_out=0;

assign validout = flag;
assign out = inner_out;

// always@(sel) begin
//     case(sel)
//         2'b00: inner_out = d0; 
//         2'b01: inner_out =d0 + d1; 
//         2'b10: inner_out =d0 + d2; 
//         2'b11: inner_out =d0 + d3;
//     endcase
// end

// assign out = (sel==2'b00) ? d0 :
//              (sel==2'b01) ? (d0 + d1) :
//              (sel==2'b10) ? (d0 + d2) :
//              (sel==2'b11) ? (d0 + d3) ;

// assign out = (sel==2'b00) ? d0 : d1;

always@(posedge clk , negedge rst) begin
    if(rst==0) begin
        flag<=0;
        inner_out<=0;
    end else begin
        case(sel)
            2'b00: begin flag<=0; inner_out<=0; end
            2'b01: begin flag<=1; inner_out<=d0 + d1; end
            2'b10: begin flag<=1; inner_out<=d0 + d2; end
            2'b11: begin flag<=1; inner_out<=d0 + d3; end
        endcase
    end

end

//*************code***********//
endmodule

TestBench



`timescale 1ns/1ns



module testbench();
	reg clk=0;
	initial 
    repeat(100) #1 clk = ~clk;  // Create clock with period=10
// A testbench
    
  reg rst;
  reg [1:0] sel;
  reg [15:0] d;

  wire validout;
  wire [4:0] out;
    
  data_cal u_data_cal(clk,rst,d,sel,out,validout);
  
  initial begin
    rst =0;
    #5 rst=1;
  end

  initial fork
    #10 d=16'b10000_10000_100001;
    #20 d=16'b10000_10000_100011;
  join

  initial fork
    sel=0;
    #13 sel=1;
    #20 sel=2;
    #30 sel=3;
  join
    
//end    
  initial begin
    $dumpfile("out.vcd");
    // This will dump all signal, which may not be useful
    //$dumpvars;
    // dumping only this module
    //$dumpvars(1, testbench);
    // dumping only these variable
    // the first number (level) is actually useless
    $dumpvars(0, testbench);
end  
    
endmodule

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/400849.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

分享几个常用的运维 shell 脚本

今天咸鱼给大家分享几个不错的 Linux 运维脚本&#xff0c;这些脚本中大量使用了 Linux 的文本三剑客&#xff1a; awkgrepsed 建议大家这三个工具都要了解并最好能够较为熟练的使用 根据 PID 显示进程所有信息 根据用户输入的PID&#xff0c;过滤出该PID所有的信息 #! /b…

MySQL(三)SQL优化

SQL优化插入数据大批量数据插入主键优化order by优化group by优化limit优化count优化update优化插入数据 需要一次性往数据库表中插入多条记录&#xff0c;可以从以下三个方面进行优化 insert into tb_test values(1,tom); insert into tb_test values(2,cat); insert into t…

Salesforce 2023财年逆风增长,现金流达历史最高!

在过去的一年里&#xff0c;Salesforce一直是华尔街最关注的公司之一。3月1日&#xff0c;CRM领域的全球领导者Salesforce公布了截至2023年1月31日的第四季度和整个财年的业绩。 Salesforce主席兼首席执行官Marc Benioff表示&#xff1a; Salesforce全年实现了314亿美元的收入…

【备战面试】每日10道面试题打卡-Day6

本篇总结的是计算机网络知识相关的面试题&#xff0c;后续也会更新其他相关内容 文章目录1、HTTP 与 HTTPS 有哪些区别&#xff1f;2、HTTPS的加密过程是什么&#xff1f;3、GET与POST有什么区别&#xff1f;4、讲讲HTTP各个版本的区别&#xff1f;5、HTTP与FTP的区别&#xff…

【C++、C++11】可变参数模板、lambda表达式、包装器

文章目录&#x1f4d6; 前言1. 可变参数模板1.1 万能模板&#xff1a;1.2 完美转发&#xff1a;1.3 可变参数模板的使用&#xff1a;1.4 emplace_back&#xff1a;2. lambda表达式2.1 lambda表达式的定义&#xff1a;2.2 lambda表达式的用法&#xff1a;2.2 - 1 捕捉列表的用法…

manacher算法详解

例题 求一个字符串的最长回文子串的长度 O(N2)O(N^2)O(N2)的解法很容易想&#xff0c;就是从每个字符位置向左右同时拓展&#xff0c;然后检查当前是不是回文&#xff0c;更新长度&#xff0c;可以简单写一下代码 int solve(string &ss){int ans 0;int n ss.length();s…

从参数数量视角理解深度学习神经网络算法 DNN, CNN, RNN, LSTM 以python为工具

从参数数量视角理解深度学习神经网络算法 DNN, CNN, RNN, LSTM 以python为工具 文章目录1. 神经网络数据预处理1.1 常规预测情景1.2 文本预测场景2.全连接神经网络 DNN3.卷积神经网络CNN4.循环神经网络 RNN5.长短期记忆神经网络 LSTMʚʕ̯•͡˔•̯᷅ʔɞʚʕ̯•͡˔•̯᷅ʔ…

【数据结构】详解空间复杂度

Yan英杰的博客 悟已往之不谏 知来者之可追 目录 空间复杂度 ​案例1:计算BubbleSort的空间复杂度&#xff1f; 案例2:计算斐波那契额数列的前N项的空间复杂度 案例3:计算阶乘递归Fac的空间复杂度&#xff1f; 案例4:F1和F2两函数是否使用的同一块空间 案例5:计算该…

git团队合作 - branch分支的使用、主分支合并、冲突处理方案

情景例子开发部3人&#xff0c;组长man&#xff0c; 组员devA&#xff0c;devB&#xff1b;1&#xff09;组长man负责代码合并、冲突处理、检查代码、合并代码到master主分支&#xff1b;2&#xff09;组员devA负责开发3&#xff09;组员devB负责开发git仓库主次分支安排1&…

windows下qt creator 配置编译环境gcc,g++,gdb,cmake

MSVC&#xff1a;即Microsoft Visual C Compiler&#xff0c;即微软自己的编译器 MinGW&#xff1a;我们都知道GNU在Linux下面鼎鼎大名的gcc/g&#xff0c;MinGW则是指Minimalist GNU for Windows的缩写 这里我们选择MinGW&#xff0c;至于Qt中&#xff0c;这两种模式的区别&…

Python入门自学进阶-Web框架——34、富文本编辑器KindEditor、爬虫初步

KindEditor是一个轻量级的富文本编辑器&#xff0c;应用于浏览器客户端。一、首先是下载&#xff1a;http://kindeditor.net/down.php&#xff0c;如下图下载后是解压缩后&#xff1a;红框选中的都可以删除到&#xff0c;这些主要是针对不同的语言编写的示例&#xff0c;因为我…

一文教会你如何简单使用Fegin进行远程服务调用

文章目录1、fegin的基本介绍2、fegin的基本使用步骤3、项目中的实际运用4、测试前言在分布式微服务中&#xff0c;少不了会进行不同服务之间的相互调用&#xff0c;比如A服务要调用B服务中的接口&#xff0c;如何简单方便的实现呢&#xff1f;fegin可以来帮助。 1、fegin的基本…

如何禁止删除或修改RAR压缩包里的文件?很多人不知道这个功能

你是否有过这样的需求&#xff1f;把文件压缩成RAR格式后&#xff0c;需要对压缩包里的文件进行保护&#xff0c;以防别人或者自己误删文件&#xff0c;或者不小心修改了文件内容。 有些小伙伴可能会给压缩包里的文件都设置上“限制编辑”&#xff0c;这虽然也能防止随意更改内…

Stable Diffusion 个人推荐的各种模型及设置参数、扩展应用等合集(不断更新中)

一、说明 | 表示或者 表示 以上 二、模型 适用风景、房子、车子等漫画类风格 模型的VAE不要用模型附带的&#xff0c;好像就是naifu的官方vae&#xff0c;很老了&#xff0c;用 vae-ft-mse-840000-ema-pruned.ckpt 或者是 kl-f8-anime2.ckpt&#xff1b; 嵌入模型要下载作者…

免费集装箱箱号识别API,人工智能企业CIMCAI集装箱识别检测人工智能平台全球4千企业用户,支持API集成二次开发人工智能企业

免费集装箱箱号识别API&#xff0c;人工智能企业CIMCAI集装箱识别检测人工智能平台全球4千企业用户&#xff0c;支持API集成二次开发。箱信息识别及铅封号识别功能免费&#xff0c;顶尖AI集装箱识别率99.98%&#xff0c;全球No.1集装箱人工智能企业CIMCAI打造。中国上海人工智能…

chrome如何查看和修改除了密码,付款方式,地址意外的自动填充表单内容

这种自动填写的内容似乎无法设置。 软件地址&#xff1a;https://sqlitebrowser.org/dl/ 去这里查看地址 https://chromium.googlesource.com/chromium/src//master/docs/user_data_dir.md 比如我是windows&#xff0c;则地址为&#xff1a;C:\Users\用户名\AppData\Local\Go…

【Java】SpringBoot中实现异步编程

前言 首先我们来看看在Spring中为什么要使用异步编程&#xff0c;它能解决什么问题&#xff1f; 什么是异步&#xff1f; 首先我们先来看看一个同步的用户注册例子&#xff0c;流程如下&#xff1a; 异步的方式如下&#xff1a; 在用户注册后将成功结果返回&#xff0c;…

java:UUID和雪花生成算法

目录 UUID生成不重复命名方法 在实际项目中的运用 UUID算法的缺点 什么是雪花算法&#xff1f; UUID生成不重复命名方法 我们在做项目的时候可能需要用到全局唯一ID的场景&#xff0c;这种时候为了防止ID冲突可以使用36位的UUID UUID可以自动生成唯一的id。是java.util中自…

面朝大海,春暖花开丨2023年Kaadas凯迪仕全国经销商大会成功召开

3月8日&#xff0c;We——2023年Kaadas凯迪仕全国经销商大会将在中国青岛星光岛会议中心隆重举行&#xff0c;盛会汇聚了超过1000名优秀合作伙伴&#xff0c;规模空前。Kaadas凯迪仕品牌创始人&集团总裁苏志勇先生、集团董事长苏祺云先生以及各高层领导均莅临现场。 大会伊…

万字长文:Stable Diffusion 保姆级教程

万字长文&#xff1a;Stable Diffusion 保姆级教程 2022年绝对是人工智能爆发的元年&#xff0c;前有 stability.ai 开源 Stable Diffusion 模型&#xff0c;后有 Open AI 发布 ChatGPT&#xff0c;二者都是里程碑式的节点事件&#xff0c;其重要性不亚于当年苹果发布iPhone&a…