tag 标签: case

相关博文
  • 热度 27
    2016-4-30 10:31
    3940 次阅读|
    0 个评论
    验证:  if_else不同使用方式,出来避免不受欢迎的意外产生的锁存器,同时还可以有效的利用逻辑资源, 修改:关于case,default......         例程实现方式一: module if_thn(current_state, x, y, z, state_out);    input       current_state;    input           x;    input           y;    input           z;    output      state_out;    parameter   s0 = 9'b000000000;    parameter   s1 = 9'b100000001;    parameter   s2 = 9'b100000010;    parameter   s3 = 9'b100000100;    parameter   s4 = 9'b100001000;    parameter   s5 = 9'b100010000;    parameter   s6 = 9'b100100000;    parameter   s7 = 9'b101000000;    parameter   s8 = 9'b110000000;        reg             output1;    reg             output2;    reg             output3;        always @(current_state or x or y or z)       if ((current_state == s1) | (current_state == s3) | (current_state == s4))          output1 = x;       else if ((current_state == s0) | (current_state == s2) | (current_state == s5))          output2 = y;       else if ((current_state == s6) | (current_state == s7) | (current_state == s8))          output3 = z;       else begin          output1 = 1'b0;          output2 = 1'b0;          output3 = 1'b0;       end        assign state_out = {output1, output2, output3};     endmodule RTL:查看综合结果 分析:我们可以看到,X,Y,Z三个输入最终会个经过一次锁存器输出,他们会是设计的时序分析复杂化   Technology Map Viewer:显示工程实际的逻辑实现 同样后一级的3个LCELL的输出出来驱动设计的3个输出以外,同时还反馈到LCELL的输入端   片上资源使用: Total logic elements    优化方式二: always @(current_state or x or y or z)    begin       if ((current_state == s1) | (current_state == s3) | (current_state == s4))          output1 = x;       else          output1 = 1'b0;       if ((current_state == s0) | (current_state == s2) | (current_state == s5))          output2 = y;       else          output2 = 1'b0;       if ((current_state == s6) | (current_state == s7) | (current_state == s8))          output3 = z;       else          output3 = 1'b0;    end   RTL:查看综合结果 分析:不存在方式一中的锁存器出现 Technology Map Viewer:显示工程实际的逻辑实现 3个LCELL的输出出来驱动设计的3个输出以外,不存在输入反馈 片上资源使用 片上资源使用大大减少   方式三:(结果 同方式二) always @(current_state or x or y or z)    begin       output1 = 1'b0;       output2 = 1'b0;       output3 = 1'b0;              if ((current_state == s1) | (current_state == s3) | (current_state == s4))          output1 = x;       if ((current_state == s0) | (current_state == s2) | (current_state == s5))          output2 = y;       if ((current_state == s6) | (current_state == s7) | (current_state == s8))          output3 = z;    end     综合结果分析:if_else不同使用方式,除了避免不受欢迎的意外产生的锁存器,同时还可以有效的利用逻辑资源 ----------------------以下为修改的内容------------------------------- 关于产生锁存器: 1.在case语句中,如果没有列出所有的状态"default"不要省略 2.条件语句中,"if....else if..."else"" 中最后一个else不要省略 ----------------------以下为修改内容--------------------------- 增加一个使用case default的例程 always@(posedge Clk or negedge Rst_n) if(!Rst_n)begin wave = 3'd0; fword = 32'd500000;//初始f为500Hz pword = 8'd0; wr_act = 1'b1; end else begin case(key_state) 8'b0000_0001 : wave = sin_wave; 8'b0000_0010 : wave = Triangle_wave; 8'b0000_0100 : wave = sawtooth_wave; 8'b0000_1000 : wave = square_wave; 8'b0001_0000 : fword = fword + 32'd100;//步进频率1Hz 8'b0010_0000 : fword = fword - 32'd100; 8'b0100_0000 : pword = pword + 8'd1; 8'b1000_0000 : pword = pword - 8'd1; //default : begin //fword = 32'd500000; //wr_act = 1'b1; //end endcase end 这里case虽然使用的是独热码,但是并没有列出所有状态....(default)综合后可以看RTL中 fword, wr_act 与加入default后的区别 (注释部分)
  • 热度 22
    2016-4-13 07:58
    981 次阅读|
    0 个评论
         本次笔记记录的是4-16译码器的验证  下面我们看一下4-16译码器的真值表 从真值表中我们可以观察到,从十六组数据中取出要写程序的所需要的信息 例程: module my_4_16(a,b,c,d,out); input a; input b; input c; input d; output reg  out; always @(a,b,c,d) begin//a,b,c,d作为敏感信号 case({a,b,c,d}) 4'b0000 : out = 16'b0000_0000_0000_0001; 4'b0001 : out = 16'b0000_0000_0000_0010; 4'b0010 : out = 16'b0000_0000_0000_0100; 4'b0011 : out = 16'b0000_0000_0000_1000; 4'b0100 : out = 16'b0000_0000_0001_0000; 4'b0101 : out = 16'b0000_0000_0010_0000; 4'b0110 : out = 16'b0000_0000_0100_0000; 4'b0111 : out = 16'b0000_0000_1000_0000; 4'b1000 : out = 16'b0000_0001_0000_0000; 4'b1001 : out = 16'b0000_0010_0000_0000; 4'b1010 : out = 16'b0000_0100_0000_0000; 4'b1011 : out = 16'b0000_1000_0000_0000; 4'b1100 : out = 16'b0001_0000_0000_0000; 4'b1101 : out = 16'b0010_0000_0000_0000; 4'b1110 : out = 16'b0100_0000_0000_0000; 4'b1111 : out = 16'b1111_1111_1111_1111; //由于刚好16组数据,所以default语句不需要在写 endcase end endmodule ///`tb `timescale 1ns/1ns module my_4_16_tb; reg a; reg b; reg c; reg d; wire   out; my_4_16 my_4_16( .a(a), .b(b), .c(c), .d(d), .out(out) ); initial begin a=0; b=0;c=0;d=0; #100; a=0; b=0;c=0;d=1; #100;         a=0; b=0;c=1;d=0; #100;                 a=0; b=0;c=1;d=1; #100;                 a=0; b=1;c=0;d=0; #100;                 a=0; b=1;c=0;d=1; #100;                 a=0; b=1;c=1;d=0; #100;                 a=0; b=1;c=1;d=1; #100;                 a=1; b=0;c=0;d=0; #100;                 a=1; b=0;c=0;d=1; #100;                 a=1; b=0;c=1;d=0; #100;                 a=1; b=0;c=1;d=1; #100;                 a=1; b=1;c=0;d=0; #100;                 a=1; b=1;c=0;d=1; #100;                 a=1; b=1;c=1;d=0; #100;                 a=1; b=1;c=1;d=1; #200; $stop; end endmodule 仿真波形图:   本次程序读懂真值表后不难写出,因为全部二进制书写,比较浪费时间.同样的,3-8译码器更容易写出   注: 程序模块名命名时不要以纯数字命名例如"4_16",编译时会报错
  • 热度 31
    2016-2-6 14:13
    3217 次阅读|
    0 个评论
    第二讲 case 语句及 task 任务块 实验任务: ( 1 )用 case 语句实现具有译码功能的模块(类似于 3-8 译码器); ( 2 )学会在 testbench 中使用 task 任务块语句,用它产生测试数据给待测模块; ( 3 )注意 case 语句的写法,思考:若 case 分支列举不全面,会出现什么不良后果? 实验内容及过程: 因本次实验简单,故直接贴出代码并予以简单的讲解,代码截图如下图所示: 注意事项: 在用 Verilog 语言设计数字电路的时候,出现多余无用的锁存器对电路危害大,应格外小心,消除锁存器的办法:① always 中的敏感信号列表要写全(要包含 case 条件、赋值符号右边的变量);②所有条件分支要写全(包括default );③ if—else 语句要写全,不要只写 if 不写 else ,没有 else 的时候也要写一条空的 else 语句。 以下两个图展示了 case 条件分支写全与不全时综合后的结果: 图 1 case 条件分支不全时综合的 RTL 视图 图 1 为漏写了 3'd7:begin         o_data = 8'b0111_1111;         o_dv = 1'b1; end 这条分支时综合后的结果,从图 1 可看出,在电路的输出端出现了 8 个 latch ,且它们都与 MUX7 的输出端相连。由此可见,是因为漏写了上面的那段语句。 在利用 Quartus II 综合 设计的实例时,也会出现一些相关的警告,如图 2 所示: 图 2 Quartus II 综合时产生的警告 正确的 RTL 视图应该如图 3 所示: 图 3 正确的 RTL 级视图(无 latch )   在 testbench 中使用 task 任务块依次产生 0~255 之间的数,并分别将这些数值赋值给 i_data 和 i_addr ,代码截图如下图所示: 关于写 task 任务块,有很多语法约束,这里一一列举出来: ( 1 ) task 没有端口列表,但可以有输入变量列表,并且变量须在 task 内部予以声明(如上图中的 size ); ( 2 )输入输出端口可在 task 内部尽心声明,支持 input 、 output 以及 inout 三种端口信号; ( 3 )可以用 integer 或 reg 声明 task 要用到的变量,但不能用 wire 声明; ( 4 ) task 任务块也属于块语句,但与 module—endmodule 的架构类似,可仿照 module—endmodule 的架构 task 任务块,但是, task 与 always 、 initial 属于同一层次,故 task 的内容要写在 always 块和 initial 块之外,但可在 always 块、 initial 块以及 task 任务块中调用 task 任务块(即:任务中可以再调用其他任务); ( 5 )调用任务时,需按照端口声明的顺序调用(跟模块实例化中的“按顺序”实例化的操作是类似的); ( 6 )任务不能实时输出,而是只能在整个任务结束时得到一个最终的结果,输出的值也是这个最终的结果的值,例如: task seq; output    q;   begin q = 0; #10   q = 1; end   endtask 上述代码仿真的结果是,调用此任务之后只会得到一个延迟 10 个时间单位的输出数据 1 ,前 10ns 输出数据的状态是未知的,如图 4 所示: 图 4 task 不能实时输出的仿真图 ( 6 )在仿真过程中如果出现多次调用同一个任务,且每次操作的值不同时,就可能出现由于地址空间相互覆盖而导致的结果错误。针对这一问题,通常使用自动任务解决此问题。 最后,贴出本例的仿真波形图,如图 5 所示: 图 5 译码器和 task 任务块的功能仿真图  
  • 热度 17
    2015-8-19 13:59
    1071 次阅读|
    0 个评论
    转自:http://www.cnblogs.com/zhangjs8385/archive/2011/10/06/2200059.html public class Test7 { public static void main(String[] args) { int i=5; switch(i) { case 1: System.out.println("one"); case 10: System.out.println("ten"); case 5: System.out.println("five"); case 3: System.out.println("three"); default: System.out.println("other"); } } } è 结果是: five three other     switch(表达式) { case 常量表达式1:语句1; .... case 常量表达式2:语句2; default:语句; }     switch的用法是判断case后面的表达式和switch后面的表达式是否相匹配,一旦case匹配,就会顺序执行后面的程序代码,而不管后面的case是否匹配,直到遇见break。   如上所给的代码中,由于i等于5,和前面的两个case都不匹配,所以结果中并没有one和ten的。而第三个case中的5就和switch中i的值匹配,因此就会打印出five的,由于没有遇到break所以就会顺序执行很面的代码,打印出three和other   对于流程控制中的switch-case语句,一直是我的一个弱项.   每当考试或者面试笔试的时候,总是丈二和尚摸不着头脑,我想这应该是我基础太差的原因吧!   为了彻底解决这个心病,不得不花点功夫了!   首先从原理上来阐述这个问题: switch(表达式) { case 常量表达式1:语句1; .... case 常量表达式2:语句2; default:语句; } 1.default就是如果没有符合的case就执行它,default并不是必须的.   2.case后的语句可以不用大括号. case 后面必须是常量表达式constant expressions, 错误表示如: case x .   3.switch语句的判断条件可以接受int,byte,char,short, enum不能接受其他类型.   4.一旦case匹配,就会顺序执行后面的程序代码,而不管后面的case是否匹配,直到遇见break,利用这一特性可以让好几个case执行统一语句.   原理归原理,下面是几个容易混淆的例子.   1.标准型(case后面都有break语句)   int i=3; switch(i) { case 1: System.out.println(1); break; case 2: System.out.println(2); break; case 3: System.out.println(3); break; default: System.out.println("default"); break; }  
  • 热度 25
    2014-8-12 16:28
    1737 次阅读|
    1 个评论
            笔者是在看了特权同学玩转fpga入门视频之后,觉得不错,才拜读的他的《深入浅出玩转FPGA》这本书,在看到第31页对if..else和case语句进行分析时,觉得部分分析可能缺乏可比性,容易造成误解,斗胆在这里做一些讨论和补充。         该书中首先引用两段代码EX1和EX2说明if...else结构和case结构在verilog逻辑代码逻辑相同时,将导致RTL级视图不同,但最后映射资源利用和扇出却是相同的。        后来又举例两段读写控制代码,来说明case语句比if...else语句占用资源更少,但这两段代码其实没有可比性,或者说不应该像书中那样比较,因为容易导致误解。书中的两段代码如下:     第一段代码  EX3:   input clk;   input rst_n;   input close,wr,rd;   output db;     reg dbr;     always @(posedge clk or negedge rst_n)begin   if(!rst_n)begin          dbr=3'd0;   end   else begin          if(close)dbr=3'b111;          else if(rd)dbr=3'b101;          else if(wr)dbr=3'b011;          else dbr=3'd0;    end end assign db=dbr;   第二段代码EX4:  input clk;  input rst_n;  input close,wr,rd;  output db;    reg dbr;    always @(posedge clk or negedge rst_n)begin          if(!rst_n)begin                dbr=3'd0;          end         else begin                case({close,rd,wr})                3'b100:dbr=3'b111;                3'b010:dbr=3'b101;                3'b001:dbr=3'b011;               default:dbr=3'd0;              endcase        end end assign db=dbr;      书中直接对比以上两段代码的RTL视图,以及映射后的资源利用和扇出情况。但其实第二段代码,并没有将所有case列全,若想使两段代码逻辑一致,显然第二段代码需如下将所有case列出: case({close,rd,wr}) 3'b100:dbr=3'b111; 3'b110:dbr=3'b111; 3'b101:dbr=3'b111; 3'b111:dbr=3'b111; 3'b010:dbr=3'b101; 3'b011:dbr=3'b101; 3'b001:dbr=3'b011; default:dbr=3'd0; endcase         而如果第二段代码将所有case列出,则虽然RTL视图不同,但映射后的资源利用以及平均扇出其实仍是一致的。         很显然根据示例代码EX1~EX4,我们不难发现,在RTL级实现中,case语句一般是先经过译码器(decode),将所有可能的case情况译码出来,然后将最终输出相同的情况直接取或,而if-else结构的RTL级实现则与此不同,一般会采用选通器(MUX)互连的形式。         此外,最终映射优化的过程,其实类似于数字电路设计中的卡诺图优化,因此只要if...else和case的逻辑完整,其实映射后的资源利用和扇出应当是一致的,但是我们在设计中,往往有些信号或者说case情况其实是隐含不可能出现的,类似于数字电路中所说的约束项,例如上面的3'b110,3'b101,3'b111,3'b011这四种情况可能在实际中并不会出现,那么以上两段代码在功能上最终表现就会是相同的,但这隐含了以上四种情况实际上不会发生的约束。考虑到一般情况下,if...else结构较case结构可能隐含更多的约束项,因此可能导致更简化的最简逻辑表达式的产生,而一般逻辑表达式越简化,对细节的约束就越少,所使用的门也就相对要少,因而,一般所使用的逻辑资源也就少一些。        使用if...else结构,以及以上第二段完整的case语句结构,所产生的资源映射情况都将如该书中39页图2.7所示。      
