乐鑫科技2020数字芯片

摘抄至数字芯片实验室
1、设计一个序列信号发生器电路,能在CLK信号作用下周期性输出“0010110111”的序列信号
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
2、设计一个自动饮料售卖机,共有两种饮料,其中饮料A每个10分钱,饮料B每个5分钱,硬币有5分和10分两种,并考虑找零。要求用状态机实现,定义状态,画出状态转移图,并用Verilog完整描述该模块
在这里插入图片描述

module machine(input clk ,input rst_n ,input[2:0] button,            //button[0]   --coin_in ;button[1]   --drink_in ;button[2]-- coin_out input  coin_in ,            //0  --5 fen ;1 --10 fenoutputreg  coin_out ,       //0  --0 fen ;1 --5 feninput  drink_in ,           //0  --5 fen drink ;1 --10 fen drinkoutputreg drink_out       //0  --5 fen drink ;1 --10 fen drink);parameter[1:0]  IDLE = 2'b00 ,  S0 = 2'b01 ,  S1 = 2'b10 ,  S2 = 2'b11 ;
reg[1:0] current_state, next_state ;always@(posedge clk ornegedge rst_n) beginif(!rst_n) begincurrent_state <= IDLE ;endelsebegincurrent_state <= next_state ;end
endreg  coin_in_reg ,drink_in_reg ;
always@(posedge clk ornegedge rst_n) beginif(!rst_n) begincoin_out <= 0 ;drink_out <= 0 ;coin_in_reg  <= 0 ;drink_in_reg <= 0 ;endelsebegincase(current_state)IDLE :begincoin_out <= 0 ;drink_out <= 0 ;drink_in_reg <= 0 ;if(button[0]) begincoin_in_reg <=  coin_in ;endelsebegincoin_in_reg <= 0 ;endendS0 :begincoin_out <= 0 ;drink_out <= 0 ;if(button[1]) begindrink_in_reg <= drink_in;endelsebegindrink_in_reg <= 0 ;endendS1 :begincoin_out <= 0 ;if(coin_in_reg>= drink_in_reg) drink_out <= drink_in_reg ;else                            drink_out <= 1'b0 ;endS2 :begindrink_out <= 0 ;drink_in_reg <= 0 ;if(button[0]) begincoin_in_reg <=  coin_in ;endelsebegincoin_in_reg <= 0 ;endif(coin_in_reg> drink_in_reg) coin_out <= 1'b1 ;else                           coin_out <= 1'b0 ;endendcaseend
endalways@(*) beginnext_state = IDLE ;case(current_state)IDLE : beginif(button[0]) beginnext_state = S0 ;endelsebeginnext_state = IDLE ;endendS0   : beginif(button[1]) beginnext_state = S1 ;endendS1   : beginif(button[2]) beginnext_state = S2 ;endendS2   : beginif(button[0]) beginnext_state = S0 ;endendendcase
endendmodule
module  machine_tb;reg clk ;reg rst_n ;reg[2:0] button ;reg coin_in ;wire coin_out ;reg drink_in ;wire drink_out ;initialbeginclk = 0 ;rst_n = 1 ;button = 0 ;coin_in = 0 ;drink_in = 0 ;#20    rst_n = 0 ;#20    rst_n = 1 ;#30@(posedge clk ) #1button[0] = 1 ;coin_in = 1 ;@(posedge clk ) #1button[0] = 0 ;coin_in = 0 ;button[1] = 1 ;drink_in = 0 ; @(posedge clk ) #1button[1] = 0 ;drink_in = 0 ; button[2] = 1 ;@(posedge clk ) #1button[2] = 0 ;button[0] = 1 ;coin_in = 1 ;@(posedge clk ) #1button[0] = 0 ;coin_in = 0 ;button[1] = 1 ;drink_in = 1 ; @(posedge clk ) #1button[1] = 0 ;drink_in = 0 ; button[2] = 1 ;endalways #10 clk = ~clk;machine machine(.clk(clk) ,.rst_n(rst_n)  ,.button(button) ,          .coin_in(coin_in)  ,          .coin_out(coin_out) ,     .drink_in(drink_in) ,           .drink_out(drink_out)    );endmodule

1、 用户必须按照投币-买饮料-找零的顺序依次操作

2、 每轮购买操作中,用户只能投币一次,不然会发生吞币!(哈哈~~~)

3、 投币大小不能比购买饮料的价格小
在这里插入图片描述
3、请实现对(1011001)2的序列检测功能,模块每拍并行输入2bit,且顺序为高位先输入,当检测到序列,输出一拍高电平脉冲。请用Verilog描述该模块。
相当于检测10_11_00_1X
在这里插入图片描述

module sequence_checker_2bit(input clk  ,input rst_n,input[1:0] sequence_in ,outputreg pulse_out
);parameter[2:0] IDLE = 3'b000 ,S0= 3'b001,S1= 3'b010,S2= 3'b011,S3= 3'b100  ;reg[2:0] current_state,next_state ;reg pulse_out_reg ;
always@(posedge clk ornegedge rst_n) beginif(!rst_n) begincurrent_state <= 0 ;pulse_out <= 0 ;endelsebegincurrent_state <= next_state ;pulse_out <= pulse_out_reg ;end
endalways@(*) beginnext_state = IDLE;case(current_state)IDLE : beginif(sequence_in == 2'b10) next_state =S0;pulse_out_reg = 0 ;endS0 : beginif(sequence_in == 2'b11) next_state =S1;pulse_out_reg = 0 ;endS1 : beginif(sequence_in == 2'b00) next_state =S2;pulse_out_reg = 0 ;endS2 : beginif(sequence_in == 2'b10 || sequence_in == 2'b11)  beginnext_state = S3;pulse_out_reg = 1 ;endendS3 : beginif(sequence_in == 2'b10) next_state =S0;else next_state =IDLE;pulse_out_reg = 0 ;endendcase
endendmodule
module  sequence_checker_2bit_tb ;reg clk  ;reg rst_n ;reg[1:0]  sequence_in ;wire pulse_out ;initialbeginclk = 0 ;rst_n = 1 ;sequence_in = 2'b00 ;#20 rst_n = 0;#20 rst_n = 1 ;@(posedge clk) #1  sequence_in = 2'b10 ;@(posedge clk) #1  sequence_in = 2'b11 ;@(posedge clk) #1  sequence_in = 2'b00 ;@(posedge clk) #1  sequence_in = 2'b10 ;@(posedge clk) #1@(posedge clk) #1@(posedge clk) #1  sequence_in = 2'b10 ;@(posedge clk) #1  sequence_in = 2'b11 ;@(posedge clk) #1  sequence_in = 2'b00 ;@(posedge clk) #1  sequence_in = 2'b11 ;endalways #10 clk = ~clk;sequence_checker_2bitsequence_checker_2bit(.clk(clk) ,.rst_n(rst_n),.sequence_in(sequence_in) ,.pulse_out(pulse_out)
);endmodule

