实际上,FPGA无法完成你需要的模拟开关的功能,但是,可以通过FPGA的数字IO控制外部的模拟开关器件来做模拟选择功能。
// 假设PWM的频率为1k:T = 1/1k = 1ms;// 这个频率可以根据你自己的需要设定然后修改num和t的值即可,不过要注意将相关寄存器的位数做对应修改 // 将1ms再分为256个份,每一份:t = T/256 = 3.9us;// 以
理工实验,Verilog HDL写一个程序让白色LED渐亮渐灭,需要用到PWM,最后通过FPGA演示
用verilog编写LED循环显示控制电路(数字电子技术) 分不是问题 一、设计任务及原理:LED循环显示控制电路就是对于一组LED(16个),通过不同的工作模式可按照一定的规律来点亮或者熄灭。所要求的循环显示控制电路共分4个节拍,四个节拍按
//加计数器计数值在一个数码管上显示,k2(en)为低电平时停止加数,//k1(rst)为低电平时清0 显示的数在0-9之间 //2010-5-23 16:14:07 module shu_jingjia_10(clk,wei,shu,rst,en,led);input clk,rst,en;
output [7:0] sm_seg;//假设这里用的是8段数码管 reg [5:0] led_light;reg [7:0] sm_seg;reg [3:0] led;reg [2:0] led_count;always @ (posedge clk_100)begin if(led_count==5)led_count<=3'b0
就那那种丑丑的七个HEX display来说吧,你给他一个七位长的二级制,七位对应display上的七格,0就是亮,1就是不亮。(有的是反过来的)http://en.wikipedia.org/wiki/Seven-segment_display 拉倒下面看那个表啦 表里
seg7ment_sub这个模块根据输入进来的16进制,产生7bit的数码管信号,每bit对应一个LED数码管灯。1表示该灯管灭,0表示亮。比如,输入8,输出7‘b000_0000,即所有的灯都点亮。
分频显示就好了~ 也即让每个LED轮流点亮,这样在人眼看来即是四个LED常亮的。下面显示思路可以参考下。sm_bit_r 是位选相当于[3:0]an,sm_seg_r 段选相当于[6:0]a_to_g //数码管动态扫描显示部分,我板子上晶振
verilog数码管和led的问题!!!
用verilog编写LED循环显示控制电路(数字电子技术) 分不是问题 一、设计任务及原理:LED循环显示控制电路就是对于一组LED(16个),通过不同的工作模式可按照一定的规律来点亮或者熄灭。所要求的循环显示控制电路共分4个节拍,四个节拍按
// modelsim testbench // 有疑问,可联系我,百度hi不方便,可以Q module led_tb(clk,n_reset,led);output clk;output n_reset;output [7:0] led;reg clk;reg n_reset;led_ctrl led_inst(clk,n_res
module ledcon(clk,rst,led);input clk,rst;output [3:0] led; //高电平有效 reg [3:0] led_r; //led控制寄存器 reg [19:0] cnt; //计数器 always @(posedge clk or negedge rst)if(!rst)cnt<=2
always @ (posedge clk or negedge rst_n) begin if (rst_n == 1'b0)intv <= 2'b0;else intv <= intv[1:0] + 2'b01; // 假设输入时钟的周期是0.25s的做法 end always @ (posedge clk or negedge
light=3'b111;//LED灯全部点亮时,重新熄灭再准备下次循环 else light =light>>1;//LED灯右移 end else begin if
求Verilog语言编写的循环彩灯控制器
这样试试:一直按着manual_reset,然后随便输入一个数,接下来再松开manual_reset,再做你想做的动作应该就可以了。如果你把I2C时钟搞成一直存在的话,那i2ccount和I2C_data之间的关系就很难确定了,因为你一上电i2ccout就
一、设计任务及原理:LED循环显示控制电路就是对于一组LED(16个),通过不同的工作模式可按照一定的规律来点亮或者熄灭。所要求的循环显示控制电路共分4个节拍,四个节拍按照一定的顺 一、设计任务及原理:LED循环显示控制电路就是对于
//LED灯全部点亮时,重新熄灭再准备下次循环 else light =light>>1;//LED灯右移 end else begin if
5'b10000:从左到右每两个LED逐渐点亮 5'b01000:从右到左每两个LED逐渐点亮5'b00100:从左到右一个LED跳跃式点 5'b00010:从右到左一个LED跳跃式点亮 module led (input wireClock,input wireRESET_N,input wire
module leds(input button,input clk,output reg ctrl[2:0]);reg button_dly;wire button_vld;always@(posedge clk)button_dly <= button;assign button_vld = button & ~button_dly;always@(posedge clk)if(button_
按键低电平有效,led灯低电平时亮。按键按下亮,松开灭。程序较简单,为组合逻辑电路,没有按键防抖功能。\x0d\x0amodule led(led,key);\x0d\x0a \x0d\x0ainput key;\x0d\x0aoutput led;\x0d\x0are
如何用verilog实现一个开关控制LED灯。
buffer<=buffer+1'b1;这是一个阻塞式语句 一般用于时序逻辑中 有一个时钟的延时 该句等效于C语言的 buffer++;
//加计数器计数值在一个数码管上显示,k2(en)为低电平时停止加数,//k1(rst)为低电平时清0 显示的数在0-9之间 //2010-5-23 16:14:07 module shu_jingjia_10(clk,wei,shu,rst,en,led);input clk,rst,en;
assign LED5 = ~led_set[4];endmodule因为硬件平台不一样,需要你自己根据使用的硬件平台来更改代码。
light=3'b111; //LED灯全部点亮时,重新熄灭再准备下次循环 else light =light>>1; //LED灯右移 end else begin if (light ==3'b000) //LED灯全部点亮时,重新熄灭再准备下次循环 light =3'b111;else
用verilog编写LED循环显示控制电路(数字电子技术) 分不是问题....
所要求的循环显示控制电路共分4个节拍,四个节拍按照一定的顺序依次循环执行。二、具体要求:1、基本功能(参考图1)(1)系统上电后16个LED全点亮,S1为一复位按键((按下S1=0,松开S1=1)),对复位键按键操作后,系统从第一节拍开始执行
令clk为led流水灯(共计12个LED灯)的驱动时钟【要求低频,如1Hz】,rst为上升沿复位信号(异步)。则所实现的Verilog HDL代码部分如下:module led_run(clk,led,rst);input clk;//clk with low frequency like 1Hz input
output led_yellow,output led_bule );// 假设PWM的频率为1k:T = 1/1k = 1ms;// 这个频率可以根据你自己的需要设定然后修改num和t的值即可,不过要注意将相关寄存器的位数做对应修改 // 将1ms再分为256个份,每一
module leds(input button,input clk,output reg ctrl[2:0]);reg button_dly;wire button_vld;always@(posedge clk)button_dly <= button;assign button_vld = button & ~button_dly;always@(posedge clk)if(button_
按键低电平有效,led灯低电平时亮。按键按下亮,松开灭。程序较简单,为组合逻辑电路,没有按键防抖功能。module led(led,key);input key;output led;reg led_out;always@(key)if(!key)led_out=1'b0;else led_
按键低电平有效,led灯低电平时亮。按键按下亮,松开灭。程序较简单,为组合逻辑电路,没有按键防抖功能。\x0d\x0amodule led(led,key);\x0d\x0a \x0d\x0ainput key;\x0d\x0aoutput led;\x0d\x0are
verilog hdl 一个按键控制一个LED亮?
module clk_div(clk,out1,out2); input clk; output out1,out2; reg out1,out2; reg [31:0]cnt1,cnt2; always @(posedge clk)begin//50MHz分频计数 if(cnt1<32'd24999999) cnt1 <=cnt1 + 32'd1; else cnt1 <=32'd0; end always @(posedge clk)//分频后的半周期反转 if(cnt1 == 0) out1<=~out1; always @(posedge clk)begin//5MHz分频计数 if(cnt2<32'd4999999) cnt2 <=cnt2 + 32'd1; else cnt2 <=32'd0; end always @(posedge clk)//20%占空比 if(cnt2 == 32'd999999) out2<=0; else if(cnt2 == 32'd4999999) out2<=1; endmodulealways@(posedge clk1s or negedge rstn_i) //时钟1s begin if(!rstn_i)begin cnt100 <= 7'd0; end else begin cnt100 <= (cnt_en && ~|cnt)? 7'd99 : // cnt_en为倒计时开始标志 ~|cnt? 7'd0 : cnt - 1'b1; //倒计时到0 自动停止 end end wire [3:0] cnt10 = (cnt100 <= 9)? cnt100[3:0] : 4'b0 ; //10s 倒计时
按键低电平有效,led灯低电平时亮。按键按下亮,松开灭。程序较简单,为组合逻辑电路,没有按键防抖功能。 module led(led,key); input key; output led; reg led_out; always@(key) if(!key) led_out=1'b0; else led_out=1'b1; assign led=led_out; endmodule
可以看看verilog语法书,具体代码如下: always @ (posedge clk) begin if(SW)//SW是一个开关,分配一个开关引脚 light<=1; //输出高电平,灯点亮 else light<=0;输出低电平,灯灭 end 这是一个非常简单的程序,如果你看过一边语法书后这样的都不会写,那你可以不要做fpga了。
// test10.v module light1(clock,key,style,light); input clock,key,style ; //端口定义 output [2:0]light; reg [2:0] light =3'b111 ; reg clk = 1; parameter cnt = 24000000; reg [24:0]count; always @ (posedge clock) //分频计数 begin if (count < cnt) count = count + 25'b1; else begin count = 0; clk = ~ clk; end end always @ (posedge clk) //LED灯输出 begin if (!key) //key键被按下 light = light; //暂停 else begin if (!style) //style被按下 begin if (light==0) light=3'b111; //LED灯全部点亮时,重新熄灭再准备下次循环 else light =light>>1; //LED灯右移 end else begin if (light ==3'b000) //LED灯全部点亮时,重新熄灭再准备下次循环 light =3'b111; else light = light<<1; //LED灯左移 end end end endmodule 这个程序我已经在Actel板上烧过了,没问题。如果还有什么问题应该是你的板不同或者工具不同,我是在libero_8.5上做的
我做了下 但是没有编译 中间LED输出的逻辑还有点没做完 明天继续做吧 module LIGHT_CTRL( clk , //sys clk 24mhz rst_n , //n_reset rst , //rst key spd_set , //speed set led_out , //LED output state_out //STATE output ); //Input PIN input clk ; //sys clk 24mhz input rst_n ; //n_reset input rst ; //rst key input [1:0] spd_set ; //speed set //00:very fast 500 ms //01: fast 1 s //10: slow 2 s //11:very slow 4 s //Output PIN output [7:0] led_out ; //LED output LED7~LED0 output [1:0] state_out ; //STATE output //00:S0 //01:S1 //10:S2 //11:S3 //Register And Wire //500ms pulse wire n_500ms_pls ; reg [31:0] r_cnt ; //spd latch reg [1:0] r_spd_set ; //sec cnt wire n_led_inc ; reg [1:0] r_sec_cnt ; //ctrl level wire n_rst_pls ; reg r_rst ; reg r_sys_on ; //led cnt reg [3:0] r_led_cnt ; //light ctrl state wire n_state_end ; reg [1:0] r_state ; //led output wire [7:0] n_led ; reg [7:0] led_out ; reg [1:0] state_out ; //***RTL*** //500ms pulse assign n_500ms_pls = (r_cnt == 32'h00B7_1AFF)? 1'b1 : 1'b0; //when cnt=11999999,500ms pulse always @(posedge clk or negedge rst_n) begin if (~rst_n) begin r_cnt <= 32'h0000_0000; end else begin if(r_sys_on == 1'b1) if(n_500ms_pls == 1'b1) r_cnt <= 32'h0000_0000; else r_cnt <= r_cnt + 1'b1; else r_cnt <= 32'h0000_0000; end end //spd latch always @(posedge clk or negedge rst_n) begin if (~rst_n) begin r_spd_set <= 2'b10; end else begin if(n_rst_pls == 1'b1) r_spd_set <= 2'b10; else if((n_led_inc == 1'b1) && (n_state_end == 1'b1)) r_spd_set <= spd_set; else r_spd_set <= r_spd_set; end end //sec cnt assign n_led_inc = (n_500ms_pls == 1'b0) ? 1'b0 : (r_sec_cnt == r_spd_set) ? 1'b1 : 1'b0; always @(posedge clk or negedge rst_n) begin if (~rst_n) begin r_sec_cnt <= 2'b00; end else begin if(r_sys_on == 1'b1) if(n_500ms_pls == 1'b1) if(r_sec_cnt == r_spd_set) r_sec_cnt <= 2'b00; else r_sec_cnt <= r_sec_cnt + 1'b1; else r_sec_cnt <= r_sec_cnt; else r_sec_cnt <= 2'b00; end end //ctrl level assign n_rst_pls = rst & ~r_rst; always @(posedge clk or negedge rst_n) begin if (~rst_n) begin r_rst <= 1'b0; end else begin r_rst <= rst; end end always @(posedge clk or negedge rst_n) begin if (~rst_n) begin r_sys_on <= 1'b0; end else begin if(n_rst_pls == 1'b1) r_sys_on <= ~r_sys_on; else r_sys_on <= r_sys_on; end end //led cnt always @(posedge clk or negedge rst_n) begin if (~rst_n) begin r_led_cnt <= 4'h0; end else begin if(r_sys_on == 1'b1) if(n_led_inc == 1'b1) if(n_state_end == 1'b1) r_led_cnt <= 4'h0; else r_led_cnt <= r_led_cnt + 1'b0; else r_led_cnt <= r_led_cnt; else r_led_cnt <= 4'h0; end end //light ctrl state assign n_state_end = ((r_state[1:0] == 2'b00) && (r_led_cnt == 4'b1000)) & ((r_state[1:0] == 2'b01) && (r_led_cnt == 4'b1000)) & ((r_state[1:0] == 2'b10) && (r_led_cnt == 4'b0100)) & ((r_state[1:0] == 2'b11) && (r_led_cnt == 4'b0100)) ; always @(posedge clk or negedge rst_n) begin if (~rst_n) begin r_state <= 2'b00; end else begin if(r_sys_on == 1'b1) if(n_led_inc == 1'b1) if(n_state_end == 1'b1) r_state <= r_state + 1'b1; else r_state <= r_state; else r_state <= r_state; else r_state <= 2'b00; end end //led output assign n_led[7] = ((r_state[1:0] == 2'b00) && (r_led_cnt[3] | r_led_cnt[2] | r_led_cnt[1] | r_led_cnt[0] )) || //OXXX_XXXX ((r_state[1:0] == 2'b01) && (r_led_cnt[3] )) || //O..._.... ((r_state[1:0] == 2'b10) && ( r_led_cnt[2] | r_led_cnt[1] | r_led_cnt[0] )) || //OXXX_XXXO ((r_state[1:0] == 2'b11) && ( r_led_cnt[2] )) || //O..._...O assign n_led[6] = ((r_state[1:0] == 2'b00) && (r_led_cnt[3] | r_led_cnt[2] | r_led_cnt[1] )) || //.OXX_XXXX ((r_state[1:0] == 2'b01) && (r_led_cnt[3] | (r_led_cnt[2] & r_led_cnt[1] & r_led_cnt[0]))) || //XO.._.... ((r_state[1:0] == 2'b10) && ( r_led_cnt[2] | r_led_cnt[1] )) || //.OXX_XXO. ((r_state[1:0] == 2'b11) && ( r_led_cnt[2] | (r_led_cnt[1] & r_led_cnt[0]))) || //XO.._..OX assign n_led[5] = ((r_state[1:0] == 2'b00) && (r_led_cnt[3] | r_led_cnt[2] | (r_led_cnt[1] & r_led_cnt[0]))) || //..OX_XXXX ((r_state[1:0] == 2'b01) && (r_led_cnt[3] | (r_led_cnt[2] & r_led_cnt[1] ))) || //XXO._.... ((r_state[1:0] == 2'b10) && ( r_led_cnt[2] | (r_led_cnt[1] & r_led_cnt[0]))) || //..OX_XO.. ((r_state[1:0] == 2'b11) && ( r_led_cnt[2] | r_led_cnt[1] )) || //XXO._.OXX assign n_led[4] = ((r_state[1:0] == 2'b00) && (r_led_cnt[3] | r_led_cnt[2] | (r_led_cnt[1] & r_led_cnt[0]))) || //..OX_XXXX ((r_state[1:0] == 2'b01) && (r_led_cnt[3] | (r_led_cnt[2] & r_led_cnt[1] ))) || //XXO._.... ((r_state[1:0] == 2'b10) && ( r_led_cnt[2] | (r_led_cnt[1] & r_led_cnt[0]))) || //..OX_XO.. ((r_state[1:0] == 2'b11) && ( r_led_cnt[2] | r_led_cnt[1] )) || //XXO._.OXX ........................ //light blink ctrl //0:Off;1:On; always @(posedge clk or negedge rst_n) begin if (~rst_n) begin led_out <= 8'b0000_0000; state_out <= 2'b00; end else begin led_out <= n_led; state_out <= r_state; end end endmodule
就那那种丑丑的七个HEX display来说吧,你给他一个七位长的二级制,七位对应display上的七格,0就是亮,1就是不亮。(有的是反过来的) http://en.wikipedia.org/wiki/Seven-segment_display 拉倒下面看那个表啦 表里的abcdefg对应的是七个segment code如下 module SevenSegmentDisplayDecoder(ssOut, nIn); output reg [6:0] ssOut; input [3:0] nIn; // ssOut format {g, f, e, d, c, b, a} always @(nIn) case (nIn) 4'h0: ssOut = 7'b0111111; 4'h1: ssOut = 7'b0000110; 4'h2: ssOut = 7'b1011011; 4'h3: ssOut = 7'b1001111; 4'h4: ssOut = 7'b1100110; 4'h5: ssOut = 7'b1101101; 4'h6: ssOut = 7'b1111101; 4'h7: ssOut = 7'b0000111; 4'h8: ssOut = 7'b1111111; 4'h9: ssOut = 7'b1100111; 4'hA: ssOut = 7'b1110111; 4'hB: ssOut = 7'b1111100; 4'hC: ssOut = 7'b0111001; 4'hD: ssOut = 7'b1011110; 4'hE: ssOut = 7'b1111001; 4'hF: ssOut = 7'b1110001; default: ssOut = 7'b1001001; endcase endmodule
明显是组合逻辑,时序逻辑的输出不但与输入有关,还和系统上一个状态有关,而你的输出只由输入的num决定,num变化进入case语句执行。 至于“<=”和“=”,这是非阻塞赋值和阻塞赋值,二者在case语句里没有什么区别,因为case中只执行一句就会跳出。阻塞赋值在每句执行完后立刻赋值,而非阻塞赋值是在块语句跳出时完成赋值。这是二者的本质区别。
计算机语言从低级到高级可以分为: 机器语言,即由0、1组成的机器硬件可以识别的语言; 低级语言,即汇编语言 中级语言,如C语言 高级语言,如C++,JAVA,C#等。 汇编语言是将由0、1组成的机器语言用具有简单语义的英文代码表示,以便于理解和程序员编程。汇编语言通常用于对硬件的直接操控。由于汇编语言编写的程序很小,所以通常在程序中最核心的、控制硬件的代码可以采用汇编语言编写,一方面是安全,另一方面提高运行速度。 对于计算机的初学者,应该从中高级语言学起,如c语言,vb,java等,如果你是想要学习如何编程,学习一到两门高级语言已经够用了。 如果你已经掌握了基本的编程技能,最好是可以学习数据结构和操作系统以及计算机硬件的基本工作原理,以便优化你编写的程序,提高安全性和运行效率。 如果你想要从事更高级的开发工作,则可能需要学习汇编语言。 在高校中,计算机科技专业的学生汇编语言是必修课,而软件工程专业的学生则对汇编语言不做要求。 至于汇编与编程的区别是显而易见的,汇编语言是一种用于编写某些程序的语言。而编程则是程序员用某种语言编写程序的过程。 查看原帖>>