相关资源
  • 所需E币: 1
    时间: 2022-3-30 18:16
    大小: 25.5KB
    上传者: Argent
    case在VHDL和Verilog中运用的注意点
  • 所需E币: 0
    时间: 2020-12-8 23:51
    大小: 180.11KB
    上传者: LGWU1995
    台湾树林公司变压器骨架Bobbin_TF-3532CASE
  • 所需E币: 0
    时间: 2020-11-12 09:15
    大小: 2.39MB
    上传者: xiaosh728
    NXP_UltraWideBandUWBUSECASEENABLEMENT
  • 所需E币: 0
    时间: 2020-9-6 00:33
    大小: 197.63KB
    上传者: wxlai1998
    台湾树林公司变压器骨架Bobbin_SMD-EFD20L-004CASE
  • 所需E币: 0
    时间: 2020-9-6 00:33
    大小: 189.36KB
    上传者: wxlai1998
    台湾树林公司变压器骨架Bobbin_SMD-EEL-19-013CASE
  • 所需E币: 0
    时间: 2020-9-6 18:50
    大小: 43.42KB
    上传者: czdian2005
    567NZMECHANICALCASEOUTLINEPACKAGEDIMENSIONS
  • 所需E币: 5
    时间: 2020-6-25 16:30
    大小: 269.22KB
    上传者: kaidi2003
    ONSEMI_MECHANICALCASEOUTLINEPACKAGEDIMENSIONS.PDF
  • 所需E币: 3
    时间: 2019-12-25 16:31
    大小: 7.91MB
    上传者: 238112554_qq
    轻松学用linux编程……
  • 所需E币: 5
    时间: 2019-12-25 16:26
    大小: 484.74KB
    上传者: wsu_w_hotmail.com
    此套FPGA视频教程由华清远见FPGA师资团队老师精心制作,非常适合FPGA初学者,是华清远见推出的第一期嵌入式公益活动资料集锦,共分7讲(包括视频以及PDF文档),推荐!!第1讲、FPGA设计基础(PDF、视频)第2讲、FPGA设计入门(视频、课后习题)第3讲、VerilogHDL基础(PDF、视频、课后习题)第4讲:VerilogHDL中的组合逻辑设计方法(PDF、视频)第5讲:ModelSim软件使用方法和技巧(视频)第6讲、Sopc硬件系统(视频)第7讲、sopc软件系统(视频)……
  • 所需E币: 3
    时间: 2019-12-24 23:28
    大小: 41.38KB
    上传者: 微风DS
    Abstract:Twocommonthermal-resistancevaluesmeasuredforICpackagesarejunctiontoambient(ThetaJA)andjunctiontocase(ThetaJC).Theseparametersareusefulforcalculatingmaximumpowerdissipationandself-heating,andforcomparingpackagetypes.ThetaJAandThetaJCvaluesarepresentedhereforselectMaximtemperaturesensorsand1-Wire®devices.Examplesforcalculatingthevaluesaregiven.PackageThermalResistanceValues(ThetaJA,ThetaJC)forTemperatureSensorsand1-WireDevicesNov16,2006Abstract:Twocommonthermal-resistancevaluesmeasuredforICpackagesarejunctiontoambient(ThetaJA)andjunctiontocase(ThetaJC).Theseparametersareusefulforcalculatingmaximumpowerdissipationandself-heating,andforcomparingpackagetypes.ThetaJAandThetaJCvaluesarepresentedhereforselectMaximtemperaturesensorsand1-Wiredevices.Examplesforcalculatingthevaluesaregiven.IntroductionManagingheatinelectronicsystemsiscrucialforensuringproductreliability.Integratedcircuits(ICs)exposedtohightemperaturescanfailormalfunctioninthefield,thusrequiringcostlyrepairorredesign.Typicalthermal-resistanceparametersgivet……
  • 所需E币: 4
    时间: 2019-12-24 14:52
    大小: 48.55KB
    上传者: 微风DS
    帖子《IfvsCase语句》http://forum.eepw.com.cn/thread/226689/1所介绍的源代码(工程文件),未包含stellaris固件库……
  • 所需E币: 3
    时间: 2019-12-24 17:06
    大小: 94.87KB
    上传者: 16245458_qq.com
    摘要:两种常见的IC封装热阻的测量值是结到环境(的ThetaJA)和结点到外壳(西塔赛马)。这些参数计算最大功耗和自发热,和封装类型比较有用的。选择Maxim的温度传感器和1-Wire®器件的ThetaJA和Theta赛马值这里介绍。计算值的例子。Maxim>DesignSupport>TechnicalDocuments>ApplicationNotes>1-WireDevices>APP3930Maxim>DesignSupport>TechnicalDocuments>ApplicationNotes>GeneralEngineeringTopics>APP3930Maxim>DesignSupport>TechnicalDocuments>ApplicationNotes>MeasurementCircuits>APP3930Keywords:ThetaJA,ThetaJC,theta-ja,theta-jc,selfheating,thermaldissipation,heatdissipation,powerdissipation,thermalresistance,junctiontocase,junctiontoambient,temperature,sensor,temperaturesensor,thermalNov16,2006APPLICATIONNOTE3930PackageThermalResistanceValues(ThetaJA,ThetaJC)forTemperatureSensorsand1-W……