在这里插入图片描述
4、请基于f = 100Hz的Clock设计一个数字时钟,用Verilog实现以下功能

 1、产生时、分、秒的计时2、可通过3个按键来设置时、分、秒值
module clock(input clk ,input rst_n ,input hour_set,input[4:0] hour_set_value,input minute_set,input[5:0]minute_set_value ,input second_set ,input  [5:0]second_set_value ,output[5:0] second_out ,output[5:0] minute_out ,output[4:0] hour_out
);reg[5:0] second_reg ;reg[5:0] minute_reg ;reg[4:0] hour_reg ;always@(posedge clk ornegedge rst_n ) beginif(!rst_n) beginsecond_reg <= 0 ;endelseif(second_set)second_reg <= second_set_value ;elseif(second_reg == 59) second_reg<= 0;else second_reg<= second_reg +1 ;endalways@(posedge clk ornegedge rst_n ) beginif(!rst_n) beginminute_reg <= 0 ;endelseif(minute_set)minute_reg <= minute_set_value ;elseif(minute_reg == 59 &&second_reg == 59) minute_reg <= 0;elseif(second_reg == 59) minute_reg<= minute_reg +1 ;endalways@(posedge clk ornegedge rst_n ) beginif(!rst_n) beginhour_reg <= 0 ;endelseif(hour_set)hour_reg <= hour_set_value ;elseif(hour_reg == 23 &&minute_reg == 59 && second_reg == 59)   hour_reg <= 0;elseif(minute_reg == 59 &&second_reg == 59 ) hour_reg <= hour_reg +1 ;end   assign second_out=  second_reg ;
assign minute_out=   minute_reg;
assign hour_out =   hour_reg;
endmodule

