求职攻略| 如何用Verilog实现串转并电路

有奖调查:达尔闻即将要推出一套TI的权威电源培训系列课程,线上培训+线下EVM实操。在此之前,我们设定了一些问题,希望了解大家的需求,我们会送出一些精美礼品。
今天继续为大家解析艾为电子数字IC设计岗剩下的笔试题。
4、程序改错题(10分)
//-----------------------------
01moduletest(
02inputclk,
03input[7:0]addr,
04inputreq,
05inputrst_n,
06inputwen,
07input[15:0]wdata,
08output[15:0]datao,
09)
10
11reg[15:0]mem[7:0];
12
13always@(posedgeclkornegedgerst_n)begin
14if(rst_n)begin
15mem=0;
16elseif(wen)begin
17mem[addr]=wdata;
18
19
20always@(req)
21if(req)
22datao=mem[addr];
23
24module
//----------------------------
解析:本题主要考察了对Verilog语法规范的敏感性。这种题目在没有编译器的情况下,纯靠观察来找语法问题,需要对Verilog代码有一定的敏感度才能够找全。如果是一个新手或者写代码不多的人想在短时间内全部把错误都找出来还是有些困难的。根据分值设置和代码量可以初步预判大概有不少于5个的错误。错误如下所示:
1)第08行的结尾,不能有“,”
2)第09行的结尾,应该有“;”
3)第16行的“begin”没有与之匹配的“”
4)第15行二维数组在赋初值时不能直接分配给数组整体初值,只能分配给单个元素初值,也可以使用initial读取初始化文件中的初始化值
5)datao信号在always块中被赋值,所以第08行应该把datao信号定义为reg型变量,缺省情况下默认为wire型变量
另外还有两处不严谨的地方,这种不严谨的问题虽然在本次设计中不会出现问题,但是并不推荐这种写法,具有潜在的危险:
1)第一个表达时序逻辑的always块应该推荐使用“=”赋值方式,第二个表达组合逻辑的always块应该推荐使用“=”赋值方式
2)第20行always块中的敏感列表不全,推荐使用通配符“*”
还有一处需要注意的地方:在表达组合逻辑的第二个always块中的“if”没有对应的“else”,这虽然不能算是错误,但产生latch时一定要是设计者已知的。
修改完毕后的代码如下所示:
//------------------------------
01moduletest(
02inputclk,
03input[7:0]addr,
04inputreq,
05inputrst_n,
06inputwen,
07input[15:0]wdata,
08outputreg[15:0]datao
09);
10
11reg[15:0]mem[7:0];
12
13always@(posedgeclkornegedgerst_n)begin
14if(rst_n)begin
15mem[addr]=15'd0;
16elseif(wen)begin
17mem[addr]=wdata;
18
19
20
21always@(*)
22if(req)
23datao=mem[addr];
24else
25datao=15'd0;
26
27module
//---------------------------------
嵌入式物联网需要学的东西真的非常多,千万不要学错了路线和内容,导致工资要不上去!
无偿分享大家一个资料包,差不多150多G。里面学习内容、面经、项目都比较新也比较全!某鱼上买估计至少要好几十。
5、用Verilog实现串转并电路,输出信号8bit,同时可选择模式LSB或者MSB优先。(10分)
解析:本题主要考察了可切换的串并转换的Verilog实现
串并转换在Verilog中经常会用到,由于芯片外部的PAD数量有限,所以多用串行的方式把数据送入,然后在芯片内部再转成并行数据进行处理。我们可以选择用寄存器移位的方式实现,也可以选择用FIFO或RAM来实现,这题显然是要求我们用寄存器移位的方式来实现。题目中还要求LSB和MSB可切换的功能,这里我们通过一个输入信号来控制,这个信号在芯片中往往都是做成寄存器可配,由专门的regbank模块来控制。Verilog代码如下所示:
//------------------------------
01moduleserial2parrallel(
02inputsys_clk,//模块的时钟
03inputsys_rst_n,//模块的复位
04inputreg_msb_lsb,//为1时表示先传来的MSB数据,为0时表示先传来的LSB数据
05inputdata_in,//单比特串行数据
06inputdata_in_valid,//单比特串行数据有效标志信号
07
08outputreg[7:0]data_out,//8比特串并数据
09outputregdata_out_valid//8比特串行数据有效标志信号
10);
11
12reg[2:0]cnt;
13
14//当单比特串行数据有效标志信号有效时计数器计数
15always@(posedgesys_clkornegedgesys_rst_n)
16if(!sys_rst_n)
17cnt=3'b0;
18elseif(data_in_valid==1'b0cnt==3'd7)
19cnt=3'b0;
20elseif(data_in_valid==1'b1)
21cnt=cnt+1'b1;
22
23//当单比特串行数据有效标志信号有效且先传来MSB数据执行左移;当单比特串行数据有效标志信号有效且先传来LSB数据执行右移
24always@(posedgesys_clkornegedgesys_rst_n)
25if(!sys_rst_n)
26data_out=8'b0;
27elseif(data_in_valid==1'b1reg_msb_lsb==1'b1)
28data_out={data_out[6:0],data_in};
29elseif(data_in_valid==1'b1reg_msb_lsb==1'b0)
30data_out={data_in,data_out[7:1]};
31
32//当移动8次后,8比特并行数据有效
33always@(posedgesys_clkornegedgesys_rst_n)
34if(!sys_rst_n)
35data_out_valid=8'b0;
36elseif(cnt==3'd7)
37data_out_valid=1'b1;
38else
39data_out_valid=1'b0;
40
41module
//---------------------------------
Testbench如下所示:
//---------------------------------
01`timescale1ns/1ns
02
03moduletb_serial2parrallel();
04
05regsys_clk;
06regsys_rst_n;
07regreg_msb_lsb;
08regdata_in;
09regdata_in_valid;
10
11wire[7:0]data_out;
12wiredata_out_valid;
13
14//初始化系统时钟、全局复位和输入信号
15initialbegin
16sys_clk=1'b1;
17sys_rst_n=1'b0;
18reg_msb_lsb=1'b1;
19data_in=1'b0;
20data_in_valid=1'b0;
21200
28data_in_byte();
29
30
31//sys_clk:每10ns电平翻转一次,产生一个50MHz的时钟信号
32always(20);//没间隔20ns发送1比特数据
61
62task
63
64//--------serial2parrallel_inst------
65serial2parrallelserial2parrallel_inst(
66.sys_clk(sys_clk),//inputsys_clk
67.sys_rst_n(sys_rst_n),//inputsys_rst_n
68.reg_msb_lsb(reg_msb_lsb),//inputreg_msb_lsb
69.data_in(data_in),//inputdata_in
70.data_in_valid(data_in_valid),//inputdata_in_valid
71
72.data_out(data_out),//output[7:0]data_out
73.data_out_valid(data_out_valid)//outputdata_out_valid
74);
75
76module
//-------------------------------
仿真结果这里不再给出,大家可以自行验证一下。
6、艾师傅卖羊肉,进价24一公斤,卖18一斤,客人买了四公斤,客人给两百元但找不开,艾师傅到邻居家换了两百元钱,后来邻居去银行存钱发现这两百元是假币,艾师傅又赔了邻居200,请问艾师傅一共赔了多少钱?(10分)
解析:本题主要考察了如何从复杂的逻辑中理清关键逻辑
卖4公斤肉亏的钱就是进肉价格所亏的本钱为:24¥/kg*4kg=96¥;200元假币找零所亏的钱为:200¥-36¥/kg*4kg=56¥,所以艾师傅总的亏损为:96¥+56¥=152¥。
文章链接:
转载自:达尔闻说,作者相量子
文章链接:求职攻略|如何用Verilog实现串转并电路
推荐阅读
-
北京二绿地区约910平方公里 涉及朝阳海淀等11个区
央广网北京11月17日消息(记者阮修星)11月17日,在《北京市第二道绿化隔离地区减量提质规划(2021年—2035年)》新闻发布会上,北京市城乡结合部建设领导小组办公室副主任靳京介绍,二绿地区是五环路至六环路之间以九个楔形绿色廊道为主的地区,面积约910平方公里,涉及朝阳、海淀、丰台、石景山、门头...
-
中国货车网买卖的流程如何
自从出现了中国货车网之后很多的想要买车的朋友们都来到了这里,查查看自己所在的城市或者是周边有没有正在出售自己理想当中的货车,如果有的话就可以约见对方,然后谈一下价格。现在还有很多人想要卖掉自己手里面的车子,比如说工程已经结束了等理由,所以这些车子放在手里面没用,还不如卖一个二手的价格,给自己收回部分...
-
均搭载1.8T发动机 新DS 5 携2016款DS 6正式上市
9月4日,成都车展正式拉开帷幕,DS品牌新DS5、2016款DS6也正式上市。其中,新DS5预售价为21.99万元-34.59万元,新增香槟金和喷涂哑光两种车身色彩,内饰方面则增加了红色内饰。与DS品牌以往的车型相比,新DS5新增1.8T发动机,其150kW的最大功率和280Nm的最大扭矩,足以媲美...
-
迟迟没有电动化的神龙汽车,2024年挑战愈多
迄今为止,作为所谓的“法系独苗”,神龙汽车的电动化战略一直没有起色。在Stellantis(译为“斯泰兰蒂斯”)入股零跑汽车,并提出在欧洲生产零跑汽车的可能时,作为一家成立20年的合资品牌,神龙汽车的处境愈发危险。在神龙汽车中方团队的规划中,电动化是势在必行的。每年他们都满怀期待地想与法方共同发布电...