首页 > 其他分享 >基于温度检测工程:ascii_2_hex 练习

基于温度检测工程:ascii_2_hex 练习

时间:2022-08-20 18:27:03浏览次数:121  
标签:din dout clk 练习 hex vld num rst ascii

因工作关系,中间隔好久没写代码,感觉有点生疏了。看来还是得多写写才行!!

当串口输入的是ascii值时 ,FPGA内部收到的数据需将ascii转为十六进制。

 在0~9、 A~F、a~f 范围内是有效数据,并对进行转换,其他值都无效,dout输出为0

 

 

 模块代码:

 1 module  ascii_2_hex(
 2                         clk     ,
 3                         rst_n   ,
 4                         din     ,
 5                         din_vld ,
 6                         dout    ,
 7                         dout_vld
 8 );
 9 
10 input           clk             ;
11 input           rst_n           ;
12 input[8-1:0]    din             ;
13 input           din_vld         ;
14 
15 output[8-1:0]   dout            ;
16 output          dout_vld        ;
17 
18 reg[8-1:0]      dout            ;
19 reg             dout_vld        ;
20 
21 wire            num_0_9         ;
22 wire            num_A_F         ;       //定义变量中是区分大小写的
23 wire            num_a_f         ;       //定义变量中是区分大小写的
24 
25 assign num_0_9          = din >= 8'd48 && din < 8'd58   ;
26 assign num_A_F          = din >= 8'd65 && din < 8'd71   ;
27 assign num_a_f          = din >= 8'd97 && din < 8'd103  ;
28 
29 always @(posedge clk or negedge rst_n)begin
30     if(!rst_n)begin
31         dout <= 0;
32     end
33     else if(num_0_9)begin
34         dout <= din - 8'd48;      //输入0~9
35     end
36     else if(num_A_F)begin
37         dout <= din - 8'd55;    //输入A~F
38     end
39     else if(num_a_f)begin
40         dout <= din - 8'd87;    //输入a~f
41     end
42     else begin
43         dout <= 0;
44     end
45 end
46 
47 always @(posedge clk or negedge rst_n)begin
48     if(!rst_n)begin
49         dout_vld <= 1'b0;
50     end
51     else if(din_vld && (num_0_9 || num_A_F || num_a_f))begin  //输入数据有效时,同时加上是否在0~9 ,A~F, a~f的范围内
52         dout_vld <= 1'b1;   //只保留一个时钟周期
53     end
54     else begin
55         dout_vld <= 1'b0;
56     end
57 end
58 
59 endmodule

仿真代码:

 1 `timescale  1ns/100ps        //时间精确到1位小数点
 2 
 3 module test_sim;
 4 
 5 reg             clk             ;
 6 reg             rst_n           ;
 7 reg[8-1:0]      din             ;
 8 reg             din_vld         ;
 9 
10 wire[8-1:0]     dout            ;
11 wire            dout_vld        ;
12 
13 parameter       CLK_CYCLE   = 20;   //时钟50M
14 
15 initial begin
16     clk = 0;
17     forever begin
18         #(CLK_CYCLE/2);
19         clk = ~clk;
20     end
21 end
22 
23 initial begin
24         rst_n = 1;
25         #1;
26         rst_n = 0;
27         #(CLK_CYCLE*2);
28         rst_n = 1;
29 end
30 
31 integer i; //默认位宽是32位
32 
33 initial begin
34         #1;
35         din = 0;
36         din_vld = 0;
37         #(CLK_CYCLE*3);
38 
39         for(i=0; i<200; i=i+1)begin
40             din = 8'd45 + i;
41             din_vld <= 1;
42             #(CLK_CYCLE);
43             din_vld <= 0;
44             #(CLK_CYCLE);
45         end
46 
47         din = 0;
48         din_vld = 0;
49 end
50 
51 ascii_2_hex     ascii_2_hex_inist(
52                                     .clk        (clk        ),
53                                     .rst_n      (rst_n      ),
54                                     
55                                     .din        (din        ),
56                                     .din_vld    (din_vld    ),
57                                     
58                                     .dout       (dout       ),
59                                     .dout_vld   (dout_vld   )
60 );
61 
62 endmodule

仿真波形:

 

 

总结:

1、定义的变量中,区分大小写的,一开始还值得怀疑,语法这块还不是很扎实,如下写法是对的,

 

尽量保持规范,以后尽量统一用小写字母表示,如下,理解字母意思就可以了

 

 

 

2、测试文件多写多练,否则很容易忘记,甚至不熟悉,可能单词都不能快速的写出来

 

标签:din,dout,clk,练习,hex,vld,num,rst,ascii
From: https://www.cnblogs.com/wen2376/p/16608320.html

相关文章

  • 脚本练习
    40个简单而有效的Shell脚本,想不起来的时候一看就懂(下)Cloud研习社 2022-06-2713:38 发表于山东收录于合集#实战经验33个#shell脚本6个#linux50个#IT23个......
  • pikachu file include——文件包含靶场练习
    文件包含本质就是代码注入,原理:注入一段用户能够控制的脚本或代码,让服务器端执行。1.本地文件包含漏洞——能够打开并包含本地文件的漏洞测试pikachu文件包含靶场:①随机......
  • C++primer练习16.1-14
    练习16.1::实例化就是模板通过实际调用而确定类型及其运算,抽象到具体练习16.2template<typenameT>intcompare(constT&v1,constT&v2){if(v1<v2)return-1;......
  • NXP GUI-Guider,lvgl的好伴侣 拖曳式设计并自动生成代码,而且还可以当模拟器练习代码,
    GUIGuider是恩智浦提供的用户友好型图形用户界面开发工具,可通过开源LVGL图形库快速开发高品质的显示。GUIGuider的拖放编辑器可以轻松利用LVGL的众多特性,如小部件、动画......
  • C++primer练习15.15-33
    练习15.15重新定义Bulk_quoteclassDisc_quote:publicQuote{public:Disc_quote()=default;Disc_quote(conststd::string&book,doublep......
  • 练习9:尾递归优化
    尾递归和普通递归有啥区别尾调用,是指函数内部的最后一个动作是函数调用。该调用的返回值,直接返回给函数。举个例子://尾调用functionf(x){returng(x);}//非......
  • 练习10:打乱一个数组
    这种解法有问题!![12,4,16,3].sort(function(){return5-Math.random();});v8在处理sort方法时,使用了插入排序和快排两种方案。当目标数组长度小于10时,使用......
  • 练习2:Object.prototype.toString()
    对于Object.prototype.toString()方法,会返回一个形如"[objectXXX]"的字符串。如果对象的toString方法没有被重写,就会返回如上面形式的字符串。({}).toString();......
  • 练习3:深浅拷贝实现
    Object.assign原理及其实现MDN:主要是将所有可枚举属性的值从一个或多个源对象复制到目标对象,同时返回目标对象。//第一步leta={name:"advanced",ag......
  • 练习6:节流和防抖实现
    节流函数节流指的是某个函数在一定时间间隔内(例如3秒)只执行一次,在这3秒内无视后来产生的函数调用请求,也不会延长时间间隔。3秒间隔结束后第一次遇到新的函数调用会......