```c
module  clock_tb ;reg clk ;reg rst_n ;reg hour_set ;reg[4:0] hour_set_value;reg minute_set ;reg[5:0]minute_set_value;reg second_set ;reg[5:0]second_set_value;wire[5:0]second_out  ;wire[5:0]minute_out  ;wire[4:0] hour_out  ;initialbeginclk = 0 ;rst_n = 1 ;hour_set = 0 ;hour_set_value = 0;minute_set = 0 ;minute_set_value = 0;second_set = 0 ;second_set_value = 0;#10 rst_n = 0 ;#10 rst_n = 1 ;@(posedge clk ) #1hour_set = 1 ;hour_set_value= 10 ;minute_set = 1 ;minute_set_value = 10 ;second_set= 1 ;second_set_value = 10 ;@(posedge clk ) #1hour_set = 0 ;hour_set_value= 0 ;minute_set = 0 ;minute_set_value = 0 ;second_set= 0 ;second_set_value = 0 ;endalways #5 clk =~clk ;clock clock(.clk(clk) ,.rst_n(rst_n) ,.hour_set(hour_set) ,.hour_set_value(hour_set_value) ,.minute_set(minute_set),.minute_set_value(minute_set_value) ,.second_set(second_set),.second_set_value(second_set_value) ,.second_out(second_out) ,.minute_out(minute_out) ,.hour_out(hour_out)
);endmodule

在这里插入图片描述
5、矩阵键盘
参考文章:

https://www.cnblogs.com/yuphone/archive/2010/11/09/1783623.html
6、将一个串行执行的C语言算法转化为单拍完成的并行可综合verilog。
C语言源码如下:

unsignedcharcal_table_high_first(unsignedcharvalue)
{unsigned char i ;
unsigned  char checksum = value ; for (i=8;i>0;--i){if (check_sum& 0x80){check_sum = (check_sum<<1) ^ 0x31;}else{check_sum = (check_sum << 1);}}return check_sum;
}

算法C语言实现:

#include<stdio.h>
int main(){unsignedchar cal_table_high_first(unsignedcharvalue); unsignedchar data;for (unsignedchar i = 0; i < 16;++i){data= cal_table_high_first(i);printf("value =0x%0x:check_sum=0x%0x  \n", i, data);}getchar();
}unsignedchar cal_table_high_first(unsignedcharvalue)
{unsignedchar i;unsigned  char check_sum = value;for (i = 8; i > 0;--i){if (check_sum &0x80){check_sum= (check_sum << 1) ^ 0x31;}else{check_sum= (check_sum << 1);}}return check_sum;
}

输出结果:

value =0x0:check_sum=0x0
value =0x1:check_sum=0x31
value =0x2:check_sum=0x62
value =0x3:check_sum=0x53
value =0x4:check_sum=0xc4
value =0x5:check_sum=0xf5
value =0x6:check_sum=0xa6
value =0x7:check_sum=0x97
value =0x8:check_sum=0xb9
value =0x9:check_sum=0x88
value =0xa:check_sum=0xdb
value =0xb:check_sum=0xea
value =0xc:check_sum=0x7d
value =0xd:check_sum=0x4c
value =0xe:check_sum=0x1f
value =0xf:check_sum=0x2e

C语言作为参考模型,用于后续Verilog的功能仿真。

该算法逻辑如下:

输入一个8bit的数,首先判断最高位是否为1,如果为1则左移一位,并且和8‘b00110001异或;如果最高位不为1则左移一位。此过程执行8次。
在这里插入图片描述
根据上述结果,可以用verilog描述。

module loop1(input clk,input rst_n,input [7:0] check_sum,output reg [7:0] check_sum_o
);
//reg [7:0] check_sum_o;
always @ (posedge clk or negedge rst_n)if(!rst_n)begincheck_sum_o<= 8'h0;endelsebegincheck_sum_o[7]<= check_sum[3]^check_sum[2]^check_sum[5];check_sum_o[6]<= check_sum[2]^check_sum[1]^check_sum[4]^check_sum[7];check_sum_o[5]<= check_sum[1]^check_sum[7]^check_sum[0]^check_sum[3]^check_sum[6];check_sum_o[4]<= check_sum[7]^check_sum[0]^check_sum[3]^check_sum[6];check_sum_o[3]<= check_sum[3]^check_sum[7]^check_sum[6];check_sum_o[2]<= check_sum[2]^check_sum[6]^check_sum[5];check_sum_o[1]<= check_sum[1]^check_sum[5]^check_sum[4]^check_sum[7];check_sum_o[0]<= check_sum[0]^check_sum[4]^check_sum[3]^check_sum[6];endendmodule

testbench


module loop1_tb;
reg clk;
reg rst_n;
reg [7:0] check_sum;
wire [7:0] check_sum_o;
always #1 clk=~clk;
initial
begin
clk = 0;
rst_n = 0;
#10
rst_n = 1;
for (check_sum=0;check_sum<16;check_sum=check_sum+1)begin#2//check_sum = i;$display ("check_sum = %h",check_sum_o);if (check_sum == 15) $stop;end
//$stop;
end
loop1 loop1_i1(.clk(clk),.rst_n(rst_n),.check_sum(check_sum),.check_sum_o(check_sum_o)
);
endmodule

loop2.v的实现和loop1.v类似,只是代码量更少。

module loop2(input clk,input rst_n,input [7:0] check_sum,output  reg [7:0] check_sum_o
);
integer i;
//reg [7:0] check_sum_o;
reg [7:0] ccc;
always @ (posedge clk or negedge rst_n)if(!rst_n)begincheck_sum_o= 8'h0;endelsebeginccc = check_sum;for(i=0;i<8;i=i+1)beginccc ={ccc[6:0],1'b0}^({8{ccc[7]}} & 8'h31);endcheck_sum_o = ccc;endendmodule

其实也可以将C语言函数封装成Verilog的function,然后在在单周期内进行赋值。

module loop3(input clk,input rst_n,input [7:0] check_sum,output  reg [7:0] check_sum_o);integer i;function [7:0] cal_table_high_first;input[7:0] value;reg[7:0] ccc ;reg[7:0] flag ;beginccc= value;for(i=0;i<8;i=i+1)beginflag= ccc & 8'h80 ;if(flag!= 0 ) ccc = (ccc <<1) ^ 8'h31 ;elseccc = (ccc <<1)  ;endcal_table_high_first= ccc;endendfunctionalways @ (posedge clk or negedge rst_n)if(!rst_n)begincheck_sum_o= 8'h0;endelsebegincheck_sum_o<= cal_table_high_first(check_sum) ;endendmodule

综上,loop1.v和loop2.v的主要贡献是解开了算法实现的if-else判断。至于loop3.v中,将C语言描述的功能封装成fucntion,直接单周期完成赋值的实现方式在逻辑综合后是否增加了if-else判断语句的硬件开销不在本文讨论范围内。

这和设计者施加的时序约束和综合工具算法有关

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

乐鑫科技,活跃在国际舞台上的中国芯

众多国内外开发者在社交平台讨论乐鑫产品 说到中国芯片&#xff0c;大家往往很容易先联想到“国产替代”的概念。不过&#xff0c;“国产替代”这四个字早已不足以概括国产芯片的快速发展。乐鑫科技 (688018.SH) 作为来自中国的领先 AIoT 平台企业&#xff0c;在产品设计与研发…

Matter 系列 #9|乐鑫 Matter 预配置服务加速设备生产

乐鑫 Matter 系列文章 #9 目录 Matter 预配置服务 1. 设备认证 (Device Attestation) 2. 独特性 (Uniqueness) 3. 安全性 (Security) 联系我们​​​​​​​ 如今&#xff0c;物联网行业蓬勃发展&#xff0c;大量市场参与者正在积极地构建 Matter 智能设备。 乐鑫一直致…

基于乐鑫 ESP32 的智能手表

拥有一块自己制作的智能手表是不是听起来就很酷&#xff1f;工程师 Pcadic 基于乐鑫 ESP32-PICO-D4 实现了这个想法&#xff01;他开发了一款能够与我们的手机或任何其他设备互联的智能手表 ESP32-Pico-Watch。 ESP32-Pico-Watch 支持 Wi-Fi、蓝牙、Mesh&#xff0c;拥有 1 个振…

乐鑫科技推出 ESP-LEDStrip 智能律动灯方案

人们在丰富多彩的日常生活中对照明设备的功能和效果提出了更高要求&#xff1a;它们不仅要具备基础照明功能&#xff0c;还需要在本地/远程控制、个性化设置、光效调节等多方面提升用户的智能使用体验&#xff0c;甚至在不同场景中发挥渲染气氛、提升装饰品味、制造视觉冲击等作…

乐鑫科技笔试总结

1 CPU包括哪三部分&#xff1f; 运算器&#xff0c;控制器&#xff0c;存储器构成 1、运算器 运算器的基本功能是完成对各种数据的加工处理&#xff0c;例如算术四则运算&#xff0c;与、或、求反等逻辑运算&#xff0c;算术和逻辑移位操作&#xff0c;比较数值&#xff0c;…

乐鑫科技亮相德国嵌入式展 Embedded World 2023!

3 月 14 日&#xff0c;德国纽伦堡嵌入式展 Embedded World 2023 火热启幕。本届 Embedded World 主题为 “embedded. responsible. sustainable”&#xff0c;乐鑫科技 (688018.SH) 携众多 AIoT 科技成果亮相展会&#xff0c;致力于打造更智能、更互联、更绿色的物联网未来。…

乐鑫笔试题C语言,乐鑫科技2020秋招笔试题——数字IC

原题&#xff1a;请将下面这段 C 语言描述的串行处理过程&#xff0c;转换为单拍完成的并行处理&#xff0c;并用可综合的 Verilog 来描述。 unsigned char cal_table_high_first(unsigned char value) { unsigned char i; unsigned char checksum value&#xff1b; for (i8;…

乐鑫科技2020届秋招-数字IC类真题

最近在牛客网刷数字IC真题&#xff0c;看到乐鑫科技2020秋招真题&#xff0c;做完发现有的人首先用c语言模拟输入输出参考模型用作verilog输入输出真值表参数&#xff0c;然后根据真值表算出输入输出各位之间的关系&#xff0c;这显然在现实笔试时是不可取的&#xff0c;时间浪…

数字IC手撕代码-乐鑫科技笔试真题(4倍频)

前言&#xff1a; 本专栏旨在记录高频笔面试手撕代码题&#xff0c;以备数字前端秋招&#xff0c;本专栏所有文章提供原理分析、代码及波形&#xff0c;所有代码均经过本人验证。 目录如下&#xff1a; 1.数字IC手撕代码-分频器&#xff08;任意偶数分频&#xff09; 2.数字I…

乐鑫科技2022笔试面试题

来源于读者投稿&#xff0c;作者来源于牛客网的 galun 。 投递方式&#xff1a;内推。 岗位&#xff1a;嵌入式软件实习生。 个人情况&#xff1a;本科双非电子信息工程&#xff0c;硕士华五软件工程研一在读&#xff1b;本科做过一些很水的项目 &#xff0c;也拿项目搞了一些奖…

chatgpt赋能python:Python下载模块并安装教程

Python下载模块并安装教程 Python 作为一门广泛应用于各个领域的编程语言&#xff0c;具有易学易用、生态丰富等诸多优势&#xff0c;然而为了方便我们进行某些操作&#xff0c;会需要下载一些第三方的模块。因此&#xff0c;本文将介绍如何下载模块并安装。 下载模块 下载模…

Java 基础入门笔记

Java 入门基础笔记 标识符 标识符必须以 字母 _ $ 开头 大小写敏感 可包含 字母 _ $ 不能是 JAVA 的 关键字 int String 驼峰规则 javaBasicKonwledge 基本数据类型 数值型字符型布尔型整数类型(byte short int long)char 字符型true浮点型(float double)String 字符串 …

串口软件Vofa+,超好用。可用于高速采集数据直观化显示动态

&#xff08;上一次写的不够完整&#xff0c;有好多人还会遇到问题&#xff0c;我再回来完善下&#xff09; 使用背景&#xff1a; 在调试无感的无刷直流电机的应用中&#xff0c;需要高速采集3路驱动电压&#xff0c;用于检测反电动势的“过零点”。 &#xff08;其实后来接…

国内IT软件外包公司汇总(2023 最新版)!

关注、星标公众号&#xff0c;直达精彩内容 原文&#xff1a;https://sourl.cn/Y757iG 最近很多读者问我只有外包的 offer 能去吗&#xff1f; 大环境不行&#xff0c;面试太少了&#xff0c;很多本科生想进外包都没机会。非常时期&#xff0c;不需要在意那么多&#xff0c;外包…

鼎捷T100权限管控设定

文章目录 一、名称解释1.1 角色1.2 用户1.3 账号 二、权限结构2.1 权限设置作业 三、权限实作3.1 角色规划3.2 用户数据设置 一、名称解释 1.1 角色 角色代表企业中的一个职能权限集合&#xff0c;例如业务职能需要有估报价单维护、订单维护等操作权限。 角色定义操作权限如作…

聚焦装备制造行业数智化转型 鼎捷软件勇担产业先锋

国务院政府工作报告指出&#xff1a;“十四五期间加快数字化发展&#xff0c;打造数字经济新优势&#xff0c;协同推进数字产业化和产业数字化转型”。制造业数字化转型作为产业数字化的重点体现&#xff0c;将成为未来中国制造业实现新发展的焦点所在。作为国民经济的支柱产业…

畅捷通T+和旺店通·企业奇门单据接口对接

数据源平台:旺店通企业奇门 慧策最先以旺店通ERP切入商家核心管理痛点——订单管理&#xff0c;之后围绕电商经营管理中的核心管理诉求&#xff0c;先后布局流量获取、会员管理、仓库管理等其他重要经营模块。慧策的产品线从旺店通ERP起步&#xff0c;向前向后延伸&#xff0c…

阿里云联合鼎捷软件发布云上数字工厂解决方案,实现云MES系统本地化部署

5月18日&#xff0c;阿里云与鼎捷软件联合主办的“云上数字工厂与中小企业数字化转型创新论坛”于线上举行。本次创新论坛上&#xff0c;阿里云弹性计算解决方案及运营负责人胡晓博与鼎捷软件上海事业部总经理袁能飞共同宣布“鼎捷MES&阿里云云盒云上数字工厂解决方案”正式…

鼎捷T100,TOPGP Debug时更改user

鼎捷T100&#xff0c;TOPGP Debug时更改user 有一些程序可能根据不同的用户设置了一些卡控或权限之类的&#xff0c;而我们debug的时候却用的是tiptop账号&#xff0c;如何在debug的时候更改用户呢&#xff1f; T100在debug的时候要过 CALL cl_ap_init(“cim”,“”) 函数 tip…

鼎捷T100标准接口调用

一、接口信息 我们先找接口信息,它们正常情况下都存在azzi700集成服务基本数据维护作业内, 接口地址:http://服务IP/wtoptst/ws/r/awsp920,鼎捷会给你的。 接口文档:在上图中的“API语系清单”内,标准接口一般包含简体和繁体两种模板。 二、接口调用步骤 以下用前面…